You are on page 1of 5

Momenteel maak je gebruik van een beelschermresolutie die kleiner is dan 1024 x 768 pixels.

Circuits Online is
geoptimaliseerd voor schermresoluties van minimaal 1024 x 768. Op kleinere schermen is het mogelijk om de
rechterbalk van de website weg te laten en de inhoud daarvan links in de balk te plaatsen.

Wil je de rechterbalk van de website weglaten?

Deze vraag niet opnieuw stellen

Ja Nee

[picbasic] interrupts begrijpen


Gepost maandag 14 januari 2013 17:05:46 |
JojoJoppe
Hallo,
Ik ben nu aan het kijken of ik interrupts aan de praat krijg... alleen lukt dit niet helemaal...

pic basic code:

device 16f628a
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE

on_interrupt goto stil

SYMBOL INTF = INTCON.1 ' RB0 External Interrupt Flag


SYMBOL INTE = INTCON.4 ' RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
symbol INTEDG = option_reg.6

PORTB_PULLUPS ON
clear

clear GIE
clear INTEDG
set INTE

goto main

stil:
context save
toggle PORTA.7
clear INTF
delayms 1000
context restore

main:
while 1 = 1
high PORTA.7
delayms 500
low PORTA.7
delayms 500
wend

Dit programma zou een ledje moeten laten knipperen. Als ik op de knop druk zou hij 1
seconde aan of uit moeten blijven. (ik weet... dit is een nutteloos programma... maar dit is

https://www.circuitsonline.net/forum/view/110164/1/uitvoeren+interrupt+delay 14/11/16 09:39


Pagina 1 van 5
een testje) Als ik de pic brand knippert het ledje wel, maar hij reageert niet op de knop.

knop is zo geschakeld:
code:
________
| |
+---|RB0/INT |
| | |
K | |
| | |
GND |________|

weet iemand wat ik fout doe? En kan iemand me misschien duidelijk interrupts uitleggen met
voorbeelden? (op picbasic.nl staat (nog) niks in de tut's)

Wees altijd vrolijk!

Gepost maandag 14 januari 2013 17:28:52 |


hadv
Je moet sowieso GIE op 1 zetten anders zal er geen enkele interrupt optreden.
Verder moet een interrupt handler routine zo kort mogelijk zijn.
Dus die delayms 1000 daar is volstrekt uit den boze, je blokkeert nu nl het hele interrupt
afhandelen. Dat is voor dit testprogrammatje niet erg, maar in de praktijk is het een ramp.

Ik neem aan dat de toggle in de interrupt handler bedoeld is om de led te laten knipperen,
maar dat doe je nu ook al in je 'main loop'. Het is van tween n, of in de handler, of in de
main loop.

Je mag het een nutteloos programma noemen, om te leren is het prima.

Je zult eea wel anders moeten oplossen:


- declareer een variabele Knop as byte (of bit, ook goed)
- in de int handler zet je deze variabele op 1
- in de main loop test je de variabele, als deze 1 is zet je de led aan, anders zet je de led uit,
je kunt nog een delaytje invoegen om te kunnen checken of de led brandt, en je zet de
variabele Knop weer op 0.

Voor het leren werken met interrupts zul je moeten zoeken in boeken.
Ik heb ooit eens het boek 'The Quintessential PIC Microcontroller' van S. Katzen op de kop
getikt. Dat staat boordevol informatie. Hij behandelt de 16F84, maar de kennis an sich is op
allerlei types van toepassing.
Ga eens googelen, zou zomaar kunnen zijn dat je daar een tut vindt.

Just find out what you like and let it kill you

Gepost maandag 14 januari 2013 17:40:13 |


JojoJoppe
Heel erg bedankt! Het werkt nu igg. Nu weet ik ongeveer welke kant ik op moet met
interrupts...

pic basic code:

set gie
set intedg
set inte

; --------------------------------------

goto main

https://www.circuitsonline.net/forum/view/110164/1/uitvoeren+interrupt+delay 14/11/16 09:39


Pagina 2 van 5
stil:
context save
delayms 10
while PORTB.0 = 0 : wend
delayms 10
set knop
clear intf
context restore

main:
clear knop
while 1 = 1
if knop = 1 then
low PORTA.7
clear knop
delayms 500
endif
if knop = 0 then
high PORTA.7
endif
wend

Wees altijd vrolijk!

Gepost maandag 14 januari 2013 17:48:06 |


Arco
Het werkt wel, maar je doet bijna alles wat in een interrupt verboden is...
Nooit eindeloze while...wend loops, en zoals reeds gezegd door @Hadv ook geen delays...
(Je kunt geen blokkerende dingen uitvoeren, dan stopt het hoofdprogramma ook)

pic basic code:

context save
If intf = 1 then
If PORTB.0 = 0 then
clear knop
Else
set knop
End If
clear intf
End if
context restore

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Gepost maandag 14 januari 2013 18:02:02 |


deKees
Gelukkig hoef je niet naar de gevangenis als je dingen doet die verboden zijn:-).
En er is ook niks mis mee om lange delays en loops in de interrupt te gebruiken. Op een
multi-tasking machine zoals een PC is dat idd minder handig, maar in zon controllertje kan
dat geen kwaad, zeker als die verder niks te doen heeft.

