Heeeeeey,
Met de pwm code uit dit topic:
http://gathering.tweakers.net/forum/list_messages/1089031/0
Ben ik al een aardig stuk opgeschoten met het begrijpen van pwm maar kheb nog een paar vragen. Om het moodlight/ambilight topic niet al te veel te vervuilen ff een nieuw topic.
Voor de duidelijkheid de code nog ff
Wat ik niet snap is. Waarom er macro's gebruikt worden om elke kleur apart uit te zetten. Bijvoorbeeld: "LED_ROOD_UIT macro
BCF PORTB,0
ENDM"
Als je nu gewoon in de interupt bcf PORTB,0 zegt dan bespaar je toch weer 2 commando's?
En waarom is PWM klaar een subroutine? Beetje onhandig subroutines en macro's door mekaar gebruiken. Of is hier speciaal voor gekozen?
Verder over de interrupt routine. Hier wordt gekozen voor wel/geen prescaler. Maar wat heb je eigenlijk aan een prescaler? Deze interupt moet toch juist gewoon zo snel mogelijk afgehandeld zijn?
En over de variabele TELLER die krijgt nergens de waarde 255 maar toch heeft hij die waarde? En het nut van het STATUS register ontgaat mij ook een beetje. Het is toch eigenlijk gewoon overbodig om ook daarvan de data te backuppen en terug te zetten? De waarde in het w register daarentegen zie ik wel het nut van in.
Dan nu het tijd kritische gedeelte. Zoals ik het zie moet je ervoor zorgen zo min mogelijk commando's in de interrupt te zetten.
Waarom is er eigenljik elke 39 instructies een interrupt? Hiervoor zou je toch ook een kleiner of groter getal kunnen nemen afhankelijk van de pwm snelheid die je wil hebben?
Verder snap ik deze notatie met een punt ook niet:
movlw .255-.39 ; na 39 instructies terug interrupt.
is dit hetzelfde als movlw D"216"?
Verder over het faden wat is het makkelijkst? De gewenste waarde voor rood, groen en blauw eerst op nul zetten en dan eerst rood vol laten lopen. Dan groen laten vollopen. Dan rood weer laten leeglopen. Dan blauw laten vollopen. Groen laten leeglopen. Rood laten vollopen. Dan heb ik alle kleurencombinaties gehad lijkt mij. Maar waar zal ik wit tussen gooien?
Erg veel vragen maar er zijn vast wel mensen die op een paar het antwoord weten:P
grtz Bas
Met de pwm code uit dit topic:
http://gathering.tweakers.net/forum/list_messages/1089031/0
Ben ik al een aardig stuk opgeschoten met het begrijpen van pwm maar kheb nog een paar vragen. Om het moodlight/ambilight topic niet al te veel te vervuilen ff een nieuw topic.
Voor de duidelijkheid de code nog ff
code:
Let op dit is een iets wat aangepaste versie!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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
| ; De gebruikte macro's:
LED_AAN macro
BSF PORTB,0 ;LED_ROOD
BSF PORTB,1 ;LED_GROEN
BSF PORTB,2 ;LED_BLAUW
endm
LED_ROOD_UIT macro
BCF PORTB,0
ENDM
LED_GROEN_UIT macro
BCF PORTB,1
ENDM
LED_BLAUW_UIT macro
BCF PORTB,2
ENDM
; De gebruikte variabelen:
cblock 0x020 ; vrije plaats voor variabelen vanaf 20
ROOD_GEWENST ; de gewenste waarde voor rood |(= duty-cycle in procent * 2,55)
GROEN_GEWENST ; de gewenste waarde voor groen |(kan van 0 tot 255 zijn)
BLAUW_GEWENST ; de gewenste waarde voor blauw |(met stappen van 1)
TELLER ; de tellerwaarde waarmee bovenstaande 3 vergeleken worden
w_temp ; backup voor W, nodig in interrupt
status_temp ; backup voor status, nodig in interrupt
endc ; einde reeks variabelen
;____START_PROGRAMMA____________________________
ORG 0X000 ; hier start de PIC na een reset zijn programma
NOP ; soms is het nodig dat hier een NOP (= niets doen) staat, voor debugtoestellen
GOTO INIT ; ga naar waar je programma begint, want op 0x004 staat de interrupt
;____INTERRUPT_CODE_____________________________
ORG 0X004 ; als er een interrupt is, gaat hij naar hier
movwf w_temp ; na de interrupt werkt het programma verder alsof er niets is gebeurd
movf STATUS,w ; na de interrupt werkt het programma verder alsof er niets is gebeurd
movwf status_temp ; na de interrupt werkt het programma verder alsof er niets is gebeurd
; zorgen dat de volgende keer weer een interrupt komt.
movlw .255-.39 ; na 39 instructies terug interrupt.
movwf TMR0
BCF INTCON,T0IF ; de interrupt vlag van timerO clearen
BSF INTCON,GIE ; de interrupt terug inschakelen
;hieronder de code om de PWM te doen: RGB uitschakelen indien gewenst, en na 255 keer: PWM_KLAAR
MOVF TELLER,W ; de tellerwaarde in W zetten (om straks te vergelijken)
SUBWF ROOD_GEWENST,W ; ROOD_GEWENST - TELLER (gewenste waarde bereikt,nul, dan led uit)
BTFSS STATUS,C ; negatief, dan is carry 0 (zie datasheet bij subwf), dan volgende regel doen
LED_ROOD_UIT ; doe macro om led af te leggen.
MOVF TELLER,W ; zelfde als bij rood
SUBWF GROEN_GEWENST,W
BTFSS STATUS,C
LED_GROEN_UIT
MOVF TELLER,W
SUBWF BLAUW_GEWENST,W
BTFSS STATUS,C
LED_BLAUW_UIT
INCF TELLER,f ; verhoog teller met 1, als teller 0 wordt, sla volgende over
BTFSC STATUS,Z ; als TELLER nul is, doe volgende regel
goto PWM_KLAAR ; volledige PWM cyclus gedaan, afhandeling doen.
movf status_temp,w ; na de interrupt werkt het programma verder alsof er niets is gebeurd
movwf STATUS ; na de interrupt werkt het programma verder alsof er niets is gebeurd
swapf w_temp,f ; na de interrupt werkt het programma verder alsof er niets is gebeurd
swapf w_temp,w ; na de interrupt werkt het programma verder alsof er niets is gebeurd
retfie ; return from interrupt, keer terug waarvan je kwam.
INIT ; hier doe ik enkele instellingen, die bij het opstarten moeten gebeuren.
BANKSEL TRISA ;trisa zit in bank1
movlw b'11111111' ; op poort a allemaal ingangen
movwf TRISA
movlw b'00000000' ; op poort b allemaal uitgangen
movwf TRISB
BSF OPTION_REG,PSA ; geen prescaler voor timer0
BCF OPTION_REG,T0CS ; stel timer0 in als timer (+1 per instructie)
MOVLW b'10100000' ; Timer0 interrupt aanleggen.
movwf INTCON
BANKSEL TMR0 ;bank0
CLRF TMR0
MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON
CLRF PORTB ; alle uitgangen uit.
;____START_CODE_________________________________
MAIN
movlw D'10'
movwf ROOD_GEWENST
movlw D'255'
movwf GROEN_GEWENST
movlw D'255'
movwf BLAUW_GEWENST
GOTO MAIN
PWM_KLAAR
nop
LED_AAN
RETURN
END |
Wat ik niet snap is. Waarom er macro's gebruikt worden om elke kleur apart uit te zetten. Bijvoorbeeld: "LED_ROOD_UIT macro
BCF PORTB,0
ENDM"
Als je nu gewoon in de interupt bcf PORTB,0 zegt dan bespaar je toch weer 2 commando's?
En waarom is PWM klaar een subroutine? Beetje onhandig subroutines en macro's door mekaar gebruiken. Of is hier speciaal voor gekozen?
Verder over de interrupt routine. Hier wordt gekozen voor wel/geen prescaler. Maar wat heb je eigenlijk aan een prescaler? Deze interupt moet toch juist gewoon zo snel mogelijk afgehandeld zijn?
code:
1
2
3
4
5
6
7
8
9
| BSF OPTION_REG,PSA ; geen prescaler voor timer0
BCF OPTION_REG,T0CS ; stel timer0 in als timer (+1 per instructie)
MOVLW b'10100000' ; Timer0 interrupt aanleggen.
movwf INTCON
BANKSEL TMR0 ;bank0
CLRF TMR0
MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON |
En over de variabele TELLER die krijgt nergens de waarde 255 maar toch heeft hij die waarde? En het nut van het STATUS register ontgaat mij ook een beetje. Het is toch eigenlijk gewoon overbodig om ook daarvan de data te backuppen en terug te zetten? De waarde in het w register daarentegen zie ik wel het nut van in.
Dan nu het tijd kritische gedeelte. Zoals ik het zie moet je ervoor zorgen zo min mogelijk commando's in de interrupt te zetten.
Waarom is er eigenljik elke 39 instructies een interrupt? Hiervoor zou je toch ook een kleiner of groter getal kunnen nemen afhankelijk van de pwm snelheid die je wil hebben?
Verder snap ik deze notatie met een punt ook niet:
movlw .255-.39 ; na 39 instructies terug interrupt.
is dit hetzelfde als movlw D"216"?
Verder over het faden wat is het makkelijkst? De gewenste waarde voor rood, groen en blauw eerst op nul zetten en dan eerst rood vol laten lopen. Dan groen laten vollopen. Dan rood weer laten leeglopen. Dan blauw laten vollopen. Groen laten leeglopen. Rood laten vollopen. Dan heb ik alle kleurencombinaties gehad lijkt mij. Maar waar zal ik wit tussen gooien?
Erg veel vragen maar er zijn vast wel mensen die op een paar het antwoord weten:P
grtz Bas