[PIC] Programma lijkt ( Tijdelijk ) te hangen..

Beste Co'ers,

Onderstaande code is een gereduceerd stuk van een grote geheel om een probleem te lokaliseren, echter krijg ik het niet gevonden.. Het probleem is dat het hoofdprogramma ( Tussen Repeat en Until ) netjes loopt. Krijg ook elke keer op de PC ( Terminal ) een signaal binnen. Maar zodra ik iets verstuur vanaf de PC naar de PIC dan hangt het hele programma NA context restore.. Testen tot waar het programma loopt zijn tot daar gekomen. De data die verstuurd word vanaf de PC word wel correct en compleet ontvangen ( In eerdere delen getest )..

Het programma lijkt voor een seconde of 30 te pauzeren en gaat daarna vrolijk verder. De PIC reset zichzelf in ieder geval niet, dat weet ik omdat de de Variabele aantal netjes verder ophoogt.

Het zal vast iets heel simpels zijn als in "Ohjaa, tuurlijk !", echter ik zie het na een aantal uur prutsen niet.. Help :)

Device 16F690                
Config WDT_OFF, PWRTE_ON, MCLRE_OFF, HS_OSC 
All_Digital TRUE              ;Alle ingangen digitaal
Xtal 20                       ;Kristal van 20MHz

Declare Hserial_Baud = 9600
 
TRISB.5 = 1 " HW Serial In
TRISB.4 = 0 " Soft serial out
        
Symbol Serout_Poort = PORTB.4       'Software serial port

On_Interrupt GoTo InterruptAfhandeling ;Spring naar label als data is ontvangen door de USART

INTCON.7 = 1                  ;GIE  (Global Interrupt Enable) activeren
INTCON.6 = 1                  ;PEIE (PEripheral Interrupt Enable) activeren
PIE1.5   = 1  

Dim RGB_R As Byte
Dim RGB_G As Byte
Dim RGB_B As Byte
Dim RGB_W As Byte

Dim To_ID As Byte
Dim Opdracht_Code As Byte
Dim Opdracht_Argument As Byte

Dim aantal As Word

Dim Ontvangen As Byte

DelayMS 100
    
Clear                         

Repeat                   
     
    DelayMS 500
    Inc aantal
    SerOut Serout_Poort,84 , [" Main ", Dec aantal] ' Stuurt MAIN naar terminal zodat ik weer dat het programma zich daar bevind.
    
    If Ontvangen = 1 Then  ' Hier staat het deel wat uitgevoerd word indien er data is ontvangen..
        SerOut Serout_Poort,84 , [" Ontvangen " ] ' Stuurt ONTVANGEN naar terminal zodat ik weer dat het programma zich daar bevind.
        Ontvangen = 0
    End If
    
Until aantal = 65000                          

InterruptAfhandeling:  
    

   HSerIn 7,Verder,[To_ID, Opdracht_Code, Opdracht_Argument, RGB_R, RGB_G,RGB_B,RGB_W]
        
   Ontvangen = 1
   
Verder: 


   SerOut Serout_Poort,84 , [" Restore "]   ' Stuurt RESTORE naar terminal zodat ik weer dat het programma zich daar bevind.                   
   
   Context Restore  
   Return 

End                          

HSerin hoort (zoals reeds vaak gezegd) niet in een interrupt routine thuis. Dat duurt veel en veel te lang. (Zo te zien heb je zelfs maar liefst een 7 serconden timeout!)
Je moet HSerin in de main routine gebruiken, of in de interrupt iedere inkomende byte voor de seriele poort direct afhandelen...

Je programma zit qua structuur niet goed in elkaar.
Zodra de repeat until klaar is wandelt het programma de interrupt service routine in, doet een context restore (waarin een retfie zit) en eindigt met een return, die overigens NOOIT wordt bereikt.
Vermoedelijk krijg je een stackfout.

Verder...wat is PIE1.5, als je hier een vraag stelt is het wel slim om ons niet te dwingen de datasheet op te zoeken. Maar goed, het is RCIE, dan weet de rest het ook.
Nog verder...stel dat je ISR wordt aangeroepen (vanwege een ontvangst via HSerIn)...dan moet ook het bijbehorende RCIF bit op 0 worden gezet. Hierbij heb je geluk omdat de door Proton gegeneerde code daar zelf voor zorgt in de HSerIn (maar het is wel slordig).

Verander de structuur van je programma zodanig dat de main loop (de repeat..until) onderin het programma staat, zet daar ook een label voor, zoals (heel origineel) 'Main:'. De ISR zet je direct na de Clear, na de Clear een 'goto Main'.

[edit]
heeft Arco scherp gezien overigens, had ik helemaal overheen gekeken
[/edit]