Klasse das es nun funktioniert![]()
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
Ich drück Dir die Daumen. Hört sich an, als wenn das Ding in den Sicherungskasten kommt. Hoffentlich fallen da keine Störungen ein, die den µC außer Tritt bringen. Da hab ich keine Erfahrung und würd ich ein halbes Jahr nach Inbetriebnahme noch argwöhnisch als Betarelease betrachten![]()
![]()
Da sollte aber auch ein viel kleinerer µC ausreichen. Hab nu nicht für den Tiny13 optimiert - der sollte aber auch gehen aber mindestens höchstens der Tiny25.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Danke!
Jepp, Beta ist wohl richtig!Werde den µC natürlich so weit wie möglich vom Trafo und den Relais entfernt platzieren. So "weit" wie eben möglich und hoffen das der mir nachts nicht die Spots durch schaltet das meine frau denkt wir hätten Poltergeister im Haus!!
![]()
Tolle Idee eigentlich für Helloween ein Programm zu schreiben!!![]()
Denke auch das ein kleinerer µC ausreichen sollte aber unsere Code´s sind etwas über 1kB groß...
Hab´ hier auch noch 2 AtMega168 rum liegen....mal schauen ob alles in´s Leergehäuse passt. Wenn nicht dann Code-abspecken...
Ich geb´ bescheid wenn´s fertig ist. Dann aber in einem Projekt-Teil des Forums...
Viele Grüße,
p@
Also das Programm hat nur ein Unterprogramaufruf und nichts Verschachteltes, keine Interrupts. Mit Anpassung der HW-Anschlüsse für LEDs und Taster und folgendem Header hat das letzte Programm für den Tiny13 kompiliert:
Bei der Anwendung ist - meine Ansicht - kein Quarz erforderlich. Tiny im Lieferzustand, glaub ich , läuft mit 1,2MHz.Code:$regfile = "attiny13.dat" $hwstack = 16 $swstack = 10 $framesize = 24 $crystal = 1200000
Zur groben Berechnung der Headerangaben:
http://halvar.at/elektronik/kleiner_...swstack_frame/
EDIT: Grad nochmal ein wenig mit dem Simulator probiert und in der Hilfe für framesize gelesen. Mit framesize = 24 sollte man hier auf der sicheren Seite sein.
Also das geht auf jeden Fall mit dem Tiny13
Gruß
Searcher
Geändert von Searcher (15.03.2013 um 12:41 Uhr) Grund: framesize im Header sicherer gemacht
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Die Schleife "while Taster = 0" setzt einen prellfreien Kontakt voraus. Auch scheint das Licht nicht anzubleiben, wenn der Taster losgelassen wird. Oder habe ich da nen Denkfehler?
Mein erster Versuch würde jetzt so aussehen:
Zweite Idee mit zusätzlichem Eingang für ~65 Sekunden Licht:Code:$regfile = "attiny13.dat" $hwstack = 16 $swstack = 16 $framesize = 24 $crystal = 1200000 Taster Alias Pinb.4 'Led1 : Portb.0 'Led2 : Portb.1 'Led3 : Portb.2 Dim Taste As Bit Dim Tastealt As Bit Dim Zeit As Word Dim Ledspeicher As Byte 'Speichert Zustand der LEDs in einzelnen Bits Ddrb = &B00000111 Portb = &B00110000 Ledspeicher = &B00110111 'damit das erste mal kurz Tasten gleich alle Ausgänge setzt, falls nocht nicht alles bestückt ist. Do Gosub Tastercheck Gosub Szeit Gosub Licht Loop End Tastercheck: Debounce Taster , 0 , Taste_zu Debounce Taster , 1 , Taste_offen Taste_zu: Taste = 1 Return Taste_offen: Taste = 0 Return Szeit: If Taste = 0 Then If Tastealt = 1 Then If Zeit < 500 Then 'wurde nur kurz gedrückt, dann ein-/ausschalten Gosub Schalten End If Reset Tastealt End If End If If Taste = 1 Then If Tastealt = 0 Then Set Tastealt Zeit = 0 End If Waitms 1 Incr Zeit End If Return Licht: If Taste = 1 Then Select Case Zeit Case 500 : Portb = &B00110001 'bit 4 immer an, wegen Pullup am Tastereingang Case 1000 : Portb = &B00110010 'bit 5 immer an, wegen Pullup an offenem Eingang Case 1500 : Portb = &B00110100 Case 2000 : Portb = &B00110011 Case 2500 : Portb = &B00110101 Case 3000 : Portb = &B00110110 Case 3500 : Portb = &B00110111 Case Is >= 4000 : Zeit = 499 End Select End If Return Schalten: If Portb > &B00110000 Then 'Wert größer Pullups Ledspeicher = Portb Portb = &B00110000 Else Portb = Ledspeicher End If Return
Beide ungetestet, da keine passende Hardware hier. Werden die ganzen Zeiten halbiert und waitms auf 2 erhöht, verdoppelt sich die Laufzeit des Lichttimers. wtimer darf natürlich nicht größer werden.Code:$regfile = "attiny13.dat" $hwstack = 16 $swstack = 16 $framesize = 24 $crystal = 1200000 Taster Alias Pinb.4 Tasterzeit Alias Pinb.5 'Led1 : Portb.0 'Led2 : Portb.1 'Led3 : Portb.2 Dim Taste As Bit Dim Tastealt As Bit Dim Zeit As Word Dim Ledspeicher As Byte 'Speichert Zustand der LEDs in einzelnen Bits Dim Wtimer As Word Ddrb = &B00000111 Portb = &B00111000 Ledspeicher = &B00111111 'damit das erste mal kurz Tasten gleich alle Ausgänge setzt, falls nocht nicht alles bestückt ist. Do Gosub Tastercheck Gosub Szeit Gosub Licht Loop End Tastercheck: Debounce Taster , 0 , Taste_zu Debounce Tasterzeit , 0 , Taste_zeit Reset Taste Return Taste_zu: Set Taste Wtimer = 0 Return Taste_zeit: Wtimer = 65535 Return Szeit: If Taste = 0 Then If Tastealt = 1 Then If Zeit < 500 Then 'wurde nur kurz gedrückt, dann ein-/ausschalten Gosub Schalten End If Reset Tastealt End If End If If Taste = 1 Then If Tastealt = 0 Then Set Tastealt Zeit = 0 End If Waitms 1 Incr Zeit End If If Wtimer >= 1 Then Decr Wtimer If Wtimer = 0 Then If Portb > &B00110000 Then Gosub Schalten End If End If End If Return Licht: If Taste = 1 Then Select Case Zeit Case 500 : Portb = &B00111001 'bit 4 immer an, wegen Pullup am Tastereingang Case 1000 : Portb = &B00111010 'bit 5 immer an, wegen Pullup an offenem Eingang Case 1500 : Portb = &B00111100 Case 2000 : Portb = &B00111011 Case 2500 : Portb = &B00111101 Case 3000 : Portb = &B00111110 Case 3500 : Portb = &B00111111 Case Is >= 4000 : Zeit = 499 End Select End If Return Schalten: If Portb > &B00110000 Then 'Wert größer Pullups Ledspeicher = Portb Portb = &B00110000 Else Portb = Ledspeicher End If Return
Geändert von peterfido (15.03.2013 um 22:56 Uhr) Grund: Codeänderung
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hallo peterfido,
Ich habe angenommen (wie p@ty erwähnt hat), daß an den LED Pins des µCs nicht direkt LEDs sitzen, sondern Stromstoßrelais, die die LEDs schalten. Die Relais bekommen während der Bedienung mit dem Taster immer nur einen Stromstoß und sind sonst stromlos. So wie ich dann den p@ty verstanden habe, soll es folgende Funktion geben:Auch scheint das Licht nicht anzubleiben, wenn der Taster losgelassen wird. Oder habe ich da nen Denkfehler?
1. System einschalten, keine LED leuchtet
2. Als erstes kurzer Tastendruck (<200ms) -> nichts passiert.
3. Taste wird lange gedrückt gehalten (>=200ms) -> Lichtszenario wird während gedrückter Taste ausgewählt
- Die drei LED Pins (Stromstoßrelais) werden bei gedrückter Taste in gewissen Zeitabständen in unterschiedlichen Kombinationen unter Strom gesetzt mit LEDx = 1 bzw. ausgeschaltet mit LEDx = 0
- Wird die Taste losgelassen, wird von allen Stromstoßrelais der Strom abgeschaltet (LEDx = 0). Das hab ich aus p@tys Programm entnommen und wurde vielleicht auch irgendwo erklärt.
- Die zuletzt unter Strom gesetzten Stromstoßrelais sollen bei folgenden kurzen Tastendrücken einen Stromstoß bekommen.
4. Taste wird kurz (<200ms), nachdem mindestens einmal nach Systemstart das Auswahlszenario durchgespielt und beendet wurde, gedrückt. Kurze Tastendrücke hintereinander schalten die ausgewählten LEDs aus und ein und aus und....
- Während der gedrückten Taste sollen die LED Pins, die beim Auswahlszenario als letztes high waren, wieder high werden.
- Wird die Taste vor Ablauf von 200ms gelöst, beginnt also nicht das Auswahlszenario, sondern die LED Pins werden direkt auf low geschaltet.
Stromstoßrelais, die an den LED Pins hängen, bekommen also einen Stromstoß, was die LEDs dann wohl toggeln läßt.
5. Nun kann wieder Punkt 3. oder 4. eintreten.
Wie das genau bei P@ty realisiert ist weis ich auch nicht, scheint aber zu laufen.
Eigentlich ja. Ist meiner Ansicht in meinem Programm aber egal. Die Entprellung wird mit dem DEBOUNCE gemacht und erst danach erreicht das Programm die Schleife, wenn der Taster stabil geschlossen ist.Die Schleife "while Taster = 0" setzt einen prellfreien Kontakt voraus.
Falls der Taster beim Lösen prellen sollte, könnte die while Schleife nochmal unabsichtlich durchlaufen werden, was aber bei den 10ms Schritten nicht wahrgenommen werden dürfte.
Wenn der Taster gelöst wird, dadurch die Schleife verlassen wird, aber noch nachprellt, ist das Programm wieder in der Hauptschleife und das DEBOUNCE fängt das Prellen ab.
Puh, das war jetzt nicht perfekte Arbeit aber hoffentlich verständlich.
Gruß
Searcher
Geändert von Searcher (16.03.2013 um 08:10 Uhr)
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Wenn es Probleme mit dem Prellen geben sollte, kann ja hinter der Tasterabfrage nochmal ein waitms 10 gesetzt werden und danach wird der Taster nochmal abgefragt.
Spätestens dann sollte der Taster nicht mehr prellen![]()
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
Lesezeichen