Hallo ich habe ein kleines Problem mit dem Powerdown einens Attiny13 . Die Software funktioniert schonmal, das eigentliche Problem liegt in der Ausführung. Zur Grundfunktion, mit einem Taster wird ein Interrupt ausgelöst, was dann das Unterprogramm Taster aufruft, dort wird überprüft wie lange der Taster betätigt wird, bis 500ms soll ein Wechel der Stufe zwischen Low (PWM 100) und High(PWM 255) durchgefürht werden. Dies funktioniert einwandfrei. Wird der Taster länger als 500ms betätigt soll die Lampe ausgehen. Dies arbeitet aber nicht richtig. Bin ich im Low-Modus geht die Lampe aus, wie es sein sollte, bin ich im High-Modus geht die Lampe nicht direkt aus, sondern erst wenn ich den Taster loslasse. Das ändert sich auch nicht, wenn ich "if z=1 then b=255" und "if z=2 then b=100" tausche. Dann habe ich mal Spaßeshalber z1 und z2 auf pwm 100 und dann noch auf z1 15 und z2 100 genommen, da funktioniert es fabelhaft, die Lampe geht während des Tastendruckes aus. Wo liegt mein Fehler.
Schönes Wochenende euch dann noch.
PWM Ausschaltproblem
-
-
Hallo,
also ich blick bei dem Code nicht ganz durch. Klär uns doch bitte mal auf.
Welchen Wert ermittelt du mit dem ADC?
Wofür verwendest du die Varaiblen?Nur so als kleine Info. Das was du beim Label Taster stehen hast, kannst du auch direkt unter das Label Unterprog schreiben. Sonst springt er beim drücken zu Unterprog und wenn er Unterprog ausführt, dann springt er zu Taster. Kostet nur Zeit.
So würde ichs machen. Da fällt zwar die Funktion mit den lange drücke-kurz drücken weg, aber die kapiert sowieso keiner, der die Lampe mal zufällig in die Hände bekommt.
Es ist zwar für einen Mega8 geschrieben, aber das anpassen sollte nicht das Problem sein. Nimm beim Tiny den Timer0 und mach aus PWM = 8 mal PWM = On.Achja, Pind.5 ist beim Mega8 auch nicht der PCINT0 Pin, der Code ist nur so zusammengepuzzelt, sollte aber nach einer Anpassung funktionieren.
Code
Alles anzeigen$regfile = "m8def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 1000000 Config Pind.5 = Input 'Taster der gegen Masse zieht Portd.5 = 1 'interen Pullwiderstand einschalten Config Portb.1 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 'Compare B kannst du weglassen, den brauchst du nicht Start Timer1 Enable Interrupts 'enable global ints Enable Pcint0 'we enable pcint0 as this has pcint0-pcint7 On Sprung 'we jump to this label when one of the pins is changed Pcmsk = &B0001_0000 Dim I As Byte 'I als Variable für den Zustand Dim W As Byte 'W als PWM Variable I = 0 Do Select Case I Case 0 : Gosub Aus Case 1 : Gosub Stufe1 Case 2 : Gosub Stufe2 Case 3 : Gosub Stufe3 End Select Compare1a = W Loop End Sprung: I = I + 1 If I > 3 Then I = 0 Return Aus: Powerdown Return Stufe1: W = 100 Return Stufe2: W = 180 Return Stufe3: W = 255 Return
EDIT: Ich sehe grad, dass zwischen Zeile 40 und Zeile 41 ein waitms 20 fehlt. Zum Taster entprellen.
-
Hallo,
also ich blick bei dem Code nicht ganz durch. Klär uns doch bitte mal auf.
Welchen Wert ermittelt du mit dem ADC?
Wofür verwendest du die Varaiblen?Hallo
Ich hatte das Problem, das die Akkuüberwachung nicht sauber funktionierte, diese soll bei 4 Volt, mit einer Led anzeigen das der Akku fast leer ist. Z.B.sprach im Low_Modus die Akkuüberwachung erst bei 3,6 - 3,8 Volt an. Im High-Modus aber erst bei 4 Volt. Nun Frage ich den Adc 10000 mal ab, sollte innerhalb dieser Abfrage, einmal der Adc größer sein als 730 (4 Volt), wird der Zähler zurückgesetzt und es geht wieder von vorne los und seit dem habe keinerlei Probleme mehr.
Wegen deinem Code werde ich mal umsetzen. Ich suchte aber halt eine Erklärung, warum es bei meinem Code, so nicht ganz funktioniert bzw so unterschiedlich. -
Hallo!
Wo wird denn der Taster eingelesen und wie kommst Du in das
Unterprogramm ?Nebelschleier!
MfG
-
Hallo!
Wo wird denn der Taster eingelesen und wie kommst Du in das
Unterprogramm ?Nebelschleier!
MfG
Hallo
Der Taster löst ein Pin Change Interrupt aus und springt ins Unterprogramm "Unterprog:" hinein, und von dort aus ins Programm "(Gosub Taster:") Taster.Wie aber schon Paule1991 schrieb:
"Nur so als kleine Info. Das was du beim Label Taster stehen hast, kannst
du auch direkt unter das Label Unterprog schreiben. Sonst springt er
beim drücken zu Unterprog und wenn er Unterprog ausführt, dann springt
er zu Taster. Kostet nur Zeit."
Es ist doppelt gemobbelt .
MfG -
Hallo,
also ich blick bei dem Code nicht ganz durch. Klär uns doch bitte mal auf.
Welchen Wert ermittelt du mit dem ADC?
Wofür verwendest du die Varaiblen?Nur so als kleine Info. Das was du beim Label Taster stehen hast, kannst du auch direkt unter das Label Unterprog schreiben. Sonst springt er beim drücken zu Unterprog und wenn er Unterprog ausführt, dann springt er zu Taster. Kostet nur Zeit.
So würde ichs machen. Da fällt zwar die Funktion mit den lange drücke-kurz drücken weg, aber die kapiert sowieso keiner, der die Lampe mal zufällig in die Hände bekommt.
Es ist zwar für einen Mega8 geschrieben, aber das anpassen sollte nicht das Problem sein. Nimm beim Tiny den Timer0 und mach aus PWM = 8 mal PWM = On.Achja, Pind.5 ist beim Mega8 auch nicht der PCINT0 Pin, der Code ist nur so zusammengepuzzelt, sollte aber nach einer Anpassung funktionieren.
Code
Alles anzeigen$regfile = "m8def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 1000000 Config Pind.5 = Input 'Taster der gegen Masse zieht Portd.5 = 1 'interen Pullwiderstand einschalten Config Portb.1 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 'Compare B kannst du weglassen, den brauchst du nicht Start Timer1 Enable Interrupts 'enable global ints Enable Pcint0 'we enable pcint0 as this has pcint0-pcint7 On Sprung 'we jump to this label when one of the pins is changed Pcmsk = &B0001_0000 Dim I As Byte 'I als Variable für den Zustand Dim W As Byte 'W als PWM Variable I = 0 Do Select Case I Case 0 : Gosub Aus Case 1 : Gosub Stufe1 Case 2 : Gosub Stufe2 Case 3 : Gosub Stufe3 End Select Compare1a = W Loop End Sprung: I = I + 1 If I > 3 Then I = 0 Return Aus: Powerdown Return Stufe1: W = 100 Return Stufe2: W = 180 Return Stufe3: W = 255 Return
EDIT: Ich sehe grad, dass zwischen Zeile 40 und Zeile 41 ein waitms 20 fehlt. Zum Taster entprellen.
Hallo Paule1991
Leider ist bei deinem Programm dasselbe Problem, er geht, wenn die led in Stufe3 ist, nicht in den Powerdown-Modus.
Das einzigste ist, was geht, der Idle-Modus, da funktioniert mein und dein Programm. Nur ist da der Stromverbrauch bei 1,5mA. Ich habe es nun mittlerer Weile hinbekommen, das es auch im Powerdown-Modus funktioniert, nur erklären kann ich es mir nicht. Ich mach es nun so, das die Led zuerst ausgeschaltet wird und lass dann einen Zähler hochzählen und wenn er gleich ist, geht es in den Powerdown-Modus und das funktioniert.
Danke an alle die helfen wollten .
MFG -
Ja, das ist richtig. Man muss die LED vorher per Hand ausschalten, sonst leuchtet sie weiter obwohl der Tiny schon schlafen gegangen ist.
Wenn man z.B. ein PWM Verhältnis von 50% einstellt und dann den Tiny schlafen lässt, dann ist die Wahrscheinlichkeit, dass die LED weiterhin leuchtet 50%, dann aber mit voller Helligkeit oder ganz aus, da ja der interne Oszillator gestoppt ist.
-
Ja, das ist richtig. Man muss die LED vorher per Hand ausschalten, sonst leuchtet sie weiter obwohl der Tiny schon schlafen gegangen ist.
Wenn man z.B. ein PWM Verhältnis von 50% einstellt und dann den Tiny schlafen lässt, dann ist die Wahrscheinlichkeit, dass die LED weiterhin leuchtet 50%, dann aber mit voller Helligkeit oder ganz aus, da ja der interne Oszillator gestoppt ist.
Das hätte ich vorher wissen müssen, da hätte ich mir die ganze Sache sparen können. Ich hatte schon gedacht ich bin bekloppt, weil es bei geringer Leistung der Led funktionierte. Aber trotzdem danke für die Info.
ch hatte eigentlich die Led ausgeschaltet, aber damals in einer Anweisung
If Z = 4 Then
B = 0 'PWM aus
Stop Adc
Stop Timer0
Powerdown
End IfSo ging es aber nicht. Jetzt schalte ich zu erst die Led aus und dann geh ich in den Powerdown.
If Z = 4 Then B = 0 'PWM aus
If Z > 3 Then Z = Z + 1
If Z = 255 ThenStop Adc
Stop Timer0
Powerdown
End If
Das ganze hängt in einer Schleife und macht somit noch 251 Durchläufe und geht dann schlafen . Ich hoffe du meintest das 2 Beispiel, weil beim ersten, schalte ich ja eigentlich auch die Led aus.
MFG -
ich habe mir die Codes jetzt nicht angeschaut
aber nachdem du die LED ausgeschaltet hast, solltest du 1-2ms warten bevor du den Tiny in den Schlafmodus setzt. Dann klappts auch
-
ich habe mir die Codes jetzt nicht angeschaut
aber nachdem du die LED ausgeschaltet hast, solltest du 1-2ms warten bevor du den Tiny in den Schlafmodus setzt. Dann klappts auch
Hmm ich habe sogar 1 Sekunde gewartet, bis ich ihn, in den powerdown geschickt habe, aber klappen tat er es trotzdem nicht.
Hier ein Auszug vom Programm .
If Z = 1 Then B = 100
If Z = 2 Then B = 255
If Z = 4 Then
B = 0
Portb.3 = 0
Wait 1
Stop Adc
Stop Timer0
Powerdown
End If
Pwm0b = B
LoopNaja egal jetzt funktioniert es ja, nachdem ich das geändert habe und in eine Schleife gesetzt habe.
Danke dir für deine Bemühungen.
MFG