Jag får inte riktigt detta att fungera.
Jag ska fånga en Manchesterkod med bitlängd om 100us.
Se nedan, inlägg nummer sex, för ändrad frågeställning...
Tanken är koden börjar leta efter startbiten, dvs GPIE set.
När sedan GPIF slår till och det även är så att /GP0 & T0IF, dvs signalen på porten är låg och timern slagit över, så inleds arbetet med att samla ihop bitarna till ett ord.
Här slås GPIE av och istället används T0IF, med T0IE set.
TMR0 sätts till att ha 75us kvar, dvs till ungefär mitten av nästa bit's höga mitt.
När T0IF slår till kollas om GP0 är hög, varvid denna bit sätts hög.
(Är GP0 låg är biten låg och sätts ej, dvs fortsätter vara låg.)
Därefter sätts TMR0 till att ha 100us kvar (från mitten av hög till nästa bit's höga tidsposition.
Och igen när T0IF slår till...
...tills alla åtta bitarna samlats och ordet är klart.
Här släpps TMR0 i sin långa ordinarie längd och byte igen till /T0IE & T0IE, i väntan på nästa ord.
Special File Register ser ut såhär :
Kod: Markera allt
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL GPIO ; B0 - uuxx xxxx
CLRF GPIO ; port A initiated
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL OPTION_REG ; 1_1_1_1 1_111
MOVLW b'01011011' ; WPU & /T0CS & WDT & PS 1:8
MOVWF OPTION_REG
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL OSCCON ; U_110 R_R_R_0
MOVLW b'01111001' ; 8MHz
MOVWF OSCCON
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
; 8 MHz / 4 = 2MHz => 500ns & PS 1:8 => timer at 1024us & 4us per step
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL TRISIO ; uu11 1111 / all ports input
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL ANSEL ; U_000 1_1_1_1 / all ports analogue
MOVLW b'00000000' ; All ports digital
MOVWF ANSEL
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL CMCON0 ; U_R_U_0 0_000
MOVLW b'00000111' ; Comparator disabled
MOVWF CMCON0
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL WPU ; UU_1_1 U_1_1_1 / all ports w/ weak pullups
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL IOC ; UU_0_0 u_0_0_0 - None interupt on change
MOVLW b'00000001' ; 00 0 0 0 0 0 1 - IOC @ GP0
MOVWF IOC
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
BANKSEL GPIO
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
Interupt Service Routine ser ut såhär:
(dock utan inledning och anslutning)
Kod: Markera allt
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
At_Port_Interrupt
BTFSS INTCON, GPIE
GOTO At_Port_Interrupt
; if port interrupt enabled else jump ahead
BTFSC INTCON, T0IF
BTFSC INTCON, GPIF
GOTO Exit_Interrupt_Routine
; if T0IF & /GPIF else jump exit
MOVLW 0x7
MOVWF Bit
MOVLW d'237'
MOVWF TMR0
CLRF Word
; restart bit count, clear word & restart timer at 75us left
BCF INTCON, GPIE
BSF INTCON, T0IE
; disable port interrupt & enable timer interrupt
GOTO Exit_Interrupt_Routine
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
At_Timer_Interrupt
BTFSS INTCON, T0IE
GOTO Exit_Interrupt_Routine
; if timer interrupt enabled else jump exit
DECF Bit, W
BTFSC GPIF, 0x1
BSF Word, W
; set present bit if port is high
DECFSZ Bit
GOTO Get_Next_Bit
; handle word if last bit else find next bit
; /// handle the word when finished routine ///
BCF INTCON, T0IE
BSF INTCON, GPIE
; disable timer interrupt & enable port interrupt
GOTO Exit_Interrupt_Routine
Get_Next_Bit
MOVLW d'231'
MOVWF TMR0
; restart timer at 100us left
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /
Exit_Interrupt_Routine
BCF INTCON, T0IF
BCF INTCON, GPIF
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /