Lima, je bent op de goeie weg, maar bent er even van afgeweken. Ik raad je aan eens de datasheet van de PIC die ik gebruik te lezen, en dan vooral van de interrupts en van Timer0, en eens te kijken welke instellingen ik maak (dan zal je helemaal snappen hoe het allemaal werkt, het is heel simpel eenmaal je het doorhebt, ik heb er me ook door moeten worstelen

)
1) De mainlus is inderdaad nu een oneindige lus (das altijd zo bij een PIC, je moet je prog blijven uitvoeren) waarin nu niets gebeurd, daarin voeg je alle code toe die je wil uitvoeren. (bijvoorbeeld via de UART communiceren, de gewenste waarden aanpassen, knopjes uitlezen,...)
2) Op een knop drukken, hoeft bij een PIC helemaal geen interrupt te zijn (bij de 627 kan je maar 4 pinnen met een interrupt gebruiken), meestal zal je "pollen". Als op een ingang een '1' of een '0' staat, wordt de overeenkomstige bit in het register van die poort ook op '1' of '0' gezet. Door in je mainlus te kijken naar die bit's (pollen noemt men dat), kan je zien of er op de knop wordt gedrukt, en kan je overeenkomstige acties ondernemen.
3) Als het niet door de knoppen is, hoe komt ie dan in zijn interrupt routine? Door Timer0, wanneer deze overflowt (van 255 naar 0 gaat), dan (heb ik ingesteld) is er een interrupt. Dit wil zeggen dat hij springt naar adres 0x04, das waar de interrupt routine staat. Hij voert eerst deze code uit, tot hij bij "RETFIE" komt, dan springt hij terug naar waar hij vandaan kwam (ergens in de mainlus) en gaat hij verder met het uitvoeren van de mainlus alsof er niets gebeurd is.
Timer0 verhoogt met 1, elke kloktik. Ik wil elke 39 kloktikken in de interrupt geraken (zie berekening in een hogere post), dus zet ik in de interruptroutine de Timer0 op 39 kloktikken voor de overflow (die na waarde 255 komt).
4) Hoe doet ie nu de aansturing van die rgbLED?
Erg simpel: elke 39 kloktikken kom ik in de interrupt (volgt uit 3), hierin laat ik een tellertje telkens 1tje verhogen. Wanneer het tellertje op 255 komt, zet ik het weer op 0, en zet ik de led's aan. Wil ik dat de led 0% van de tijd brand, staat in de gewenste waarde 0, en zal de LED direct uitgeschakeld worden. Staat hier 170 in, zal die ongeveer 50% branden (na 170 keer 39 kloktikken uit), en zo verder. Dat had je inderdaad goed begrepen, door gewenste waarde met teller te vergelijken.
Dan nog een laatste cadeautje, met name mijn code die ik gebruik om met de knopjes te kunnen testen. Ik gebruik een knopje up/down (met indicatieled), ingedrukt = down denk ik. Daarnaast de 3 knopjes voor RGB, die erg simpel ontdenderd (en tegelijkertijd vertraagd) zijn, als de PIC 200 keer heeft gezien dat de knop ingedrukt is, dan pas wordt de gewenste waarde aangepast.
Let wel op: vooral dit stuk is een van de vele mogelijke oplossingen. Het kan ongetwijfeld beter/anders opgelost worden. En wees er trouwens maar zeker van dat er nog fouten/kleine onjuistheden zitten in mijn code (ook al werkt ze in mijn PIC), dat is altijd zo met een eerste versie (mijn timing is denk in niet in orde, de led volledig doven lukt niet, ik heb er ook nog niet naar gekeken).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| MAIN
CALL KNOPJES
GOTO MAIN
PWM_KLAAR
LED_AAN
RETURN
KNOPJES ;Hier lees ik de knopjes uit, en doe ik er iets mee
BCF PORTB,5 ;led up/down uit
BTFSC PORTA,0 ;wordt knop up/down ingedrukt?
BSF PORTB,5 ; dan led up/down aan
btfsc PORTA,1
INCF R_KNOP,f
MOVLW .200 ; na 200 passages (==> vertraging),
SUBWF R_KNOP,W ; waarbij op de knop wordt gedrukt
BTFSC STATUS,C ; dit is het kijken of de 200 al gehaald is
CALL R_AANP ; moet de waarde aangepast worden
btfsc PORTA,2
INCF G_KNOP,f
MOVLW .200 ; na 200 passages (==> vertraging),
SUBWF G_KNOP,W ; waarbij op de knop wordt gedrukt
BTFSC STATUS,C ; dit is het kijken of de 200 al gehaald is
CALL G_AANP ; moet de waarde aangepast worden
btfsc PORTA,3
INCF B_KNOP,f
MOVLW .200 ; na 200 passages (==> vertraging),
SUBWF B_KNOP,W ; waarbij op de knop wordt gedrukt
BTFSC STATUS,C ; dit is het kijken of de 200 al gehaald is
CALL B_AANP ; moet de waarde aangepast worden
RETURN
R_AANP
CLRF R_KNOP
BTFSS PORTA,0 ; als knop down/up niet ingedrukt wordt
INCF ROOD_GEWENST,f ;up
BTFSC PORTA,0 ; als knop down/up ingedrukt wordt
DECF ROOD_GEWENST,f ;down
RETURN
G_AANP
CLRF G_KNOP
BTFSS PORTA,0 ; als knop down/up niet ingedrukt wordt
INCF GROEN_GEWENST,f ;up
BTFSC PORTA,0 ; als knop down/up ingedrukt wordt
DECF GROEN_GEWENST,f ;down
RETURN
B_AANP
CLRF B_KNOP
BTFSS PORTA,0 ; als knop down/up niet ingedrukt wordt
INCF BLAUW_GEWENST,f ;up
BTFSC PORTA,0 ; als knop down/up ingedrukt wordt
DECF BLAUW_GEWENST,f ;down
RETURN
LED_BLAUW_UIT ; alleen nodig omdat ik 2 blauwe led's gebruik.
BCF PORTB,2
BCF PORTB,3
return
END |
Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.