@Rone: Wo du Recht hast ^^
@Sauerbruch: Ok, so weit, so gut. Aber wie verändere ich das jetzt?
@all: der obige Code ist Murks, da einige Unschönheiten. Ich habe es mal ganz anders gemacht und die Unschönheiten (bis auf die PWM- Frequenz) sind w.e.c.h. ...
Die Dokuentation habe ich erstmal weg gelassen, da mich dieser eingebaute Editor echt elendig genervt hat; kann man da nicht irgendwie Notepad++ integrieren?!? *grrr*
Code:$regfile = "attiny13.dat" $crystal = 4800000 $hwstack = 16 $swstack = 16 $framesize = 16 '$prog &HFF , &H72 , &HFF , &H00 ' 9,6 MHz, Vorteiler aus $prog &HFF , &H75 , &HFF , &H00 ' 4,8 MHz, Vorteiler aus Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1 'PWM im Schnellgang 'Ddrb.0 = 1 'OC0A als Ausgang konfigurieren 'Tccr0a = &B01000010 'Tccr0b = &B00000001 Dim Z As Byte , T As Byte , L As Byte Dim Du As Integer , Dd As Integer , Ot As Integer L = 8 : Du = 2000 : Dd = 2000 : Ot = 1500 Config Pinb.0 = Output Config Pinb.1 = Input : I1 Alias Pinb.1 : Portb.1 = 1 Config Pinb.2 = Input : I2 Alias Pinb.2 : Portb.2 = 1 Config Pinb.3 = Input : I3 Alias Pinb.3 : Portb.3 = 1 Enable Pcint0 Enable Interrupts Pcmsk = &B001110 On Pcint0 An Hell: While T = 0 Incr Z Pwm0a = Z If Z = 128 Then T = 1 Waitus Du Wend If T = 1 Then Waitms Ot Else Z = 127 : Goto Hell End If While T = 1 Decr Z Pwm0a = Z If Z = L Then T = 2 Waitus Dd Wend While T = 2 nop Wend Goto Hell End An: T = 0 If Z > 125 Then Z = 127 Return
... ich hätte da noch eine Frage *duck...*
Wie kann ich während der Laufzeit den als PWM laufenden Timer anhalten resp. das AUsgangssignal auf LOW setzen (und später wieder einschalten)??
Ich habe es jetzt versucht mit Disable Timer0, pinb.0=0, portb.0=0. Nichts funktioniert
Hat sich erledigt: Einfach Pwm0a = 0 und anschliessend ein Config Powermode = Powerdown funktioniert perfekt![]()
Geändert von M_I_B (17.09.2012 um 20:31 Uhr)
Auch wenn´s mit PWM0A = 0 klappt, gibt´s noch zwei einfachere Methoden (die dem Verständnis im allgemeinen und speziellen auch förderlich sein könnten):Wie kann ich während der Laufzeit den als PWM laufenden Timer anhalten resp. das AUsgangssignal auf LOW setzen (und später wieder einschalten)??
"disable timer0" wird oft anfangs fälschlicherweise so verstanden, dass man damit den Timer anhält. Dem ist aber nicht so, sondern mit diesem Befehl wird lediglich der Interrupt deaktiviert, der beim Überlaufen des Timers ausgelöst würde (entsprechend aktiviert man diesen Interrupt mit "enable timer0")
Der Befehl den Du suchst lautet ganz einfach "stop timer0" bzw. "start timer0", wenn er weiterlaufen soll.
Nur diese Frage habe ich nicht ganz verstanden:
WAS willst Du denn verändern??Aber wie verändere ich das jetzt?
Und den PWM-Pin kannst Du über das Data-Direction-Register als Eingang konfigurieren. Dann führt er weder High noch Low, sondern ist einfach nur ein hochohmiger Eingang:
DDRB.0=0
Mit DDRB.0=1 wird er dann wieder zum Ausgang!
Geändert von Sauerbruch (17.09.2012 um 21:32 Uhr)
Also... (luft hol'):Nur diese Frage habe ich nicht ganz verstanden:
Du hattest mir ja den Trick und Code mit dem CTC- Mode verraten. Wie du siehst, steht das auch auskommentiert in meinem Quelltext. Sobald ich das aber aktiviere, erhalte ich zwar ein symetrisches Rechteck, aber das ändert sich dann in der Frequenz und nicht mehr in der Pulsbreite.
Am Geschicktesten wäre m.E. eine kleine Unterroutine, die sich selbst auf die optimale Frequenz einstellt. Also Messung der Ausgangsspannung des Konverters via ADC, langsames Durchfahren des Frequenzbandes und ermitteln der optimalen Schaltfrequenz bei verschiedenen Tastverhältnissen (z.B. im 10% Raster). Das wäre deshalb sinnig, da zum einen eine zugeschnittene EL- Folie die Resonanzfrequenz verändert und zu alle dem auch noch ihre Kapazität mit der Helligkeit ändert, mal ganz abgesehen von Alterungserscheinungen solcher Folien. Mit so einer Routine könnte man nach dem Einbau z.B. bei jedem Systemstart die Werte neu ermitteln und hätte damit auch gleich eine "... bin gleich soweit..." Meldung.
Aber erst mal wäre mir damit gedient, wenn ich erstmal in die Lage komme, die Frequenz zu fixieren/einzustellen. Wenn ich dann im Nachgang durch Rumfrickeln und deiner/eurer Hilfe auch noch verstehe, was du mir da an Code an die Hand gegeben hast, dann hätte ich schon einen weiten Sprung nach vorn gemacht...
Na ja, vielleicht kriegt der Controller beim letzten Befehl dieser Sequenz ja auch einfach nur Angst...
(was natürlich nur´n Spaß...Code:While T = 2 nop Wend Goto Hell)
Ich habe zwar keinen blassen Schimmer was eine EL-Folie ist und was sie benötigt - aber zum Thema PWM kann man sicher folgendes sagen:
Entweder kannst Du die Frequenz (nahezu) stufenlos einstellen; dies geschieht im CTC-Modus, der aber ein festes Impuls-Pausenverhältnis von 1:1 liefert. Oder aber Du generierst im "normalen" PWM-Modus ein Signal, dessen Impuls-Pausenverhältnis sehr fein justierbar ist - dann kannst Du aber nur ganz bestimmte, definierte Frequenzen erzeugen (in Abhängigkeit des Prozessortaktes, des Prescalers sowie der Bitbreite des verwendeten Timers.
... macht nixIch habe schon so einiges an Silizium in die Hölle geschickt; da kann der Tiny schon gerne mal bibbern vor Angst
Ok, also geht entweder nur Frequenz oder nur PWM... Das erklärt einiges und ist ziemlich doof; wäre ja zu schön gewesen *grummel*
Kann denn ggf. ein Tiny 44, 45, 2313 o.ä. beides gleichzeitig, also Frequenz und PWM steuerbar?
Lesezeichen