Суббота, Май 30, 2020

Семь нот с использованием прерывания PIC ASM

;Зaдача прежняя только добавим есчо одну кнопку чтобы была отктава.Будем использовать режим 1011 ССР1,при котором будет формироваться прерывание.Всё это есть в даташите.            
            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
            COUNT
            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
            BCF         TRISB,3
            MOVLW       B'11111111'
            MOVWF       TRISA
            BANK0
;сбрасываем биты прерывания и регистр таймер1            
INT_STOP    BCF         INTCON,GIE
            BCF         INTCON,PEIE
            CLRF        T1CON
            BANK1       
            BCF         PIE1,CCP1IE ;этот регистр находится в банке1
            BANK0     
;проверка кнопок                  
MAIN        CLRF        COUNT
            MOVF        PORTA,W
            MOVWF       TEMP
TEST        RRF         TEMP,F
            BTFSS       STATUS,C
            GOTO        INIT_CCP1   ;идем сюда,если какая нибудь из кнопок нажата
            INCF        COUNT,F
            MOVLW       8
            SUBWF       COUNT,W
            BTFSS       STATUS,Z
            GOTO        TEST
            GOTO        MAIN
;инициализация модуля CCP1,TIMER1 и прерываний            
INIT_CCP1   RLF         COUNT,F
            MOVF        COUNT,W
            CALL        TABLE
            MOVWF       CCPR1L
            INCF        COUNT,F
            MOVF        COUNT,W
            CALL        TABLE
            MOVWF       CCPR1H
            MOVLW       B'00100001'
            MOVWF       T1CON
            MOVLW       B'00001011'
            MOVWF       CCP1CON
            BANK1       
            BSF         PIE1,CCP1IE
            BANK0
            BSF         INTCON,PEIE
            BSF         INTCON,GIE
;проверка кнопок           
TEST1       CLRF        COUNT
            MOVF        PORTA,W
            MOVWF       TEST
LOOP        RRF         TEST,F
            BTFSS       STATUS,C
            GOTO        TEST1
            INCF        COUNT,F
            MOVLW       8
            SUBWF       COUNT,W
            BTFSS       STATUS,Z
            GOTO        LOOP
            GOTO        INT_STOP   ;выходим если кнопки отпущены
;процедура прерывания.Сюда будем попадать при совпадении CCPR1 и TMR1
ISR         MOVWF       W_TEMP     ;сохраняем рабочий регистр
            SWAPF       STATUS,W   ;сохраняем Status регистр
            MOVWF       STATUS_TEMP
                
            BTFSS       PIR1,CCP1IF;прерывание от совпадения?
            GOTO        EXIT_ISR   ;нет,выходим из процедуры прерывания
            BCF         PIR1,CCP1IF;да,сбрасываем флаг прерывания от CCP1
            BTFSS       PORTB,3    ;на ножке порта Б единица?
            GOTO        SET_BIT    ;нет,идём на установку
            BCF         PORTB,3    ;да,установим ноль
            GOTO        EXIT_ISR   ;на выход
SET_BIT     BSF         PORTB,3    ;устанавливаем бит на ножке порта Б
;востанавливаем рабочий и статус регистры,выходим туда откуда вошли                    
EXIT_ISR    SWAPF       STATUS_TEMP,W
            MOVWF       STATUS
            SWAPF       W_TEMP,F
            SWAPF       W_TEMP,W
            RETFIE
;таблица значений,которые будем загружать в регистр сравнения CCPR1            
TABLE       ADDWF       PCL,F
            RETLW       51H
            RETLW       02H
            RETLW       11H
            RETLW       02H
            RETLW       0D7H
            RETLW       01H
            RETLW       0BCH
            RETLW       01H
            RETLW       8CH
            RETLW       01H
            RETLW       60H
            RETLW       01H
            RETLW       38H
            RETLW       01H
            RETLW       28H
            RETLW       01H
            END



 

НАЗАД                  Assembler AVR                  Си AVR                  ДАЛЬШЕ


Back to Top