Professional Documents
Culture Documents
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.
Ja Nee
device 16f628a
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
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
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)
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.
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
set gie
set intedg
set inte
; --------------------------------------
goto main
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
context save
If intf = 1 then
If PORTB.0 = 0 then
clear knop
Else
set knop
End If
clear intf
End if
context restore
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
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...
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!
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
Just find out what you like and let it kill you