Programma moet doorlopen tijdens wachten op Data(picbasic)

Hallo

Ik kom er even niet goed uit
Het progr. werkt goed maarrrr.

er wordt elk 3 sec. 3 byte aan data verstuurt
deze ontvang ik en ga daar mee werk
daarna wacht die weer dat ie data ontvangt en wacht eerst op een start byte.
als deze 50 is dan mogen de 2 byte binnen komen
tot zover geen probleem.

er komt ook een alarm in en reset knop
als die net wacht als de data voorbij is wacht ie 3 sec.
en dat duurt vrijlang om te wachten voordat de reset knop

heeft iemand een mooie oplossing voormij

hier een deel van het progr.


START:

Waarde = HRSin , {5000 , TimeOut}  'wacht +/- 10 sec op een signal geen sign. naar timeout
If Waarde <> 50 Then GoTo START  
  
HSerIn 8000 , TimeOut , [Str VarX]  'Vult de Array met 2byte 
DelayMS 50

Var1en2 = (VarX[1]*256) + VarX[0]

OpTelling:

AanTal = 0
    TempWord = Var1en2
        For Tel = 1 To 16
            If TempWord & 1 = 1 Then AanTal = AanTal + 1
                TempWord = TempWord >> 1
        Next

If AanTal <> AanTalOud Then GoSub Alarm
AanTalOud = AanTal

OpDisplay:

Cls
Print At 1,1,  Dec VarX[0]," + ",Dec VarX[1]," = ",Dec Var1en2
Print At 2,1,  "Aantal = ",Dec AanTal
Print At 2,16, Dec Y
DelayMS 1000
GoTo START

TimeOut:              

Cls                       
Print At 1,1, "Geen Data"          
DelayMS 100
GoTo START 

Interrupts gebruiken (al dan niet in Picbasic), of een korte timeout gebruiken om de data en een loop maken om de data binnen te halen.

Testen of er iets in de Rx buffer zit.


If PIR1.RCIF Then
' 1 character binnenhalen...  
End If

Oke
Hartelijk dank voor het snelle reageren
ben inderdaad toch weer met die interrups de hele middag bezig geweest
en daar snap ik toch niet veel van
bijna alles heb ik van dit forum gehaald
maar het werkt wel.
het voorbeeld staat hieronder
alleen de timeout werkt nu niet meer
is daar nog een mogelijkheid voor
en Arco die PIR1.RCIF ga ik ook nog proberen


 
START:

  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 MAIN                                             ; Skip INT, goto main program

INT:

  ;HSerIn , 1000 , TimeOut , [Received]  ;werkt niet
  HSerIn [Received]
  Value[0]  = Value[1]				      ; zet ontvangen waarde in de array
  Value[1]  = Value[2]				      ; en schuif al aanwezige waarden door
  Value[2]  = Received
  If Value[0] = 50 Then
  Var1en2 = (Value[2]*256) + Value[1]        
  EndIf


GoTo START                               ; Goto start so INT will be used again

MAIN:

Cls
X = X + 1
Print At 1,1,  Dec Value[1]," + ",Dec Value[2]," = ",Dec Var1en2
Print At 2,1,  "X = ",Dec X
DelayMS 500
GoTo MAIN

TimeOut:              

Y = Y + 1
Cls                       
Print At 1,1, "Geen Data"          
DelayMS 100
GoTo START 

End

Ik ben eruit hoor
het werkt als een trein
dit is het geworden
op of aanmerkingen zijn welkom


Cls
Print At 1,1, "Test"          
Print At 2,1, "Programma" 
DelayMS 3000
 
START:

  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 HoofdProg                                  

INT:

  HSerIn [Waarde]
    PIR1.5 = 0 
    GeenData = 0                          ;Just to be sure: Clear the Interrupt flag
    VarX[0]  = VarX[1]				      ; zet ontvangen waarde in de array
    VarX[1]  = VarX[2]				      ; en schuif al aanwezige waarden door
    VarX[2]  = Waarde
  If VarX[0] = 50 Then
    Var1en2 = (VarX[2]*256) + VarX[1]        
  EndIf

GoTo START                                ; Goto start so INT will be used again

HoofdProg:

  If GeenData = 1 Then 
    GeenDataTel = GeenDataTel + 1
  Else
    GeenDataTel = 0
    GeenData = 1
  EndIf
  If GeenDataTel > 10 Then GoTo TimeOut
  Cls
    X = X + 1
  Print At 1,1,  Dec VarX[1]," + ",Dec VarX[2]," = ",Dec Var1en2
  Print At 2,1,  "X = ",Dec X
  DelayMS 500
GoTo HoofdProg

TimeOut:            

  Cls                       
  Print At 1,1, "Geen Data"  
  For Tel = 1 To 16
    If Reset = 0 Then Break        
    Print At 2,1, Rep 255\Tel
    DelayMS 500
  Next
  If Reset = 0 Then GoSub Herstel
  If GeenData = 0 Then 
    GoTo HoofdProg
  Else 
    GoTo TimeOut
EndIf

Herstel:

  Zoemer = 0
  DisplayLed = 1
Return
        
End