펌웨어디자인(Firmware Design)

마이컴으로 제작하는 타이머

arirangled 2009. 9. 20. 16:09

  

1시간에서 15시간까지 타이머설정이 가능합니다.

스타트 스위치를 on하면 회로에 전기가 통전됩니다.
회로에서는PIC16F84의 프로그램에 따라 RB0~RB7포트를 출력단자로 RA0~RA3포트를 입력단자로 설정하고

 

곧바로 트랜지스터를 on시킵니다.

트랜지스터가 on하면 릴레이가 on하고 ac아웃렛이 통전되고 달음에RA0~RA3포트에 접촉된 디지털스위치의

정보를 레지스터로 이동합니다.

 

후에는 루우프타이머프로그램에 따라 설정된시간이 되면 트랜지스터가 OFF하고 자기유지의 해제와 AC아웃렛의

통전을 단절합니다.회로에 있는 강제OFF스위치는 릴레이를 구동할 트랜지스터를 OFF시켜 강제로 자기유지를

해제시키는 스위치입니다.

 

 

다이오드브릿지:W02로 정류후에 1KΩ저항이 접속되어 무하지만 접속되어 쓸데없는 생각이 듭니다만 이것은

강제OFF스위치로 해 릴레이를 OFF하고 자기유지를 해제 후에 평활콘덴서: 470μF의 전하를 재빠르게 방전시

 

 

키기 위해서 입니다.

재빠르게 방전하지 않습니다와 PIC16F84가 당분간 동작 상태가 되고 있기 때문에 강제 OFF 스윗치를 해제해도 
재차 릴레이가 on 해 버릴 우려가 있습니다. 

소스파일은 timer.asm 대로 입니다. 처음 PIC를 사용하는 분에도 알기 쉽게 코멘트를 많이 써 두었기 때문에,
대략적으로 이해한 다음 제작하면 좋을 것입니다. 
매우 간단한 프로그램이므로 처음하는 분도 곧 바로 이해할 수 있다고 생각합니다. 
PIC를 잘 다루고 있는 분은  물론 부족할 것입니다. 이 프로그램에서는 개개인의 습관이 있어
더 효율적인 좋은 방법도 있을 것입니다. 프로그램에는 일부 MPLAB의 매크로 명령을 사용하고 있습니다. 
덧붙여 디지털 스윗치를「0」(타이머: 0시간)으로 설정하면 상시 on 이 되도록 프로그램 해 두었습니다. 
또, 타이머 동작시는 0.5초 마다 LED를 점멸시키고 있습니다. 
주의)컨피그레이션으로 워치 도크 타이머는 무효로 해 써 주세요.。
;*************************Timer Project*************************************************

;timer.pro...

;by_y.ishizuka

;Modified by naryseo 2009.09.20(Sun)

        LIST        P=PIC16F84
        INCLUDE     "P16F84.INC"
;변수설정************************************************************************
CNT1        EQU         0CH
CNT2        EQU         0DH
CNT3        EQU         0EH
CNT4        EQU         0FH
CNT5        EQU         10H
SETT        EQU         11H
;리셋**************************************************************************

            ORG         0               ;리셋
;초기설정**************************************************************************
            CLRF        PORTB           ;PORT-B를 전부0
            BSF         STATUS,RP0      ;뱅크1
            CLRF        TRISB           ;PORT-B를 전부 출력으로 설정
            MOVLW       H'000F'         ;00001111
            MOVWF       TRISA           ;PORT RA0에서 RA3을 입력으로 설정
            BCF         STATUS,RP0      ;뱅크0으로
            MOVLW       H'00EF'         ;11101111(RB4이외를 모두High레벨)
            MOVWF       PORTB           ;POTR-B에서 출력
