Probleme mit Taschenlampensteuerung in Bascom Basic

  • Ich wollte mal eine Steuerung für Taschenlampen bauen.
    Diese soll nur einen Taster haben, über den der Zustand gesteuert wird.

    Es gibt 4 Zustände :
    1. Aus (µc im Powerdown)
    2. Led über PWM auf ca. 40% (Wert: 100/255)
    3. Led über PWM auf ca. 70% (Wert: 188/255)
    4. Led über PWM auf ca. 100% (Wert: 255/255)
    Momentan steckt alles auf dem myavr Testboard mit nem Atmega8 als µc.
    Taster hängt an PortD.2
    Led hängt am PWM-Port OCA1 also PortB.1
    Das Problem ist, dass das Aufwecken aus dem Powerdown nur über den Interrupt bei Low Level geht und leider nicht wenn ich den Interrupt bei Falling auslösen lasse.
    Mein Code, den ich bis jetzt habe hänge ich mal an. Bei Druck auf den Taster wird der Leuchtzustand willkürlich durcheinander verändert, aber nicht so wie es sein sollte.
    Ich hoffe ihr könnt mir vielleicht helfen und ein Weg zeigen, wie es richtig funktioniert.

    Grüße Salocin_13

  • Ähm du weißt schon, dass nach jedem Tastendruck der Interrupt 2 mal aufgerufen wird oder?

    Einmal beim Drücken und einem beim Loslassen. Also wird dadurch schonmal ein Mode übersprungen.

    Dann kommt noch Tastenprellen hinzu. Einfach mal 10ms warten lassen sobald der µC in den Interrupt springt.

    EDIT: ok hab vergessen, dass man bei Bascom den Level Interrupt auf "low level" stellen kann, also die ersten beiden Zeilen nicht beachten :D

    EDIT2: Muss man zum aufwecken nicht den Pinchange Interrupt benutzen? also PCINT statt INT?

  • Ist jetzt zwas ungetestet, sollte aber trotzdem laufen. Musst das halt nurnoch geringfügig an deine Bedürfnissen anpassen. Auf ein Powerdown würde ich verzichten, nimm lieber einen anderen µC. Der Tiny13 kann das genauso und begnügt sich mit viel weniger Strom. Der Mega8 ist in dem Fall der totale Overload. Der wird dabei ja nichtmal warm^^

  • Der Attiny13 war auch für die Taschenlampe vorgesehen, allerdings habe ich erstmal den ATmega8 genommen, weil ich für den ein passendes Entwicklungsboard mit Programmer habe.
    Den Powerdown halte ich aber trotzdem für notwendig, da selbst der ATtiny13 noch 240µA im Active Mode braucht. Wenn man das jetzt mal auf ein Jahr rechnet, dann verbraucht er über 2Ah.
    Das würde bedeuten, dass wenn die Taschenlampe ein Jahr im Schrank liegt, der Akku danach leer ist. Deswegen brauche ich den Powerdown, der nur 0,1µA verbraucht.
    Ansonsten würde ich deinen Code sofort übernehmen.
    Da Original Fighter:
    Also ich habe gelesen, dass der normale Interrupt zum Aufwecken reicht.
    Ich werde es gleich nochmal mit einem waitms 10 im Interrupt probieren.

    Grüße Salocin_13

    Einmal editiert, zuletzt von salocin_13 (21. Juli 2010 um 11:29)

  • Hallo,

    ich nehme ja mal an, das du das Pollin Board hast. Mit dem kannst du mit PonyProg2000 auch einen ATTiny13 flashen. Die haben identische Pins.
    Den Powerdown Modus, kannst du ja auf Stufe 3 oder Stufe 4 legen. Aufwecken kannst du ihn auch mit einem Reset.
    Sozusagen hast du dann zwei Taster. Einen mit Reset, der den µC resetet (Taster1) und einen zum durchschalten des Programms(Taster2). Wenn du mit Taster1 den µC Resetest, kannst du ihn in der Initphase einen Startwert für W festlegen. Wenn du jetzt Taster2 drückst, dann kannst du W Stufenweise erhöhen bis 255. Wie genau die Abstufung ist, kannst du ja mit der Case abfrage festlegen. Nachdem W maximal ist und du den Taster2 wieder drückst, kannst du ihn ja in einer weiteren Case-Stufe Powerdown schreiben. Dann ist deine Lampe im Stromsparmodus und du kannst sie erst wieder mit Taster1 starten.
    Sicherlich kann man die ganze Sache auch auf einen Taster beschränken, aber das würde wieder mehr Programmaufwand bedeuten. Allerdings kann ich dir nicht auf anhieb sagen, wie das funktioniert, da ich sehr sehr sehr selten mit der Funktion arbeite. Ich habe keine Ahnung wie das aufwecken abläuft, dazu müsstest du etwas rumprobieren. Eventuell musst du in der letzten Stufe der Caseabfrage (bei Powerdown) das Return weglassen.

    Einfach mal probieren.
    Viel Erfolg und lass und die Lösung bitte wissen. :)

  • Nein, das Pollin Board habe ich nicht. Ich hab ein anderes Board, wo nur der Atmega 8, 48, 88 draufpassen. Der Tiny13 hat auch leider keine Identische Pinbelegung im relevanten Bereich.
    Ich habe das Software-Problem jetzt aber anders gelöst. Ich habe einfach auf den Powerdown verzichtet und stattdessen den Controller in den Idle versetzt. Da braucht er auch so wenig, dass bei einem Jahr Idle 700mah gezogen werden. Das ist tragbar finde ich.
    Der Idle hat den Vorteil, dass man ihn auch durch einen Interrupt beenden kann, der nur auf Falling, also fallende Flanken reagiert. In der Interruptroutine wird jetzt zudem erstmal 250ms gewartet bis dann T auf 1 gesetzt wird, ich glaube das wäre dann die angesprochene Entprellung. Jetzt dauert die Umschaltung der Stufen zwar ganz kurz, aber das ist so minimal, dass es mir relativ egal ist.
    Nach einigen Tests muss ich sagen, die Software funtkioniert soweit sehr gut, ich habe sogar über einen BUZ11 eine HP-Led gesteurt, was auch problemlos ging.
    Paule1991:
    Deine Idee war gut, allerdings habe ich mir im Gehäuse nur Platz für einen Taster mit eingeplant und bin so festgelegt. Ausserdem wollte ich auch wenn möglich die Bedienung auf einen Taster beschränken, damit auch andere das Teil verstehen ;)
    Trotzdem Danke an alle.
    Hier nochmal der Code:


    Ich werde jetzt noch eine Step-down KSQ bauen, die ab 4,2V VinMin läuft und 0,7A ausspuckt sowie direkt über PWM vom µc regelbar ist.
    Aber dafür eröffne ich lieber einen neuen Thread, das wird sonst zu unübersichtlich.
    Sollte jemand solch eine KSQ schonmal gebaut haben oder selber gerade an der Entwicklung sein, bitte bescheid sagen, oder hier rein schreiben. Danke.

    Grüße Salocin_13

    2 Mal editiert, zuletzt von salocin_13 (22. Juli 2010 um 00:08)

  • Ich muss das Thema nochmal hochholen, weil ich jetzt wieder ein Problem habe.
    Und zwar habe ich jetzt mal den Attiny13 genommen, auf eine Platine gelötet, zusammen mit einer Led am PortB.0.
    Alle anderen Pins sind mit Kabeln rausgeführt. Reset hab ich über nen 750Ohm Widerstand auf Vcc gelegt.
    Ich kann den µc ohne Probleme flashen, er wird von dem USB-Programmer auch erkannt.
    Aber es tut sich nichts im normalen Betrieb.
    Hier der für den Attiny angepasste Code:


    Wäre nett, wenn sich das mal jemand anschauen könnte.

    Grüße Salocin_13

  • Hi,

    Zitat

    Config Pinb.1 = Input
    Config Pinb.0 = Output


    mach hier mal

    Code
    Config PORTB.1 = Input
    Config PORTB.0 = Output
    Config PORTB.2 = Output 'falls du den für irgendwas verwendest

    Gruß Flo

    Gruß Flo
    ----------------------------

  • Ich hab den cristal jetzt auf 1200000 eingestellt und ein End hinter Loop gemacht, es brachte jedoch immer noch keine Änderung.
    Ich bin grade ein bisschen ratlos, woran es liegt.

    Grüße Salocin_13

  • Du setzt P = 0. Für P = 0 springt dein Prozessor aber sofort in den Idle Modus. Außerdem passiert beim drücken des Tasters nichts. Er setzt T immer nur auf 1.
    Wo ist denn der Teil, der Einfluss auf P hat?


    Ich habe dir ja oben schon einen Quellcode gegeben, der auf einer Caseabfrage basiert. Ich würde das so machen. Du müsstest nurnoch den Powerdownmodus in eine Casestufe bringen. Nimm doch den Code von mir, aber lege den Taster auf einen Pin, der den µC auch aus dem Schlaf holen kann.

    EDIT: Ich sehe grad, das man den Tiny auch mit einen Interrupt aus seinem Schalf holen kann.
    Also kannst den Code von oben nehmen, brauchst halt nurnoch die Casestufe für Aus auf Powerdown umzuschreiben.

    Code
    Aus:
    Powerdown
    Return

    Einmal editiert, zuletzt von Paule1991 (23. Juli 2010 um 18:55)

  • Ok, ich werde es mit deinem Code probieren.
    Der Taster liegt auf B1, der PWM ausgang auf B0.
    Um den µc aus dem Schlaf zu holen ist doch aber ein Interrupt erforderlich, oder ?
    Den müsste ich ja in deinem Code noch einbauen.
    Der Code sieht jetzt so aus :


    Ist das so korrekt ?
    Denn es funktioniert immer noch nicht.

    Grüße Salocin_13

  • Hallo!

    Probier jetzt mal die Interruptroutine rausnehmen.
    Weil ich weis nicht wer jetzt gewinnt. Einerseits fragst Du Pinb.1
    mit Debounce ab und zeitgleich jagst Du den µC in den Interrupt.

    MfG
    Styler

  • Hi,

    ich hab den Interrupt einfach mal rausgenommen und den Idle auch, es hatte jedoch keinen Einfluss.

    Nach wie vor tut sich nichts an der Led. Ich verzweifel so langsam an dem Teil.
    EDIT: Um das Problem mal anders anzugehen habe ich mal alles aus dem Code raugelöscht und nur die PWM auf 200 konstant gestellt.
    Das Ergebnis davon ist, dass es nicht funktioniert. Also liegt hier schon das Problem (bzw. mindestens ein Problem)

    Grüße Salocin_13

    Einmal editiert, zuletzt von salocin_13 (23. Juli 2010 um 19:56)

  • Hallo,

    wieso nimmst du nicht einfach den Befehl Compare für die PWM? Ist doch einfacher.

    Langsam machst du mich auch ganz wuschig, den Code mal selbst zu probieren. Ich werd dir morgen berichten, ob es funktionier hat.

  • Da Original Fighter:
    Danke, da hast du recht, das habe ich wirklich vergessen. Damit funktioniert die PWM jetzt zumindest.
    Paule1991:
    Mit Config Timer..... und dann Compare funktioniert es nicht. Entweder Bascom mekert oder es funktioniert einfach nicht.
    Deswegen habe ich nach etwas Googlen das so gemacht.

    EDIT: naja, das was die PWM da macht, kann man eigentlich nicht funktionieren nennen:

    Die Led wird zwar gedimmt, flackert dabei aber extrem. Im hellen bereich wenig, im dunklen umso mehr.
    Wird wohl also die PWM frequenz nicht stimmen, oder ?
    EDIT2: Ok, ich hab jetzt mal anhand des Datenblattes den Prescaler auf 8 gesetzt, jetzt sieht es sehr gut aus. Flimmert auch nix mehr.
    Jetzt werde ich mich wieder an das Hauptprogramm machen.
    EDIT3: So, jetz aber. Ich habs geschafft. Nach langem Datenblatt lesen. Der Code funktioniert, die Steuerung tut nun was sie soll. :thumbup:
    Ich hab nun schlussendlich doch wieder meinen Ursprungscode verwendet, da dieser auch mit Idle funktioniert.
    Den Code von Paule habe ich auch getestet, jedoch wollte der irgendwie nicht so recht funktionieren.

    Danke nochmal an alle. Vor allem an Paule1991 und Da original Fighter.

    Grüße Salocin_13

    3 Mal editiert, zuletzt von salocin_13 (23. Juli 2010 um 23:23)