PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATTiny24 4 PWM Channels nur wie ???



xennex
16.01.2008, 10:39
Hallo Leute,

ich versuche auf einem ATTiny24 die 4 PWM Channels zu nutzen, aber irgendwie macht er das nur für 2.

Timer1 funktioniert und Timer0 meckert er an ...

Was mache ich falsch, bzw. wie kann ich OC0A nutzen ?


$regfile = "attiny24.dat"
$crystal = 8000000

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Config Porta.5 = Output ' OC1B
Config Porta.6 = Output ' OC1A
Config Portb.2 = Output ' OC0A

Compare1a = 205
Compare1b = 205
Compare0a = 205

Do

Loop
End

Grüße

Mark

xennex
16.01.2008, 13:34
keiner ne Idee oder ist die Frage sooo doof, das keiner Antworten mag ?

Sauerbruch
17.01.2008, 08:36
Timer1 funktioniert und Timer0 meckert er an ...

Könnten wir das vielleicht etwas genauer haben? Z.B. wann kommt wo welche Fehlermeldung?

xennex
17.01.2008, 12:18
Also er meckert die Timer0 Zeile an (5)

Fehler = Invalid Parameter for CONFIG parameter or Value (8)

Und dann die Zeile :

Compare0a = 205

Fehler = Assignment Error (Compare0a: 0 205: 112 )

Das ganze beim compilieren.

stefan_Z
17.01.2008, 14:05
Schau mal im Datenblatt, wie die Register genau heißen!
Das is von Chip zu Chip anders... Entsprechend muss man das in Bascom auch ändern!

xennex
17.01.2008, 14:42
Register für die PWM Ports sind :

OC1A
OC1B

OC0A
OC0B

den Fehler für Timer0 hab ich weg ... der Kennt nur 8bit, daher kann und muss das PWM = 8 weg.

Aber ich kann kein Compare0a machen... das meckert der immer noch an ....

stefan_Z
17.01.2008, 15:13
Ja, du musst da pfuschen, Bascom stellt sich manchmal blöd an.
Beim Mega8 hatte ich das gleiche Problem. Man muss da teilweise Registernamen verwenden, die zwar funktionieren, aber im Editor z.B. nichtmal entsprechend formatiert werden - sieht aus wie normaler Text.

Das hier ist die Config für den M8:

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Timer2 = Pwm , Prescale = 1 , Compare Pwm = Clear Up , Pwm = On

Wie man sieht ist Timer2 schon völlig anders in der Config...
Auch der Registername ist völlig anders. Damit stellt man die PWMs z.B. alle auf 50% Dutycycle:

Compare1a = 128
Compare1b = 128
Ocr2 = 128

Was auch noch sehr wichtig ist:
Beim Mega8 MUSS man den Timer2 explizit auf ENABLE stellen - Timer1 nicht unbedingt, der tuts auch so!

Enable Timer1
Enable Timer2

Jetzt hat der M8 zwar nur 3x PWM, aber du siehst wie es im Prinzip geht.
Schau mal im Datasheet und teste verschiedene Register - irgendwann gehts...

stefan_Z
17.01.2008, 15:38
OK ich habs grad mal getestet....
Sollte gehen... hab leider keinen Tiny24 hier.


$regfile = "attiny24.dat"
$crystal = 8000000

Config Porta.5 = Output 'OC1B
Config Porta.6 = Output 'OC1A
Config Portb.2 = Output 'OC0A
Config Porta.7 = Output 'OC0B

Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1


Do
'Timer0 PWM-Register (8 Bit)
Ocr0a = 128
Ocr0b = 128

'Timer1 Register (10 Bit)
'kann man so schreiben...
Compare1a = 512
Compare1b = 512

'...oder auch so (zwei Byte):
Ocr1al = 0
Ocr1ah = 2

'Und f¸r den 2. Kanal genauso:
Ocr1bl = 0
Ocr1bh = 2
Loop
End

Ob das mit Compare1a = 512 funktioniert, weiß ich nicht, sollte es aber theoretisch.
Das wäre dann die PWM mit 10 Bit. Bei 8 Bit natürlich wieder nur 255 maximal.
Ocr1al/Ocr1al ist ein zweiteiliges Register, da 10 Bit.

Gefunden hab ich das alles auf Seite 212 des Datasheets.
http://www.atmel.com/dyn/resources/prod_documents/doc8006.pdf

0x2B (0x4B) - OCR1AH Timer/Counter1 – Compare Register A High Byte - Page 117
Entsprechend geht das dann auch für andere AVRs.[/code]

linux_80
17.01.2008, 17:31
Hallo,

bei diesen 16-Bit Registern macht es Bascom (wie auch bei C) automatisch, das der Wert aufgeteilt wird in die beiden 8-Bit.
Man muss dann nicht umrechnen, und kann direkt den Wert angeben zB.
Ocr1a = 1024.

Der Name Compare1a ist nur ein Alias den Bascom angelegt hat für OCR1A.

Mit Enable wird nicht der Timer, sondern der Interrupt dazu aktiviert, das kann auch in die Hose gehen, wenn man auch global IRQs aktiviert, und keine ISR dafür angelegt hat.

stefan_Z
17.01.2008, 19:40
Das mit dem Interrupt kann gut sein, nur Tatsache ist, dass die PWM am M8 nicht funktioniert, wenn man den einen Timer nicht auf ENABLE setzt.
Allerdings hat der auch nur 3 PWM, ist also wieder anders...

xennex
18.01.2008, 05:57
Ihr seid klasse !!!

Super die Lösung von Stefan_Z funktioniert....

Wie ihr merkt, mit den Timern hab ich mich noch nicht wirklich beschäftigt, bzw. brauchte ich bis jetzt nur 2 PWMs ...


Suuuuuper Dankeschön !!!

Mark