Понедельник, Май 25, 2020

Бегущие огни с использованием прерывания от таймера PIC ASM

;Схема и задача таже.Будем использовать модуль 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                  ДАЛЬШЕ


Back to Top