(picbasic)Toch nog problemen met data ontvangst

Hallo

Ik dacht dat ik er was maar het gaat toch nog fout
onder staand programma werkt goed
maarrr
elke 3 seconde komt er 3 byte aan data binnen
maar als de data binnenkomt is het hoofdprogr. nog met diverse
For next en Select Case lussen bezig
en dan loopt het progr. vast
waarschijnlijk omdat ie de lus niet netjes afmaakt en het hoofdprogr. weer opnieuw begint.

Weet iemand of dit zo is
en nog belangrijker is hier een oplossing voor


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
  GeenData = 0
GoTo HoofdProg                                  

INT:

  HSerIn [Waarde]
    PIR1.5 = 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
    InGangTot = (VarX[2]*256) + VarX[1]        
  EndIf
  Context Restore                         	      ; Restore the registers and exit
GoTo START                 

Als je naar int gaat heb je al een waarde in de uart staan die kan je nu direct uitlezen. Ik weet niet precies wat HSerin doet maar mogelijk probeert deze opnieuw een waarde in de uart in te lezen en vervalt de alreeds ingelezen waarde weg. Mogelijk wacht het op een waarde die nog moet komen en gebruikt het daarvoor zijn eigen interupt.

Dus i.p.v. HSerin te gebruiken direct de uart register uitlezen.

ik ken geen picbasic, maar wel andere programmeertalen,

als de interrupt is afgelopen,
verwacht ik geen GOTO START,

maar zoiets als RETURN TO INTERRUPT ( RTI in ASM)
oftewel keer terug naar de plaats van aanroep.

mvg,
noone.

Hoi Benleentje
bovenstaand programma heb ik dagen lang laten draaien
en de variabele op een display zichtbaar gemaakt
en een tellertje erbij om te laten zien dat de data binnen komt
dit werkt perfect
maar nu is het hoofprogr. zo groot met vele lussen en gosub's
ik denk dat het daar fout gaat zoals ik hierboven schreef
of niet

Hoi Noone
Ja dat is 'm dan ben ik er
MAAR kan dat met Pic basic

het commando is RESUME

[edit] fout, dat is voor software interrupts,
voor hardware interrupts is dat CONTEXT RESTORE . . .

maar dat had je al . . . .

welk picbasic gebruik je? PROTON ?

mvg,
noone

[Bericht gewijzigd door noone op (10%)]

Ja inderdaad gebruik ik proton

Hans

je moet uit die ISR al dat gedoe halen met het ingangtot blabla.
Hier moet je een seperate functie voor aanmaken die aangeroepen word NA ontvangst van data.

Je gebruik de verkeerde return functie. Hoe dat wel moet staat goed omschreven in de manual van proton.

In een interrupt moet enkel het puur noodzakelijke gebeuren en dat is het legen van de uart.
Toch denk ik dat je beter niet HSerin kunt gebruiken maar gewoon de Uart ontvangst register direkt uitlezen.
Een If constructie kan echt niet in een iterrupt en dat moet gewoon in het hoofd programma.
Je zult later met een programma waar de interrupt echt kritisch in tijdnood komen met dergelijk lange interrupts.

Oke Hartelijk dank

die if functie kan er makkelijk uit
maar dan gaat ie nog niet goed
ik heb echter geen idee om Uart ontvangst direkt uit te lezen

Het meeste wat in het progr. staat heb ik al in dit forum gevonden
dus als je een goed voorbeeld heb heel graag

het zijn maar 3 byte's die elke 3 sec. binnen komen
waarvan ik de laatste 2 byte's gebruik.

Hoop op een goed voorbeeld

Hans

dit:



Device 18F6520

Dim Rx_Byte[25] As Byte

BEGIN:


       On_Interrupt GoTo High_Int_Handler               ' tell's the controller what to do with interrupts.
       PIE1.5 = 1                                       ' enables UART1 interrupt (=ethernet)
       High int_led 
       DelayMS 1000
       Low int_led
       DelayMS 1000
       GoTo BEGIN

'-------INTERRUPT SERVICE ROUTINE:-----------------------------------------
       
High_Int_Handler:
       


       High_Int_Sub_Start                               ' starts of interrupt service routine
       Low int_led                                      ' make the interrupt LED active
       
       HSerIn 200, EndINT, [Str Rx_Byte]                 ' Wait for next data, 200ms timeout, after timeout goto ENDINT
       PIR1.5 = 0                                       ' clear UART1 interrupt flag 
       PIE1.5 = 0

EndINT:

       High int_led                                     ' make interrupt LED off
       PIE1.5 = 1                                       ' enables UART1 interrupt (=ethernet)
       
       GoTo DoINT
       High_Int_Sub_End                                 ' end of the interrupt service routine

DoINT: CMD_Str[0] = Rx_Byte[0]

etc.. [hier dus alles van wat je met je data wilt doen NA je ISR call]
etc..

clear Rx_Byte
Context Restore

GoTo Begin                

End

Oke
Hartelijk dank
ik zie nu wat je bedoelt
als de data stroom voorbij is gebruik je de timeout functie om de data te verwerken
ik ga hier morgen mee aan de slag
de

HIGH_INT_SUB_START
en
HIGH_INT_SUB_END

kunnen er toch uit he
deze 2 snap ik niet en geven ook een error

Hans

Op 20 juli 2010 21:33:22 schreef Habro:
Oke
Hartelijk dank
ik zie nu wat je bedoelt
als de data stroom voorbij is gebruik je de timeout functie om de data te verwerken
ik ga hier morgen mee aan de slag
de
[...]
kunnen er toch uit he
deze 2 snap ik niet en geven ook een error

Hans

Oh, jah, die zijn inderdaad alleen maar voor de 18F serie icm een beta versie van Proton