Как заставить PIC18F4520 запускать прерывание RTC из таблицы - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу построить двоичные часы с использованием модуля timer1 в качестве RTC с примером кода из таблицы данных, но, хотя я и написал необходимый код вокруг него, прерывание не сработает.Я пропустил настройку регистра или адрес памяти?Я новичок в программировании PIC, но получил некоторый опыт сборки.

        UDATA_ACS
secs    RES 1
mins    RES 1
hours   RES 1

ORG 0x0000            ; processor reset vector
    GOTO    MAIN                   ; go to beginning of program
ORG 0x0800
    BTFSC   intcon,int0if
    CALL int0_isr
    RETFIE

MAIN_PROG CODE                      ; let linker place main program
ORG 0x0100
MAIN
    MOVLW  080h        ; Preload TMR1 register pair
    MOVWF  TMR1H       ; for 1 second overflow
    CLRF   TMR1L
    MOVLW  b'00001101' ; Configure for external clock,
    MOVWF  T1CON       ; Asynchronous operation, external oscillator
    CLRF   secs        ; Initialize timekeeping registers
    CLRF   mins        ;
    MOVLW  .12
    MOVWF  hours
    BCF    intcon,int0if
    BSF    INTCON,INT0IE
    BCF    INTCON2,INTEDG0
;    BSF  rcon,ipen
;    BSF  intcon,peie
    BSF    PIE1, TMR1IE ; Enable Timer1 interrupt
    BSF    intcon,gie

    clrf    lata
    movlw   0x0f
    movwf   adcon1
    movwf   0x07
    movwf   cmcon
    movlw   0x00
    movwf   trisa
    clrf    portb
    movlw   0x00
    movwf   trisb
    clrf    latd
    movlw   0x00
    movwf   trisd

    movlw   secs
    movwf   lata
    movlw   mins
    movwf   latb
    movlw   hours
    movwf   latd
here
    goto    here

    RETURN

int0_isr 
    ;from datasheet p.133
    RETFIE
~~~~~~~~~

1 Ответ

0 голосов
/ 18 апреля 2019

Вы используете неправильный вектор прерывания с 0800.
Высокий вектор прерывания: 0008h
Низкий вектор прерывания: 0018h

ORG 0x0008
    BTFSC   intcon,int0if
    CALL int0_isr
    RETFIE
...