Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Beste mensen,
Hoe krijg ik, werkende met een ATtiny2313, op één PWM poort én PWM én knipperen, afhankelijk van de waarde van een variabele?
Ik kan me voorstellen dat dit problemen oplevert aangezien ik dan een als OC0A geconfigureerde poort probeer handmatig '1' of '0' te maken. Is het ook mogelijk om de PWM output op meerdere ports te krijgen? Dus daarmee bedoel ik éénzelfde signaal op 2 pinnen.
Iemand een idee?
Jim
Wat je kan doen is de is COM0A in TCCR0A(zie datasheet blz 77) 0 maken wanneer je de PWM niet nodig hebt. En dan software matig knipperen.
Welke pinnen is de vraag. Je kunt de tweede PWM generator gebruiken maar anders gaat dat niet.
Wat je kunt doe eventueel "hardware software pwm" doen.
Robin
Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Dus je bedoelt met delays? Maar dan werk ik met delay loops in een if-then structuur die in een do-loop zit. Dat wilde ik eigenlijk voorkomen:)
Of hoe bedoel je dat?
Edit: @robin: ik zag je reactie te laat, maar dat is inderdaad een optie. Ik zal het eens gaan proberen;)
Het was de bedoeling de op de PWM pinnen eenzelfde PWM signaal gelijktijdig te zetten, terwijl op die zelfde pinnen ook geknippert wordt afhankelijk van een var die getoggled wordt door een PCINT. Hierdoor kan ik dus van prog wisselen door op een drukknop/ab te drukken.
Bedankt.
[Bericht gewijzigd door Beroepsprutser op (54%)]
Op 4 februari 2009 18:12:31 schreef Beroepsprutser:
Dus je bedoelt met delays? Maar dan werk ik met delay loops in een if-then structuur die in een do-loop zit. Dat wilde ik eigenlijk voorkomen:)
Je kunt pwm prima afhandelen met interrupts lijkt me..
Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Hij begint mooi met knipperen zoals moet, maar wanneer een van de knoppen op de ab worden ingedrukt valt de led stil en was het dat. Gebruik ik misschien ergens een timer dubbel of zo?
$regfile = "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"
Config Portb = Output
Config Portb.0 = Input
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Rc5 = Pinb.0
Enable Pcint
On Pcint Pin_change
Pcmsk = &B00000001
Dim Address As Byte , Command As Byte
Dim Pin_change_flag As Boolean
Enable Interrupts
Pin_change_flag = 0
Command = 12
Tccr0a.6 = 0
Tccr0a.7 = 0
Do
If Pin_change_flag = 1 Then
Getrc5(address , Command)
If Command = 12 Then
Tccr0a.6 = 0
Tccr0a.7 = 0
Elseif Command = 13 Then
Tccr0a.6 = 1
Tccr0a.7 = 1
End If
Pin_change_flag = 0
Else
If Command = 12 Then
'begin eerste programma
Portb.2 = 0
Waitms 500
Portb.2 = 1
Waitms 500
'einde eerste programma
Elseif Command = 13 Then
'begin tweede programma
Pwm0a = Pwm0a + 1
Waitms 10
'einde tweede programma
End If
End If
Loop
Pin_change:
Pin_change_flag = 1
Return
End
klein is fijn
Moderator
Since a timer is needed for accurate delays and background processing TIMER0 is used by this statement.
Also the interrupt of TIMER0 is used by this statement.
TIMER0 can be used by your application since the values are preserved by the statement but a delay can occur. The interrupt can not be reused.
Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Dit is wat ik nu heb maar het werkt nog niet, alles omgezet in TIMER1 (misschien is dat het?).
$regfile = "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"
Config Portb = Output
Config Portb.0 = Input
Config Timer1 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Rc5 = Pinb.0
Enable Pcint
On Pcint Pin_change
Pcmsk = &B00000001
Dim Address As Byte , Command As Byte
Dim Pin_change_flag As Boolean
Enable Interrupts
Pin_change_flag = 0
Command = 12
Tccr1a.6 = 0
Tccr1a.7 = 0
Do
If Pin_change_flag = 1 Then
Getrc5(address , Command)
If Command = 12 Then
Tccr1a.6 = 0
Tccr1a.7 = 0
Elseif Command = 13 Then
Tccr1a.6 = 1
Tccr1a.7 = 0
End If
Pin_change_flag = 0
Else
If Command = 12 Then
'begin eerste programma
Portb.3 = 0
Waitms 500
Portb.3 = 1
Waitms 500
'einde eerste programma
Elseif Command = 13 Then
'begin tweede programma
Pwm1a = Pwm1a + 1
Waitms 10
'einde tweede programma
End If
End If
Loop
Pin_change:
Pin_change_flag = 1
Return
End
Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Het zal aan de TCCR1a.6... enz. moeten liggen. Is er niet toevallig nog een manier om de pwm tijdelijk te disablen?
Beroepsprutser
Natuurkundestudent met elektronica-aspiraties
Uiteindelijk is het zowat gelukt, omdat ik een timer te kort kwam heb ik nog een tiny13 extra gebruikt. Dit is mijn code geworden:
Tiny2313:
$regfile = "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"
Declare Sub Knipper
Declare Sub Fading
Config Portb = Output
Config Portb.0 = Input
Config Rc5 = Pinb.0
Pcmsk = &B00000001
On Pcint Pin_change
Enable Pcint
Dim Address As Byte , Command As Byte
Dim Pin_change_flag As Boolean
Dim Subbie As Boolean
Pin_change_flag = 0
Subbie = 0
Enable Interrupts
Gosub Knipper
Pin_change:
Pin_change_flag = 1
Toggle Portb.5
Return
Sub Knipper:
Config Timer1 = Pwm , Prescale = 1 , Compare A = Disconnect , Compare B = Disconnect , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
Pin_change_flag = 0
Enable Pcint
Do
If Pin_change_flag = 1 Then
Gosub Checkrc5
Else
Portb.3 = 1
Portb.4 = 0
Waitms 250
Portb.3 = 0
Portb.4 = 1
Waitms 250
End If
Loop
End Sub
Sub Fading:
Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Pcint
Do
If Pin_change_flag = 1 Then
Gosub Checkrc5
Else
Pwm1a = Pwm1a + 1
Pwm1b = Pwm1a
Waitms 10
End If
Loop
End Sub
Checkrc5:
Getrc5(address , Command)
If Address < 255 Then
Disable Pcint
Toggle Subbie
If Subbie = 1 Then
Pin_change_flag = 0
Gosub Knipper
Elseif Subbie = 0 Then
Pin_change_flag = 0
Gosub Fading
End If
End If
Return
End
tiny13
$regfile = "attiny13.dat"
$crystal = 9600000
Config Portb = Output
Do
Portb = 0
Portb.4 = 1
Waitms 100
Portb = 0
Portb.0 = 1
Waitms 100
Portb = 0
Portb.2 = 1
Waitms 100
Portb = 0
Portb.3 = 1
Waitms 100
Portb = 0
Portb.1 = 1
Waitms 100
Loop
(Let niet op de volgorde van poorten bij het tiny13 programma, dat kwam toevallig goed uit in de hardware;)