Då har jag testat lite men tror att ISR rutinen inte anropas när data kommer in. Har bygglat in och ut på max232 cmos sida och då skickas datat tillbaka, så den fungerar.
koden i ISR rutinen har jag stegat igenom och den funkar och data sparas på minnesplatserna.
Kod: Markera allt
;**********************************************************************
;TEST av display
;
;**********************************************************************
;
;
list p=16f886 ; list directive to define processor
#include <p16f886.inc> ; processor specific variable definitions
;
__CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
errorlevel -302
;
#define COUNTER PORTB, 0
#define DATAIN PORTA, 0
#define CLKIN PORTA, 1
#define DIMMIN PORTA, 2
#define ESC 0x1B
#define HOUR_TAG 0x30
#define CURRENT_TIME 0x21
#define MINUTE_TAG 0x32
#define SECOND_TAG 0x34
#define SEC100_TAG 0x36
#define SEC10K_TAG 0x38
;
;
;**********************************************************************
RESET_VECTOR CODE 0x000 ; processor reset vector
goto start ; go to beginning of program
;
;
INT_VECTOR CODE 0x004 ; interrupt vector location
retfie ; Ingen interrupt kod...
;
RS232_VAR UDATA_SHR
RX_DATA RES 1 ; Data som motagits från RS232 port.
TX_DATA RES 1 ; Data att skicka till RS232 port.
RX_BUFFER RES 2 ; Motagningsbuffer på 2 byte
Ind_check RES 1
buffer_full RES 1
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1
DLR_3416_var UDATA
digit_0 RES 1 ; variable used for context saving
digit_1 RES 1
digit_2 RES 1
digit_3 RES 1
digit_4 RES 1
digit_5 RES 1
digit_6 RES 1
digit_7 RES 1
digit_9 RES 1
SEND RES 1
chk_number RES 1
;**********************************************************************
;**********************************************************************
; Huvudkoden.
; Här hamnar vi vid reset eller power-on (från RESET_VECTOR)
;
;
MAIN CODE
start
;
;
GIE01
banksel INTCON
clrf INTCON
btfsc INTCON, GIE
goto GIE01
bsf INTCON, PEIE
banksel ANSEL ; Stäng av alla analoga funktioner
clrf ANSEL
clrf ANSELH
banksel TRISA ; Alla pinnar utgångar
clrf TRISA
banksel TRISB
clrf TRISB
banksel PORTC
clrf PORTC
banksel TRISC
movlw b'11000000'
movwf TRISC
banksel PIE1
clrf PIE1
bsf PIE1, RCIE
banksel PIR1
clrf PIR1
banksel PIR2
clrf PIR2
banksel PIE2
clrf PIE2
banksel TXSTA
bcf TXSTA, TX9 ;Sätt 8 bits sändning
bsf TXSTA, TXEN ;Sätt data sändning
bcf TXSTA, SYNC ;Async kommunikation
bcf TXSTA, BRGH ;Låg klock hastighet
banksel SPBRG
movlw d'25' ;Sätt Baudrate till 2400, SPBRG value=25
movwf SPBRG
banksel RCSTA
bsf RCSTA, SPEN ;Starta serial port
bcf RCSTA, RX9 ;Sätt 8 bits mottagning
bsf RCSTA, CREN ;Sätt konstant motaggning
bcf RCSTA, FERR
banksel INTCON
bsf INTCON, GIE
banksel portb
;
;
loop
goto loop ; Gör ingenting....
;
ISR_ROUTINE CODE
;
isr_routine
;
movwf w_temp ; save off current W register contents
movf STATUS,W ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,W
movwf pclath_temp
clrf PCLATH ; Be sure that wer'e home alone
datain1
btfsc RCSTA, OERR
goto overerror ;om 'overflow error'...
btfsc RCSTA, FERR
goto frameerror ;om 'framing error'...
goto esc_check
;
overerror
banksel RCSTA
bcf RCSTA, CREN ;Stäng av pulse cren
movf rcreg,w ;Rensa FIFO
movf rcreg,w ;är tre steg
movf rcreg,w
bsf RCSTA, CREN ;Sätt cren och oerr blir låg.¨
goto datain1 ;försök igen...
;
frameerror
movf rcreg,w ;Att läsa av RCREG gör att FERR blir låg.
goto datain1 ;Försök igen..
;
esc_check
movf RCREG, w
andlw h'7F' ; strip MSB
movwf RX_DATA
movf RX_DATA, w
sublw ESC
btfsc STATUS, Z ; D.v.s skippa nästa inst om Z = 0
goto clear ; Om ESC, återställ allt.
if_0x21
movf rx_data, w
sublw CURRENT_TIME ; Om inkommet tecken = 0x21, så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto index ; Gå till Index
movf rx_data,w ; Spara 21 i Rx_buffer+1
movwf INDF
incf FSR
goto done
index
movf rx_buffer,w
sublw CURRENT_TIME ; Om RX_BUFFER+1 = 0x21, så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto clear
btfsc Counter ; Om Counter =0, hoppa över nästa.
goto index_0 ; Om Counter =1, gå till Index_0
movf rx_data,w ; Spara Indexpekare i RX_buffer+2
movwf INDF
incf FSR
bsf Counter
goto done
Index_0
movf rx_buffer+1, w
movwf Ind_check
movlw h'30'
subwf ind_check
btfss STATUS, Z ; Index pekare =30 ?
goto index_1 ; Nej, gå till Index_1
movf rx_data, w
movwf digit_7
incf rx_buffer+1
goto done
;
index_1
decfsz Ind_check, f ; Index pekare =31 ?
goto index_2 ; Nej, gå till Index_2
movf rx_data, w
movwf digit_6
incf rx_buffer+1
goto done
index_2
decfsz Ind_check, f ; Index pekare =32 ?
goto index_3 ; Nej, gå till Index_3
movf rx_data, w
movwf digit_5
incf rx_buffer+1
goto done
index_3
decfsz Ind_check, f ; Index pekare =33 ?
goto index_4 ; Nej, gå till Index_4
movf rx_data, w
movwf digit_4
incf rx_buffer+1
goto done
index_4
decfsz Ind_check, f ; Index pekare =34 ?
goto index_5 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_3
incf rx_buffer+1
goto done
index_5
decfsz Ind_check, f ; Index pekare =35 ?
goto index_6 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_2
incf rx_buffer+1
goto done
index_6
decfsz Ind_check, f ; Index pekare =36 ?
goto index_7 ; Nej, gå till Index_5
movf rx_data, w
movwf digit_1
incf rx_buffer+1
goto done
index_7
decfsz Ind_check, f ; Index pekare =37 ?
goto done ; Nej, gå till Index_5
movf rx_data, w
movwf digit_0
clrf rx_buffer
goto done
;
;
clear ;Rensa buffern och gå ur ISR
nop
nop
nop
nop
clrf rx_buffer
clrf rx_buffer + 1
clrf rx_buffer + 2
movlw RX_Buffer
movwf FSR
bcf Counter
done
movf pclath_temp,W ; Read copy of PCLATH
movwf PCLATH ; Restore to pre-ISR content
movf status_temp,W ; Retrieve copy of STATUS register
movwf STATUS ; Restore pre-isr STATUS register contents
swapf w_temp,F
swapf w_temp,W ; Restore pre-isr W register contents
;
retfie