;스위치의 확인********************************************************************
            COMF        PORTA,W         ;PORT-A의 정보를 반전해서 W레지스터로
            ANDLW       H'000F'         ;bit0-3의 필터
            MOVWF       SETT            ;SETT레지스터에 격납
            MOVF        SETT            ;Z플래그를 변화
            BZ          LOOP            ;0으로 있으면 라벨LOOP, 0 이외로 있으면 다음 행으로
            CALL        LOOPSET         ;라벨LOOPSET
            MOVLW       H'0000'         ;00000000
            MOVWF       PORTB           ;PORT-B를 전부LOW레벨로
            GOTO        LOOP            ;라벨LOOP
;무한루프************************************************************************
 LOOP        GOTO        LOOP            ;무한루프
;0.5초타이머***********************************************************************
TIME500     MOVLW       H'0014'         ;14h
            MOVWF       CNT3            ;CNT3레지스터로이동
LOOP3       MOVLW       H'00F7'         ;F7h
            MOVWF       CNT4            ;CNT4레지스터로 이동
            NOP                         ;아무것도 안함(시간의 미조정)
            NOP                         ;아무것도 안함(시간의 미조정)
            NOP                         ;아무것도 안함(시간의 미조정)
LOOP4       MOVLW       H'0053'         ;53h
            MOVWF       CNT5            ;CNT5레지스터로 이동
LOOP5       DECFSZ      CNT5,F          ;CNT5에서1을 빼서 0이라면 다음 명령스킵
            GOTO        LOOP5           ;라벨LOOP5
            DECFSZ      CNT4,F          ;CNT4에서1을 빼서 0이라면 다음 명령스킵
            GOTO        LOOP4           ;라벨LOOP4
            DECFSZ      CNT3,F          ;CNT3에서1을 빼서 0이라면 다음 명령스킵
            GOTO        LOOP3           ;라벨LOOP3
            RETURN                      ;원래로 돌아간다
;0.5초마다LED점멸(1초타이머)*****************************************************
LED         CALL        TIME500         ;라벨TIME500(0.5초타이머)
            MOVLW       H'00FF'         ;11111111
            MOVWF       PORTB           ;PORT-B를 전부HIGH레벨로
            CALL        TIME500         ;라벨TIME500(0.5초타이머)으로
            MOVLW       H'00EF'         ;11101111
            MOVWF       PORTB           ;RB4LOW레벨로
            RETURN                      ;원래로 돌아간다.
;1분타이머*************************************************************************
TIME2       MOVLW       H'003C'         ;003Ch(60)
            MOVWF       CNT2            ;CNT2레지스터로 이동
LOOP2       CALL        LED             ;라벨LED
            DECFSZ      CNT2,F          ;CNT2에서1을 빼서0이면 다음명령스킵
            GOTO        LOOP2           ;라벨LOOP2
            RETURN                      ;원래로돌아간다
;1시간타이머***********************************************************************
TIME1       MOVLW       H'003C'         ;003Ch(60)
            MOVWF       CNT1            ;CNT1레지스터이동
LOOP1       CALL        TIME2           ;라벨TIME2(1분타이머)
            DECFSZ      CNT1,F          ;CNT1에서1을 빼서 0이면 다음 명령 스킵
            GOTO        LOOP1           ;라벨LOOP1으로
            RETURN                      ;원래로돌아감
;설정시간카운트****************************************************************
LOOPSET     CALL        TIME1           ;라벨TIME1(1시간타이며)
            DECFSZ      SETT,F          ;SETT에서1을 빼서 0이면 다음 명령스킵
            GOTO        LOOPSET         ;라벨LOOPSET
            RETURN                      ;원래로돌아간다.
            END                          ;프로그램종료
 
timer.asm : 소스파일
 프로그램 써넣기에서 설정이 중요하다. 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

동영상을 찍어보았습니다.

 

 

 

 

 

 

크리스탈은 10MHz이나 없어 11.0592MHz로 대치함 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'펌웨어디자인(Firmware Design)' 카테고리의 다른 글

mp3플레이어만들기  (0) 2009.09.20
LC메터  (0) 2009.09.20
PIC마이컴  (0) 2009.09.18
적외선통신  (0) 2009.07.19
AVR로터리엔코더볼륨  (0) 2008.12.09