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 Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...
hadv
Just find out what you like and let it kill you
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]