PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATtiny26 - PWM - Bascom 1.11.77



DIYLAB
07.04.2005, 21:33
Moin Leuts,

habe heute auf Arbeit einen Dimmer über PWM mit einem ATtiny26 bauen müssen und festgestellt, das Bascom bei diesem MC kein PWM über Timer1 unterstützt - gibt ne feine Meckermeldung, das im TimerConfig "PWM" unbekannt ist.

Hab dann die Register direkt gesetzt und es läuft sehr gut.
Versteh ich aber nicht - in Bascom wird der Tiny26 unterstützt - aber wohl nicht ganz - oder?

Watt ist denn da los? Hat Jemand eine Idee, warum das so ist?

LG,
Bruno

Mc.RIP
16.05.2005, 14:22
ich hatte das gleiche Problem in BASCOM und in elab pascal. Es fiel mir bei elab-pascal auf, das der PWM nur bei den Chips mit 16bit timer1 aktiviert war. Der TINY26 hat allerdings nur einen 8bit timer1. Die Compilerhersteller müssen erst speziellen Code für die Unterstützung eines PWM für 8bit Timer entwickeln, da die Registerbelegung beim 8bit timer etwas anders ist :-s

MfG

kowolfgang
03.06.2006, 00:34
Hallo,

ich hab diesen alten Thread mal wieder ausgegraben weil ich einen Tiny26 mit 2 PWM Kanälen bräuchte, die Clock für den Timer soll das interne 64MHZ PLL Signal sein, so wie es im Datenblatt beschrieben ist. Ich hab jetzt schon diverse versuche unternommen die register direkt anzusprechen aber bis jetzt war das ganze noch komplett erfolglos.

Ich hoffe ihr könnt mir helfen.
Bis jetzt hab ich nur die Register TCCR1A , TCCR1B, PLLCSR und OCR1C für die Initialisierung verwendet, für die eingabe der werte die Register OCR1A und OCR1B
Das ganze sieht dann folgendermaßen aus:

Config Portb.1 = Output
Config Portb.3 = Output

Tccr1a = &B11110011
Tccr1b = &B01000001
Pllcsr = &B00000100
Ocr1c = 127

Ocr1a = 100
Ocr1B = 200


nur irgendwie kommt da nix raus

ich hoffe ihr könnt helfen ansonsten muss halt doch wieder der Mega8 ran

DIYLAB
03.06.2006, 08:58
Moin,

der Tiny26 ist schon in PWM erstklassig.
Beim Mega 8 hast Du nicht so viele Prescaler.

So gehts beim Tiny26 mit 2 PWM-Ausgängen:




DDRB = &B11111111

Tccr1a = &B01010011
Tccr1b = &B00000111

'Prescaler (letzte 4 Bits von Tccr1b)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'0 0 0 1 /1 260Khz PWM
'0 0 1 0 /2 130KHz PWM
'0 0 1 1 /4 64KHz PWM
'0 1 0 0 /8 32KHz PWM
'0 1 0 1 /16 16KHz PWM
'0 1 1 0 /32 8KHz PWM
'0 1 1 1 /64 4KHz PWM
'1 0 0 0 /128 2KHz PWM
'1 0 0 1 /256 1KHz PWM
'1 0 1 0 /512 500Hz PWM
'1 0 1 1 /1024 250Hz PWM
'1 1 0 0 /2048 128Hz PWM
'1 1 0 1 /4096 64Hz PWM
'1 1 1 0 /8192 32Hz PWM
'1 1 1 1 /16384 16Hz PWM

Ocr1c = 255 'oberes PWM Limit setzen (wichtig beim Tiny26!)

Ocr1a = 100 'Compare für OSC1A
Ocr1b = 200 'Compare für OSC1B

Pllcsr.1 = 1 'Asynchrones PLL benutzen, 64MHz Taktquelle


'Warten bis PLL eingerastet ist
Do
Loop Until Pllcsr.0 = 1

