;Схема и задача таже.Будем использовать модуль CCP и Timer1 для генерации прерывания при совпадении значения таймера в регистрах TMR1L и TMR1H со значениями регистров CCP1L и CCP1H модуля CCP.Но сначала не будем забивать код.Нам важно понять принцип работы прерывания.В первом листенге будем зажигать один светодиод в полсекунды-это максимум на 4МГц.В конфигурации у нас включен внутренний осицилятор,т.е. нам не нужно на реальном устройстве включать кварцевый резонатор.На этой конфигурации он встроенный на 4Мгц.
LIST P=16F628A
INCLUDE P16F628A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
ERRORLEVEL -302
CBLOCK 20H
W_TEMP ;Временные переменные
STATUS_TEMP ;для сохранения SFR.
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
ORG 0
GOTO START
ORG 4
GOTO ISR
START MOVLW 7
MOVWF CMCON
BANK1
BSF TRISA,0
MOVLW 0
MOVWF TRISB
BSF PIE1,CCP1IE ;1.Разрешаем прерывание от CCP.
BANK0
MOVLW B'00110001' ;2.Таймер1-предделитель 1\8,таймер влючен.
MOVWF T1CON
MOVLW B'00001011' ;3.Модуль CCP-специальное событие при совпадении:
MOVWF CCP1CON ;установка бита CCP1IF,CCP1 сбрасывает TMR1
MOVLW .255 ;4.Закидываем два байта в модуль сравнения.
MOVWF CCPR1L
MOVLW .255
MOVWF CCPR1H
BCF PIR1,CCP1IF ;5.Скинем на всякий случай флаг прерывания от CCP.
BSF INTCON,PEIE ;6.Разрешение прерывания от переферийных устройств.
BSF INTCON,GIE ;7.Разрешения от всех прерываний.
CLRF TMR1L
CLRF TMR1H
CLRF PORTB
MAIN
GOTO MAIN
ISR MOVWF W_TEMP ;Сохраним ргистр WREG
SWAPF STATUS,W ;Сохраним Status с переворотом,
BCF STATUS,RP0 ;т.к SWAP не действует на флаги.
MOVWF STATUS_TEMP
BTFSS PIR1,CCP1IF ;Проверяем-прерывание от модуля CCP?
GOTO EXIT_ISR
BCF PIR1,CCP1IF ;Да.Скинем бит,иначе не выйдем из ISR.
MOVLW 1 ;В W 0000 0001
XORWF PORTB,F ;Всё время переворачиваем нулевой бит в порте Б.
EXIT_ISR
SWAPF STATUS_TEMP,W ;Востанавливаем все значащие регистры.
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE ;Выход по стеку туда откуда пришли в прерывание.
END
;Закинем программу бегущих огней в подпрограмму прерывания.
LIST P=16F628A
INCLUDE P16F628A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
ERRORLEVEL -302
CBLOCK 20H
RAB
W_TEMP
STATUS_TEMP
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
ORG 0
GOTO START
ORG 4
GOTO ISR
START MOVLW 7
MOVWF CMCON
BANK1
BSF TRISA,0
MOVLW 0
MOVWF TRISB
BSF PIE1,CCP1IE
BANK0
MOVLW B'00110001'
MOVWF T1CON
MOVLW B'00001011'
MOVWF CCP1CON
MOVLW .0
MOVWF CCPR1L
MOVLW .55
MOVWF CCPR1H
BCF PIR1,CCP1IF
BSF INTCON,PEIE
BSF INTCON,GIE
CLRF TMR1L
CLRF TMR1H
CLRF PORTB
MOVLW B'10000000'
MOVWF RAB
MAIN
GOTO MAIN
ISR MOVWF W_TEMP
SWAPF STATUS,W
BCF STATUS,RP0
MOVWF STATUS_TEMP
BTFSS PIR1,CCP1IF
GOTO EXIT_ISR
BCF PIR1,CCP1IF
BTFSS PORTA,0
GOTO LEFT
RIGHT MOVF RAB,W
MOVWF PORTB
BCF STATUS,C
RRF RAB,F
BTFSC STATUS,C
GOTO RINIT
GOTO EXIT_ISR
RINIT MOVLW B'10000000'
MOVWF RAB
GOTO EXIT_ISR
LEFT MOVF RAB,W
MOVWF PORTB
BCF STATUS,C
RLF RAB,F
BTFSC STATUS,C
GOTO LINIT
GOTO EXIT_ISR
LINIT MOVLW B'00000001'
MOVWF RAB
EXIT_ISR
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
END
НАЗАД Assembler AVR Си AVR ДАЛЬШЕ