Hallo MueThoS,
Timer0 und PWM gehen nicht zusammen.
Du must Timer1 (OC1x) oder Timer2 (OC2) nehmen.
Gruß Dirk
Hallo zusammen!
Ich Suche schon seit Tagen im INet und auch speziell hier im Forum nach Beispielen die mich verstehen lassen wie das funzt.
Irgendwie finde ich da nichts was mich weiter bringt.
Deshalb möchte ich hier mal meinen Speziellen Fall ansprechen:
Ich habe die RN-Control mit dem Atmega32.
Durch die DCF77 Steuerung fällt Timer1 raus (steht zumindest so in der Doku).
Heißt doch das ich nur Timer0 nehmen kann, oder?
Und Ports sollten PD4 und PD5 sein. Wobei PD4 B ist und PD5 A
Ich möchte nun mit einem Ausgang die Led-Beleuchtung des Displays und mit dem anderen den Kontrast regeln.
Kontrast ist erstmal zweitrangig!
Also muß ich:
1. Die Ports als Ausgang einrichten
2. Den Timer0 als PWM mit predingsbums und so
3. Werte raus geben
oder sehe ich das falsch?
Da kommt nur leider immer invalid parameterCode:Config Pind.4 = Output Config Pind.5 = Output Config Timer0 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Pwm1a = 0 Pwm1b = 0
Gültige Werte sind von 0 bis 255, richtig?
Hilfe, bitte....
Wenn ich das verstanden habe kanns wieder weiter gehen!
Im mom hänge ich da total fest.
Meine kleine HP
Auf meiner HP werde ich versuchen meine Arbeiten zu dokumentieren!
Hallo MueThoS,
Timer0 und PWM gehen nicht zusammen.
Du must Timer1 (OC1x) oder Timer2 (OC2) nehmen.
Gruß Dirk
Achsooo,
hmmm.
Wie gesagt Timer 1 fällt wohl aus oder?
Weil der für die DCF77-Auswertung schon in Benutzung ist.
Bleibt Timer2, richtig.
Mit Timer2 kann ich aber nur einen PWM erzeugen. oder? (PD7)
Böse Falle!
Gibts alternativen?
Meine kleine HP
Auf meiner HP werde ich versuchen meine Arbeiten zu dokumentieren!
Such 'mal nach "Software-PWM".Gibts alternativen?
Z.B. hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=38460
Gruß Dirk
Ok, habe mal ein wenig experimentier!
Habe folgenden (gekürzten) Code:
Grundlage ist ja die RN-Control mit dem 16mHz QuarzCode:' PortD 1 PWM für Beleuchtung ' PortD 2 PWM für Kontrast ' Chip-Settings $regfile = "m32def.dat" $crystal = 16000000 $hwstack = 128 $swstack = 128 $framesize = 128 $baud = 19200 Config Timer0 = Timer , Prescale = 256 Dim Timercounter As Byte Config Portd.0 = Output Config Portd.1 = Output ' Zählvariable für die PWM On Timer0 Pwm_isr Enable Timer0 ' timer0 interrupt ein Enable Interrupts ' Global Interrupt ein ..... ..... Pwm_isr: If Timercounter < Dimmer Then Set Portd.0 Else Reset Portd.0 End If If Timercounter < Kontrast Then Set Portd.1 Else Reset Portd.1 End If Timercounter = Timercounter + 1 If Timercounter = 255 Then Timercounter = 0 Return
Nur habe ich irgendwie das gefühl das das nicht klappen wird.
Ich habe Testweise 2 LEDs angeschlossen.
Und entweder flackern die oder wenn ich den prescale runter setze scheint der rest meines Programms nicht mehr richtig zu laufen.
Deshalb frage ich nochmal generell nach.
An und für sich ist das so eine richtiger Software-PWM oder?
Meine kleine HP
Auf meiner HP werde ich versuchen meine Arbeiten zu dokumentieren!
Hallo,
also ich würde ja sagen diese Zeilen überschneiden sich in der Funktion, wobei die Erste Vorrang hat !
Lass mal $baud weg, und stelle sicher, das kein Print im Programm vorkommt !Code:$baud = 19200 .... Config Portd.0 = Output Config Portd.1 = Output
Ups, das habe ich hier vergessen zu ändern!
Mir ist beim überprüfen der Ports dann auch aufgefallen das diese ja für die Serielle Schnittstelle in Benutzung sind.
Ich habe die Ports dann geändert auf D2 imd D3 aber ist das selbe Problem.
Sobald ich auf sagen wir mal halben Wert gehe flackert es.
Ich will jetzt nich sagen das ich mit zählen könnte aber es flackert schon extrem.
Meine kleine HP
Auf meiner HP werde ich versuchen meine Arbeiten zu dokumentieren!
Hallo MueThoS,
Ja, das geht als Software-PWM durch, funktioniert aber so noch nicht ganz. In der ISR (Pwm_isr) würde ich die Ports nicht gezielt Setzen/Zurücksetzen, sondern Toggeln (Toggle Portd.x), wenn ein bestimmter Wert (Dimmer, Kontrast) erreicht ist. Der Sinn ist ja, dass der Port nicht in jeder ISR getoggelt wird, sondern nur in der Dimmer-tsten oder Kontrast-sten ISR. Wenn dann der Wert erreicht ist, muss der zugehörige Zähler auf 0 gesetzt werden. Letztlich braucht man dann auch 2 Zähler, die man getrennt voneinander in der ISR zurücksetzen kann.An und für sich ist das so eine richtiger Software-PWM oder?
In der jetzigen Version kannst du die Zeile "If Timercounter = 255 Then Timercounter = 0" weglassen, weil bei 255 + 1 wieder 0 erreicht ist.
Gruß Dirk
Achsooo,
Dann waähre es so richtig, oder?Code:' Timer0 für die PWM Config Timer0 = Timer , Prescale = 256 Dim Dimmercounter As Byte ' Zählvariable für die PWM Dimmer Dim Kontrastcounter As Byte ' Zählvariable für die PWM Kontrast Config Portd.2 = Output Config Portd.3 = Output .... On Timer0 Pwm_isr Enable Timer0 ' timer0 interrupt ein Enable Interrupts ' Global Interrupt ein .... .... Pwm_isr: If Dimmercounter = Dimmer Then Toggle Portd.2 Dimmercounter = 0 Else Dimmercounter = Dimmercounter + 1 End If If Kontrastcounter = Kontrast Then Toggle Portd.3 Kontrastcounter = 0 Else Kontrastcounter = Kontrastcounter + 1 End If Return
Was ich halt so komsich finde ist das das so garnicht funktioniert wie ich das will!
Wenn ich es so mache wie jetzt hier in der Code-Box und stelle einen Wert auf 255 dann Blinkt diese Led ca im Sekundentakt (hab kein Ossi)
Das würde aber doch heißen das er eine Sekunde braucht um bis 255 zu zählen, oder sehe ich das falsch.
Und ich dächte das müßte er schneller können.
Meine kleine HP
Auf meiner HP werde ich versuchen meine Arbeiten zu dokumentieren!
Der Vorteiler ist bei dir (16 MHz Takt, Prescaler 256) 62,5 kHz. Wenn in jeder 255. ISR getoggelt wird, dann passiert das ca. 245x pro Sekunde.... stelle einen Wert auf 255 dann Blinkt diese Led ca im Sekundentakt (hab kein Ossi)
Das dürfte nicht mehr zu sehen sein, d.h. die LED sieht man dann nicht blinken.
Gruß Dirk
Lesezeichen