PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzweifel : Attiny26 + Timer + PWM



hellraider
12.01.2007, 22:13
Hallo,
ich versuche jetzt schon verzweifelt seit 3 Tagen, den Attiny26 dazuzubewegen, ein PWM-Signal auszugeben.
Habe hier im Forum auch schon diverse Beiträge dazu gelesen,
werde aber irgendwie nicht schalu drauß.
Entweder ich stelle mich wie ein Hund zum Eier legen oder :Haue

Ich habe mal mein Prog. hierher gestellt, mit der bitte ob sich es vielleicht mal jemand anschauen kann.
Was mache ich falsch, oder bin ich völlig auf dem Holzweg.
Vielleicht kann mir ja auch jemand mal ein einfaches Prog. schreiben, das ganz einfach, ohne irgendwelchen Schnickschnack ein PWM-Signal an dem Port B.5 rausgibt.

Bin für jede Hilfe dankbar.
Mein nächster Schritt wäre dann Umstieg auf Atmega8.


'------------------------------------------------------------
' ATTINY26 test file
'------------------------------------------------------------
$regfile = "at26def.dat"
$crystal = 1000000

Tccr1a = &B11110011
Tccr1b = &B01000001
Pllcsr = &B00000100
Ocr1c = 127
Config Pinb.5 = Output

Dim I As Byte
Do

For I = 1 To 255
Ocr1a = I
Waitms 5
Next I
For I = 255 To 1 Step -1
Ocr1a = I
Waitms 5
Next I
Loop

End


Danke schon mal im vorraus
Gruß hellraider

digitali
12.01.2007, 22:53
Hallo,

was aehnliches habe ich gerade mit einem ATmega8 zu Testzwecken zusammengebrutzelt:
http://www.elektronik-web.de/pwm_test.jpg

Allerdings habe ich hier noch einen Infrarotempfaenger (TSOP1136) mit aufs Board gebastelt (Stichwort RC5). Mit ner Standart TV-Fernbedienung schalte ich eine Gluehlampe mit der "1" ein und mit der "2" wieder aus. Mit der "4" wird heller gedimmt und mit der "5" dunkler.
Auf PortB.0 wird hier das PWM-Signal erzeugt.
Ich benutze da ein simples PWM-Beispiel mit einem 8Bit Timer aus dem Claus Kuehnel Buch von Seite 159.
Da der Timer0 schon von der Infrarotgeschichte benutzt wird, habe ich hier den Timer 2 verwendet.

Die kleine Gluehlampe (12V) wird ueber einen BD243 geschaltet, der ueber nen 1K direkt an PortB.0 haengt.

Aus dem folgenden Code (ist sicherlich nicht optimal), musste Dir das wichtigste rausfischen.


$regfile = "m8def.dat"
$crystal = 12000000
Const True = 1
Const False = 0
Config Pinb.0 = Output
Config Rc5 = Pinb.1
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.0 , Rs = Portd.1
Config Lcd = 16 * 4
Config Timer2 = Timer , Prescale = 64
Ausgang Alias Portb.0
On Timer2 Timer2_isr
Dim Hi As Byte
Dim Lo As Byte
Dim Phase As Bit
Dim Address As Byte , Command As Byte
Dim A As Integer
Lo = 1
Phase = True
Enable Timer2
Enable Interrupts
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "PWM-Test"
Lo = 0
Hi = 0
A = 0

Do

Getrc5(address , Command)
If Address <> 255 Then
Command = Command And &B01111111
Select Case Command
Case 1 : A = 0
Case 2 : A = 255
Case 4 :
A = A - 5
If A <= 0 Then A = 0
Case 5 :
A = A + 5
If A >= 255 Then A = 255
End Select
Lo = A
Hi = 255 - Lo
Locate 3 , 1
Lcd A ; " "
End If
Loop

End

Timer2_isr:
If Phase = True Then
Ausgang = 1
Timer2 = Lo
Phase = False
Else
Ausgang = 0
Timer2 = Hi
Phase = True
End If
Return


Mit freundlichen Gruessen
Digitali

hellraider
12.01.2007, 23:10
Danke für die Info,
aber leider nützt mir das nichts.
Denn wie ich aus dem Forum rausgelesen habe, geht das mit dem Timer beim Attiny 26 nicht so einfach.
Trotzdem Danke

linux_80
13.01.2007, 00:20
Hallo,
ich hab mal versucht, Dein Programm mithilfe des Datenblattes nachvollziehen zu können.
Schau mamal,
Es wird PB5 auf Output gestellt, aber im Programm kommt das sonst nicht mehr weiter vor, also braucht man es eigentlich nicht.
Die Taktquelle des Timers ist 64MHz, der Prescaler ist 1, als gehen die 64MHz so an den Timer.
In TCCR1A wird eingestellt, das bei einem Comparematch die Ausgänge OCR1A und ORC1B gesetzt werden, die Pins sind aber nicht auf Ausgang gestellt. Der Ttimer zählt bis zum Wert von OCR1C (ist 127) fängt dann von 0 an.
Da OCR1A & B nicht verändert werden, sind die 0, weiss nicht was das ergibt.

So wie das ausschaut zählt sich der Timer einen ab, aber man hat nix davon :-k

Evtl. mal die Takquelle etwas langsamer auswählen, oder einen grösseren Prescaler, sodass man auf ein paar Hz kommt um etwas zu sehen, falls eine LED am Ausgang hängt.
Die Register OCR1A oder B setzen, damit der Timer/Counter auch was zu zählen hat.
Die richtigen Pins auf Ausgang stellen.

Wenn die Taktquelle bei 64MHz bleibt, der Prescaler auf 16384 und ORC1x auf 255, könnte ein Takt von 15Hz rauskommen :-k dann könnte man schon etwas erkennen am Ausgang. Es müsste aber noch auf Toggle umgestellt werden, da die LED sonst nur sehr kurz an, bzw. aus, geht (ca . 1 Takt lang).


HTH


PS:
ja, ich hab keinen T26 8-[

Hanni
13.01.2007, 12:21
Wenn ich mich recht entsinne müssen die OCx Pins schon als Ausgang konfiguriert sein damit da auch was rauskommt.
Er wird nicht zählen können, wenn als Taktquelle zwar die PLL (64 MHz) ausgewählt ist, diese aber zugleich nicht aktiviert wurde. (Datenblatt S.75)
OCR1C sollte mit 255 geladen werden, da dieses den Timer Overflow definiert.

Mein Fazit: lade Pllcsr mal mit &B00000000, konfiguriere PB0 - PB3 als Ausgang und lade OCR1C mit 255. Dann könnte es vielleicht gehen (jedenfalls lese ich das so aus dem Datenblatt heraus).

Grüße,
Hanni

kowolfgang
13.01.2007, 14:03
Hallo,

Das ganze hatten wir "neulich" schonmal. Und zwar hier: Klick (https://www.roboternetz.de/phpBB2/viewtopic.php?t=8333)

Da gibts auch ein paar gute Beispielcodes die sollten eigentlich funzen


Gruß Wolfgang