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....