Werbung
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
... niemand sacht das, aber ich bin schon so lange in Foren unterwegs (da gab es das WWW noch gar nicht), das ich da vorsichtig geworden bin![]()
Sodele... Software ist fertig und tut, was sie soll. Anbei der Quellcode zur allgemeinen Verwendung, falls es wer braucht.
PB0 befeuert direkt einen kleinen FET (3A- Typ aus der Grabbelkiste), der wiederum einen 1:10 Übertrager mit umzu 6V befeuert, der wiederum auf der Sekundärseite eine EL- Folie zum leuchten bringt.
Der Teil ist erst im Kopf fertig und wird wohl morgen zusammen gesteckt.
PB1 kümmert sich um Änderungen bei Druck auf das Wählrad, PB2 und PB3 um Statusänderungen beim Drehen des Rades... Welches Rad fragt ihr? Wählrad RC Sender Spektrum DX- Serie... Und nu ist wohl auch klar, das ich nicht nur schnöde das Display beleuchten möchte, sondern das auch schön haben will
Code:$regfile = "attiny13.dat" $crystal = 4800000 '$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 Dim Z As Byte , T As Bit , L As Byte ' Z= Zähler P-Breite, T= dunkel/hell, PWM Startwert Dim M As Bit , N As Bit , W As Byte , D As Byte ' Merker für Rollen Eingänge, Geschwindigkeit Dimmer, AN- Zeit L = 8 : W = 10 : D = 10 ' Vorbelegen Config Pinb.0 = Output ' PWM Ausgabe Config Pinb.1 = Input ' INT0 Eingang (Klicktaste) Config Pinb.2 = Input ' Eingang Rollen links Config Pinb.3 = Input ' Eingang rollen rechts Portb.1 = 1 ' Pullup einschalten Portb.2 = 1 ' Pullup einschalten Portb.3 = 1 ' Pullup einschalten On Int0 Isr_display ' Sprungziel bei Auslöung Config Int0 = Change ' Jeden Pegelwechsel nutzen Enable Int0 ' INT0 einschalten Gosub Isr_display ' Erstmal beim EInschalten Licht machen Do ' Start Hauptschleife While T = 1 ' Licht ist an, also Ausdimmen Decr Z Pwm0a = Z If Z = L Then T = 0 ' Ende, wenn Startwert erreicht Waitms W ' Geschindigkeit des Dimmens Wend If Pinb.2 = M Then ' Start Abfrage der Rollen- Eingänge M = 1 : Gosub Isr_display ' und Sprung, wenn sich was geändert hat End If If Pinb.2 = M Then M = 0 : Gosub Isr_display End If If Pinb.3 = N Then N = 1 : Gosub Isr_display End If If Pinb.3 = N Then N = 0 : Gosub Isr_display End If ' Fertig mit der Auswertung Loop Isr_display: ' INT- und Sprungziel Disable Int0 ' Erstmal für Ruhe sorgen While T = 0 Incr Z Pwm0a = Z If Z = 128 Then T = 1 ' Bis 50% Puls/Pause hochzählen Waitms W Wend Wait D ' Display für D Sekunden an lassen Enable Int0 ' Ab jetzt wieder horchen Return ' und zurück zum Hauptprogramm End
Schön dass es klappt!
Aber es wäre gar nicht nötig gewesen die Resonanzfrequenz des Übertragers anzupassen - denn man kann die PWM-Frequenz auch nahezu stufenlos variieren. Das geht im sogenannten "CTC"-Modus. CTC heißt "Clear Timer on Compare". Der Timer zählt in diesem Modus von 0 aufwärts, und wenn er den Wert des OCR-Registers erreicht, toggelt er einen Ausgang und wird sofort auf 0 gesetzt, um wieder von vorne zu beginnen. Heißt also, dass der Ausgang umso öfter getoggelt wird, je niedriger der Wert im OCR-Register ist - und den kann man ja in 256 Schritten variieren. In den Datenblättern sind sehr schöne, aufschlussreiche Grafiken hierzu abgebildet. Auch wenn´s jetzt auch schon mit der "festen" Frequenz funktioniert - aber vielleicht brauchst Du ja irgendwann noch mal eine variable Frequenz![]()
... hu? Da ich sowieso noch nicht fertig bin, lass mich mal wissen, wie man dieses Register in Bascom setzen kann? Ich finde da nix zu (oder ich sehe es einfach nicht). Einfach ein compare0a=x klappt ja so nicht ...
BTW:
Nach einigem Rumspielen habe ich mal eine andere Merkwürdigkeit entdeckt...
Wenn man die Wait- Statements mit den vorbelegten Variablen W und D besetzt, schmiert der Tiny irgendwann ab, wenn man abwechselnd einen INT und eine der beiden anderen Eingänge triggert. Wenn man aber die Wait's mit fixen Werten setzt, dann passiert das nicht
Der Interrupt bringt wahrscheinlich die Waitschleife durcheinander.
Wenn ein Interrupt ausgelöst wird, müssen bestimme Registerinhalte gesichert werden. Eventuell macht dir das Schwierigkeiten.
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
... das kann natürlich sein, ist natürlich doof, wenn dem so sein sollte *hmmmm*
BTW: Meine Nachbildung der "Change" Funktion für die anderen beiden Engänge funktioniert nicht korrekt; ich rätsel noch... oder geh ins Bett ...
Also, ich setzte bei PWM-Anwendungen die beiden relevanten Register immer direkt. Wenn man sich da einmal reingedacht hat, ist es eigentlich ziemlich einfach. Eine gute Beschreibung des CTC-Modus findest Du auf Seite 63 im Datenblatt des Tiny13.Da ich sowieso noch nicht fertig bin, lass mich mal wissen, wie man dieses Register in Bascom setzen kann?
Falls Du es aber ohne viel Kopfzerbrechen testen möchtest, probier mal folgendes:
Wenn Du diesen Code vor die Do-Loop-Schleife stellst, müsste am Port B.0 ein Rechtecksignal anliegen, dessen Frequenz zwischen CLK/2 (wenn OCR0A = 0) und CLK/512 (wenn OCR0A = 255) liegt.Code:DDRB.0=1 'OC0A als Ausgang konfigurieren TCCR0A = &B01000010 TCCR0B = &B00000001
@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)
Lesezeichen