T.J.
05.05.2008, 23:28
Hallo, ich habe ein Problem mit zu vielen Calls im Interrupt.
Mein Programm ist so gestrickt, dass im Mainloop nix läuft (außer ne LED blinken) und in der ISR eine Nachricht per Uart gesendet wird.
Wenn ich nun nur 1byte sende (2 calls hintereinander) funktioniert es dauerhaft. Wenn ich aber einen Frame aus 6 bytes senden will (so soll die Funktion sein) viele calls und operationen, dann führt er das einmal korrekt aus aber bekommt danach kein Interrupt vom CAN mehr rein. Andere Interrupts gehen danach trotzdem. Er hängt sich auch nicht auf.
was muss ich da beachten? wieso kann ich nicht so viele calls machen wie ich will?
;Global Interrupt Vektor
ORG 0x0008
goto Isr
;************************************************* *****************************
; Start des Hauptprogramms *
;************************************************* *****************************
;
Main:
ORG 0x0100
rcall Init
MainLoop:
bcf LATC,5
bcf LATC,4
movlw 0x44
movwf xms
call wxms ;kurz warten
goto MainLoop
;
;************************************************* *****************************
; Initialisierung *
;************************************************* *****************************
Init:
; 8MHz als interne Frequenz
movlw 0x70
movwf OSCCON
; Portdirektionen definieren
movlw 0x08
movwf TRISB
movlw 0x8F
movwf TRISC
clrf LATC
; Schnittstellenkonfigurationen
rcall canInit
rcall uartInit
; Interrupts konfigurieren
bsf INTCON, 7 ; Global Int aktivieren
bsf INTCON, 6 ; Peripherie Int aktivieren
bsf PIE3, 0 ; Interrupt fuer RXB0 aktivieren
bsf PIE1, 5 ; Interrupt fuer EUSART receive aktivieren
return
;
Isr:
btfss PIR3, 0 ; CAN-Nachricht empfangen?
goto uartInt ; nein!
canInt:
bsf LATC,5
;CAN Nachricht nach UART senden
call canRecMsg
movf canIDL,w
xorlw 0x02
btfss STATUS,Z
goto nloadcanmsg
loadcanmsg:
movlw 0xFF
movwf uartsMsg
call uartSendMsg
; movf canIDL,w
; iorlw 0x80
; movwf uartsMsg
; call uartSendMsg
; movf canIDH,w
; andlw 0xF0
; iorlw 0x09
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canIDH,w
; andlw 0x0F
; iorlw 0xA0
; movwf uartsMsg
; call uartSendMsg
; movf canDLC,w
; iorlw 0xC0
; movwf uartsMsg
; call uartSendMsg
; movf canDLC,w
; btfsc STATUS,Z
; goto nloadcanmsg
; movwf tempvar
; movf canMsg0,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg0,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg1,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg1,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg2,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg2,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg3,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg3,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg4,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg4,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg5,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg5,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg6,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg6,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg7,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg7,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
nloadcanmsg:
bcf PIR3,0
bra EndIsr
uartInt:
bsf LATC,4
;UART Nachricht nach CAN senden
call uartRecMsg
EndIsr:
retfie FAST
Mein Programm ist so gestrickt, dass im Mainloop nix läuft (außer ne LED blinken) und in der ISR eine Nachricht per Uart gesendet wird.
Wenn ich nun nur 1byte sende (2 calls hintereinander) funktioniert es dauerhaft. Wenn ich aber einen Frame aus 6 bytes senden will (so soll die Funktion sein) viele calls und operationen, dann führt er das einmal korrekt aus aber bekommt danach kein Interrupt vom CAN mehr rein. Andere Interrupts gehen danach trotzdem. Er hängt sich auch nicht auf.
was muss ich da beachten? wieso kann ich nicht so viele calls machen wie ich will?
;Global Interrupt Vektor
ORG 0x0008
goto Isr
;************************************************* *****************************
; Start des Hauptprogramms *
;************************************************* *****************************
;
Main:
ORG 0x0100
rcall Init
MainLoop:
bcf LATC,5
bcf LATC,4
movlw 0x44
movwf xms
call wxms ;kurz warten
goto MainLoop
;
;************************************************* *****************************
; Initialisierung *
;************************************************* *****************************
Init:
; 8MHz als interne Frequenz
movlw 0x70
movwf OSCCON
; Portdirektionen definieren
movlw 0x08
movwf TRISB
movlw 0x8F
movwf TRISC
clrf LATC
; Schnittstellenkonfigurationen
rcall canInit
rcall uartInit
; Interrupts konfigurieren
bsf INTCON, 7 ; Global Int aktivieren
bsf INTCON, 6 ; Peripherie Int aktivieren
bsf PIE3, 0 ; Interrupt fuer RXB0 aktivieren
bsf PIE1, 5 ; Interrupt fuer EUSART receive aktivieren
return
;
Isr:
btfss PIR3, 0 ; CAN-Nachricht empfangen?
goto uartInt ; nein!
canInt:
bsf LATC,5
;CAN Nachricht nach UART senden
call canRecMsg
movf canIDL,w
xorlw 0x02
btfss STATUS,Z
goto nloadcanmsg
loadcanmsg:
movlw 0xFF
movwf uartsMsg
call uartSendMsg
; movf canIDL,w
; iorlw 0x80
; movwf uartsMsg
; call uartSendMsg
; movf canIDH,w
; andlw 0xF0
; iorlw 0x09
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canIDH,w
; andlw 0x0F
; iorlw 0xA0
; movwf uartsMsg
; call uartSendMsg
; movf canDLC,w
; iorlw 0xC0
; movwf uartsMsg
; call uartSendMsg
; movf canDLC,w
; btfsc STATUS,Z
; goto nloadcanmsg
; movwf tempvar
; movf canMsg0,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg0,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg1,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg1,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg2,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg2,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg3,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg3,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg4,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg4,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg5,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg5,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg6,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg6,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
; decf tempvar
; btfsc STATUS,Z
; goto nloadcanmsg
; movf canMsg7,w
; andlw 0xF0
; swapf WREG
; movwf uartsMsg
; call uartSendMsg
; movf canMsg7,w
; andlw 0x0F
; movwf uartsMsg
; call uartSendMsg
nloadcanmsg:
bcf PIR3,0
bra EndIsr
uartInt:
bsf LATC,4
;UART Nachricht nach CAN senden
call uartRecMsg
EndIsr:
retfie FAST