Gepost maandag 14 januari 2013 18:06:43 |


Arco
Het kan ook wel, maar de interrupt heeft dan geen enkele zin meer. Kun je dan beter in het
hoofdprogramma uitvoeren.
(In PC's is het juist niet zo erg, omdat de meeste OS pre-emptive zijn)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Gepost maandag 14 januari 2013 18:58:10 |


hadv

https://www.circuitsonline.net/forum/view/110164/1/uitvoeren+interrupt+delay 14/11/16 09:39


Pagina 3 van 5
@deKees: het is niet verboden, maar het is zeker erg onverstandig en er is heel veel mis mee
omdat het hoofdprogramma en/of andere interrupts dan een tijd lang niet aan bod komen.
In dit simpele programma maakt het allemaal niet uit, maar zodra je programma wat
complexer wordt gaat het helemaal mis.

Simpel voorbeeld: in plaats van n led twee led's een seconde laten oplichten die elk op een
andere knop reageren. In de voorstelling van deKees is dat geen probleem, lekker delay'en.
Maar als er een delay van 1 sec in de interrupt handler zit zal die tweede led nooit aangaan
omdat de delay de handler blokkeert.

Waarom zou je het doen als het niet nodig is? Zo leer je nooit netjes met interrupts omgaan.
En volgens mij vroeg JojoJoppe juist om dat laatste.

JojoJoppe: een veel gebruikte werkwijze is binnen de interrupt handler een variabele een
bepaalde waarde geven die je in het hoofdprogramma afhandelt en na afhandelen weer
'reset'. Zoiets heet een semaphoor. Hierdoor blijft je interrupt handler lekker klein en snel en
kun je makkelijk meerdere interrupt sources bedienen.
In je hoofdprogramma werk je dan alle semaphoren af naast de andere taken die het
hoofdprogramma heeft.

Just find out what you like and let it kill you

Gepost woensdag 16 januari 2013 01:40:40 |


deKees
@hadv Klopt wel wat je zegt, het gebruik van langdurige functies in een interrupt heeft
zeker wel consequenties. Maar dat kan in sommige gevallen toch precies zijn wat je wilt.

Ik wil alleen maar zeggen dat er op dit gebied geen absolute wetten zijn. En het mooie aan
deze kleine controllers is dat je alles zelf in de hand hebt en zelf mag kiezen, ook als
anderen zeggen dat het niet mag...

Gepost woensdag 16 januari 2013 11:41:07 |


Hensz
Op die manier heb je dus iets aan het werk, maar je houdt geen rekening met de
consequenties. Dat komt dan later wel. Meestal al knap snel en dan maar zoeken waar het
fout gaat. Het is de moeilijke en langzame manier om iets te leren. Maar goed, het s een
methode.

Volgende oefening zou kunnen zijn om een led (en later meer en in verschillend tempo) te
laten knipperen m.b.v. een timer interrupt.

Don't Panic!

Gepost woensdag 16 januari 2013 13:07:22 |


hadv
Op 16 januari 2013 01:40:40 schreef deKees:
@hadv Klopt wel wat je zegt, het gebruik van langdurige functies in een interrupt
heeft zeker wel consequenties. Maar dat kan in sommige gevallen toch precies zijn
wat je wilt.

Elk probleem kent een aantal oplossingen, je kunt ook met het vliegtuig naar de stad gaan of
met een sloophamer een print proberen te maken. Dat wil nog niet zeggen dat het slim is.

Ik wil alleen maar zeggen dat er op dit gebied geen absolute wetten zijn. En het
mooie aan deze kleine controllers is dat je alles zelf in de hand hebt en zelf mag
kiezen, ook als anderen zeggen dat het niet mag...

Het zijn geen "absolute wetten", het zijn goed onderbouwde methoden van werken. Je legt
veel te veel nadruk op het 'mogen', daar gaat het helemaal niet om, het gaat er om of iets

https://www.circuitsonline.net/forum/view/110164/1/uitvoeren+interrupt+delay 14/11/16 09:39


Pagina 4 van 5
verstandig is.

Just find out what you like and let it kill you

Gepost woensdag 16 januari 2013 13:12:58 |


Arco
Met Picbasic zijn er nog andere problemen, omdat de functies niet re-entrant zijn.
Als je in main() aan een delay bezig bent, en je krijgt een interrupt waar je ook een delay
doet, dan loopt de zaak in de soep...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Beantwoorden E-mail notificatie

uitvoeren interrupt Alle


delaywoorden Zoek

1999-2016 Circuits Online Team Privacyverklaring

https://www.circuitsonline.net/forum/view/110164/1/uitvoeren+interrupt+delay 14/11/16 09:39


Pagina 5 van 5

You might also like