Pllcsr.2 = 1



Viele Grüße,
Bruno

kowolfgang
03.06.2006, 10:06
Hallo Bruno,

vielen Dank du hast mir sehr weitergeholfen, das war genau der Punkt an dem ich nicht mehr weiter gekommen bin.
Stand zwar alles im Datenblatt nur irgendwie hab ichs nicht richtig kapiert.

DIYLAB
03.06.2006, 10:28
Hallo Wolfgang,

dann kann ja das Basteln am Wochenende richtig losgehen \:D/
Viel Spaß!

LG,
Bruno

Ratber
04.06.2006, 11:00
Ja,und für die Freunde die mal eben Testen wollen hier ein kleines Testproggie (Zur Version 1.11.7.3 geschrieben) das das zeigt ob die Ausgänge auch alle laufen.



'PWM Test für Attiny26
'Je eine LED + Vorwiderstand von Pin B0-3 nach masse.

$regfile = "At26def.dat"
$crystal = 1000000

Dim A As Byte

Tccr1a = &B01010011 'Manuelle Konfiguration von OC1a
Tccr1b = &B10000101 'Manuelle Konfiguration von OC1b
Ocr1c = 255 'Top Limmit

Config Pinb.0 = Output 'Port b.0 als Ausgang
Config Pinb.1 = Output 'Port b.1 als Ausgang
Config Pinb.2 = Output 'Port b.2 als Ausgang
Config Pinb.3 = Output 'Port b.3 als Ausgang

Do
Gosub Pwm
Loop

Pwm:
For A = 0 To 255
Ocr1a = A
Ocr1b = A
Waitms 2
Next
Return

End

Marco78
17.06.2006, 20:46
Ich habe ein Problem mit Timer1 als "normalen" Timer.
In einem anderen Beitrag habe ich schon gefunden, das Config Timer1... beim Tiny26 so nicht funktioniert wie beim Timer0.

Wie kann/muss ich jetzt alles einstellen, das der Timer auch als Timer funktioniert und nicht im PWM-Mode oder Compare arbeitet?

Hier die relevanten Codeteile. Mit Timer0 funktioniert(e) alles:


$regfile = "at26def.dat"
$crystal = 16000000

Led Alias Porta.4

Tccr1b = 11 'Prescale=1024 (mit 1a ändert sich auch nix)

Config Int0 = Change 'bei jeder Halbwelle reagieren
Enable Int0
On Int0 Int0_isr
On Timer1 Timer_irq
Enable Timer1
Enable Interrupts


Int0_isr:

Start Timer1

Return


Timer_irq:

Tcnt1 = Timervorgabe 'der Wert wird im Programm geändert
Set Led

Return


Der Code ist hier erstmal soweit abgespeckt, das bei Überlauf des Timers wenigstens mal eine LED leuchtet.

Der INT0 funktioniert.
Wie schon gesagt, wenn alles auf Timer0 umgeschrieben ist funktioniert alles wie es soll, aber mit Timer1 nicht. Es wird nicht in die TimerISR gesprungen.

Brantiko
04.01.2007, 14:06
Moin,
Wie kann ich mit der huier beschriebenen PWM den clear Up oder Clear Down festlegen?

Gruss

Alex

Brantiko
04.01.2007, 18:08
Moin,
Habe einfach einen anderen transtor genommen, der das Singal invertiert. Aus den On werden die OFF zeiten.. und umgekehrt.

Alex

Brantiko
24.02.2007, 12:13
Moin,
Wenn man mal im Datenblatt auf Seite 79 nachschaut sieht man dass Ocr1c je nach der Frequenz angepasst werden muss. Es ist nicht immer bloß 255.
Zudem noch ein Hineweis für all' Diejenigen die den Partnerport Frei haben wollen:

Tccr1a = &B10100011

Gruss

Alex

Ratber
24.02.2007, 14:06
Ma also,geht doch auch in eigenarbeit ;)