Hallo,
Ik ben bezig een serieel signaal te ontvangen. Daar ik in de hoofdcode 4 7-segment displays wil multiplexen, wil ik het serieel signaal graag ontvangen dmv een interrupt. gebaseerd op code die ik hier op het forum heb gevonden heb ik een sterk vereenvoudigde code gemaakt om een signaal te ontvangen. De code werkt goed zonder de interrupt, dus de fout ligt aan de ontvangstkant.
De pic is een 16F648A. Hier is de code. Ik ben hier al een paar avonden mee bezig en heb vanalles geprobeerd maar kom er niet aan uit. Weet iemand wat ik fout doe?
Ik heb al een printcommando in de interrupt routine gehad om te zien of deze uberhaupt aangeroepen wordt. Als ik dit doe, blijft het programma in de interruptroutine hangen, maar hij displayed wel het signaal wat verzonden wordt. Ik kom dan alleen niet in de hoofdlus terecht.
DEVICE 16F648A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
PORTB_PULLUPS ON
DECLARE LCD_RSPIN PORTB.6
DECLARE LCD_ENPIN PORTB.5
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_LINES 4
TRISA = %11110000
TRISB = %11111011
DIM Var1 AS BYTE
DECLARE HSERIAL_BAUD = 2400
DECLARE HSERIAL_RCSTA = %10010000
DECLARE HSERIAL_TXSTA = %00100000
DECLARE HSERIAL_SPBRG=25
DECLARE HSERIAL_CLEAR = ON
on_interrupt GOTO int
DELAYMS 500
CLS
main:
INTCON.7 = 1
INTCON.6 = 1
PIE1.5 = 1
GOTO Hoofdlus
int:
HRSIN DEC Var1
CLEAR PIR1.5
CONTEXT RESTORE
GOTO main
Hoofdlus:
PRINT AT 1,3, DEC3 Var1
GOTO Hoofdlus
END
Weet niet of je er wat aan hebt maar ik gebruik de interrupt op deze manier.
Device 16F648A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
PORTB_PULLUPS ON
;*************************************************************************************************************
; Alle byte's enz.
;*************************************************************************************************************
dim ontvangst as byte
;*************************************************************************************************************
; Baudrate instellingen rs232 9600,8,N,1
;*************************************************************************************************************
HSERIAL_BAUD = 2400 ; Set baud rate
HSERIAL_RCSTA = %10010000 ; Enable serial port and continuous receive
HSERIAL_TXSTA = %00100000 ; Enable transmit and asynchronous mode
HSERIAL_CLEAR = ON ; Optionally clear the buffer before receiving
;*************************************************************************************************************
; Interrupt
;*************************************************************************************************************
main:
INTCON.7 = 1 ; Enable Global Interrupts
INTCON.6 = 1 ; Enable Peripheral Interrupts
PIE1.5 = 1 ; Enable UART Rx Interrupt
ON_INTERRUPT GOTO INT ; If there is UART activity: goto INT
GOTO flash ; Skip INT, goto main program
;*************************************************************************************************************
; Hier het hoofdmenu:
;*************************************************************************************************************
INT:
while 1 = 1 'while 1 is 1 then stay in this loop
HRSIN dec ontvangst
if ontvangst = "1" then toggle portb.1
if ontvangst = "0" Then hrsout "HoiHoi"
CONTEXT RESTORE ; Restore the registers and exit
GOTO main ; Goto start so INT will be used again
wend
;*************************************************************************************************************
; Zolang dit ledje aan/uit gaat is er geen RS232 activiteit:
;*************************************************************************************************************
flash:
high portb.1 ; hoofdprogramma laat een ledje knipperen
DELAYMS 500
low portb.1
GOTO MAIN
End
hoi Gerwinh,
bedankt voor je antwoord. Ik had je code al gezien maar in principe gaat de led van "geen ontvangst" wel eens flashen?
Ik ben bang, als ik de code voor het multiplexen van de segmenten in de interruptroutine ga schrijven, dat het op hetzelfde neerkomt dan waneer ik het in de hoofdcode zet:
- Of ik wacht op ontvangst en kan in die tijd niet multiplexen (Ik wil graag zoveel mogelijk tijd besteden die ik heb aan het multiplexen)
- of ik loop door maar dan moet het serieel signaal wanneer ik bij HSRIN kom precies aankomen.
Er gaat ineens een lampje op: of is het zo dat het signaal toch automatisch in de buffer onthouden wordt? en als er dan niets in de buffer zit? hoe zorg ik dan dat mijn variabele met gegevens niet veranderd wordt?
Ter info, het programma wat het signaal zend is redelijk vol en zend dus niet enorm vaak....