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

Ik zou de PWM softwarematig aanmaken.

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

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..

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

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.

http://avrhelp.mcselec.com/index.html?getrc5.htm

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

Het zal aan de TCCR1a.6... enz. moeten liggen. Is er niet toevallig nog een manier om de pwm tijdelijk te disablen?

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;)