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
benleentje
Golden Member
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.
noone
483726095 / Een foto zegt meer dan 1000 woorden.
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
noone
483726095 / Een foto zegt meer dan 1000 woorden.
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%)]
Jeroen Boere
IF you can't convince them, then confuse them!
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.
benleentje
Golden Member
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
Jeroen Boere
IF you can't convince them, then confuse them!
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
Jeroen Boere
IF you can't convince them, then confuse them!
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 errorHans
Oh, jah, die zijn inderdaad alleen maar voor de 18F serie icm een beta versie van Proton