lost
put your signature here
mensen, ik weet het niet meer.
ik heb een sukje code die niks anders hoefd te doen dan elke seconde "blieb" te zeggen en bij een interrupt de teller met 1 verhogen om vervolgens weer door te gaan met "blieb" melden.
als ik nu de pic opstart gaat alles goed:
ik krijg "start" te zien en elke seconde komt er een "blieb" bij.
als ik nu een interrupt veroorzaak (PortB.0) klopt het ook nog: er komt "er is een interrupt geweesd" met het aantal erachter.
als ik er meer veroorzaak gaat dat ook goed.
dan gaat het mis. er gebeurt ongeveer 2 minuten helemaal niets voordat hij weer verder gaat met "blieb'en"
als ik dan weer een interrupt veroorzaak klopt de telling nog wel.
dus alles gaat goed met uitzondering van die 2 minuten wachttijd
Device 16F877
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF,
XTAL 20
ALL_DIGITAL TRUE ;Alle ingangen digitaal
PORTB_PULLUPS On ;On-chip pull-up weerstanden actief
ON_INTERRUPT Interrupt_Handler
Clear ;Wis alle ram geheugen
Dim teller As Float
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag
Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol sert PORTD.1 ' naar computer send
Symbol baud 8380 ' 7 bit, even, true, 4800
GoTo Hoofdprogramma
Interrupt_Handler:
SerOut sert,baud, ["er is een interrupt geweesd",Dec teller,13]
teller = teller + 1
INTF=0
Context Restore
Hoofdprogramma:
SerOut sert,baud, ["start",13]
GIE=0
INTE=1
GIE=1
loop:
DelayMS 1000
SerOut sert,baud, ["blieb",13]
GoTo loop
End
weet iemand raad? wat zie ik over het hoofd?
alsvast bedankt.
Kan het je PC kant zijn? Zet tijdelijk een ledje aan een poort die je dan aan resp uit zet in je loop. Dan zie je of het je pic is of je PC.
MGP
LDmicro user.
Ben niet veel met PIC interrupts bezig maar wat ik hier zie lijkt mij teveel van het goede.
Namelijk een seriele functie binnen een interrupthandler.
Interrupts moeten zo kort mogelijk zijn, zet een flag in die interrupthandler en voer de seriele functie uit in uw hoofdprogramma.
plano
Webshop voor Electronic Prototype | http://eProto.nl/
Klopt, de interrupt kun je wel gebruiken om bijv een teller met 1 op te hogen en vergelijking te maken. Bijv, If C1 = xx THEN Gosub Ser_out
Op 29 januari 2012 09:22:09 schreef plano:
Klopt, de interrupt kun je wel gebruiken om bijv een teller met 1 op te hogen en vergelijking te maken. Bijv, If C1 = xx THEN Gosub Ser_out
Ach, even overheen gezien, want gebruikt Ser.... zelf ook de nodige interupts?
plano
Webshop voor Electronic Prototype | http://eProto.nl/
@ Lord, nee dat niet, maar een serout Basic command is een soort loop, om elke byte (bit) achter elkaar, serieel uit te sturen. Schrijf maar eens een serout instructie, haal deze door de compiler en kijk in de .lst of .asm
Ik zie nergens dat de teller weer eens op nul gezet wordt. Eens is ook een float variabele volgelopen. Maar dat zal nu nog niet het probleem zijn. Hou die interrupt zo kort mogelijk.
[Bericht gewijzigd door DKH op (28%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Inderdaad,
Nooit zulke trage processen als serieel i/o gebruiken in een interrupt, geen float(is ook nergens voor nodig bij een teller), en altijd testen of de interrupt wordt veroorzaakt door de bron die jij denkt. (Je test nergens of de interrupt door INTF wordt veroorzaakt, maar neemt blindelings aan dat dat zo is)
(En waarom zo'n exotische serieele instellingen? "7 bit, even, true, 4800"...)
lost
put your signature here
en inderdaad,
het was inderdaad de serout fuctie die niet in de inerrupt kan staan,
voor de voledigheid nog even de code die wel werkt:
Device 16F877
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF,
XTAL 20
ALL_DIGITAL TRUE ;Alle ingangen digitaal
PORTB_PULLUPS On ;On-chip pull-up weerstanden actief
ON_INTERRUPT Interrupt_Handler
Clear ;Wis alle ram geheugen
Dim teller As Float
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag
Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol sert PORTD.1 ' naar computer send
Symbol baud 8380 ' 7 bit, even, true, 4800
GoTo Hoofdprogramma
Interrupt_Handler:
teller = teller + 1
INTF=0
Context Restore
Hoofdprogramma:
SerOut sert,baud, ["start",13]
GIE=0
INTE=1
GIE=1
loop:
SerOut sert,baud, ["interrupt teller:",Dec teller,13]
DelayMS 1000
SerOut sert,baud, ["blieb",13]
GoTo loop
End
@arco
mijn eerste Dos progammatje dat ik ooit heb gebruikt had dat als default. (was geschreeven voor boventitels in theaters)
en sindsdien eigenlijk altijd klakkeloos overgenomen ter voorkoming van 2 verschillende systeemen.
allen hartstikke bedankt.
achteraf meestal heel logisch maar ik had me er weer volkomen blind op gestaard.
[Bericht gewijzigd door Henry S. op (7%)]
@lost. Succes verder.
Op 29 januari 2012 10:44:25 schreef plano:
@ Lord, nee dat niet, maar een serout Basic command is een soort loop, om elke byte (bit) achter elkaar, serieel uit te sturen. Schrijf maar eens een serout instructie, haal deze door de compiler en kijk in de .lst of .asm
Even alle software buiten bereik om te testen. Dus nog even bruut ertussen.
En met SERIN? ( had daarom in mijn vraag ook SER... geschreven, kon twee kanten op
)
Is er dan geen vorm van synchronisatie of is dit indien nodig op HW basis?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
lost
put your signature here
@arco:
gelijk heb je. de float is er uit maar ik heb geen idee hoe ik test of die interrupt inderdaad van PortB.0
kan iemand mij nog verrijken met een een voorbeeld?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Je doet een context restore, maar geen context save. Wat restore je dan? Garbage!
Dat geeft de meest vreemde problemen (En soms gaat het goed). Als er geen context gerestored moet worden, laat het dan weg. Moet er wel gerestored worden, zet dan "context save" als eerste instructie in je interupt handler.
Verder zijn er nog Int_sub_start en Int_sub_end instructies die je eventueel nodig zou kunnen hebben.
http://www.circuitsonline.net/forum/view/message/1277324#1277324 (Ik heb dat dus ook fout gedaan).
Verder inderdaad geen dingen die veel tijd kosten in een interrupthandler. Dus geen seriële communicatie, geen floats, en zeker geen delays. De interrupthandler moet ten alle tijde klaar zijn voor de volgende interrupt optreed. (Dus heb je elke minuut een timer interrupt, en verder geen interrupts, dan kan je rustig 2 floats vermenigvuldigen, 5 seconden wachten, en het resultaat serieel uitsturen, op voorwaarde dat je hoofdprogramma zolang onderbroken mag worden).
[Bericht gewijzigd door Lucky Luke op (35%)]