Bascom-> PCINT

  • Guten Tag,


    Ich hab mal wieder ne Frage.... ich sitze jetzt schon seit mehr als 2 stunden hier rum und bekomme den PCINT nicht zum laufen.


    Mein vorhaben. Ich möchte den ATTiny24 nach längerem betätigen einer Taste schlafen legen. Bevor er schlafen geht wird der Eingang mit dem Taster als PCINT configuriert, somit , rein in der theorie, wenn ich die Taste wieder drücke der Controller wieder aufwacht.


    Ich weis einfach nicht wo ich noch suchen soll. Der COntroller geht in den Powerdown mode. Er wacht nur nicht mehr auf.


    Könntet ihr vielleicht mal den Code überprüfen. Wäre super nett. ( der Taster hängt an PCINT5 -> PinA.5 )


    Der Code wurde gekürzt, sollte aber auch unwichtig sein.


  • Hat den keiner nen vorschlag, was es vielleicht sein könnte?


    Werde dann mal am Donnerstag alles einzeln überprüfen um den fehler zu finden.... Ich denke es liegt am PCInt...


    doch eigentlich, wenn ich den controller einfach, sobald die Taste betätigt wird in den Interrupt vom PCint0 ->pcint5 springen und mir das über die Leds anzeigen lass, seh ich das es funktioniert. Im Datenblatt steht dass der Attiny24 mit dem PCInt aufgeweckt werden kann, daher sollte es auch nicht daran liegen.... MIr fällt momentan nichts mehr ein was ich ändern könnte, oder falsch gemacht hätte.


    MfG

  • Naja, es ist nicht besonders schlau, in einer Interruptroutine in den Powerdown-Modus zu gehen. Und das machst du ja gerade, indem du den Powerdown-Befehl in deiner Timer0-Interruptroutine auslöst.


    Das Problem dabei ist, dass die AVR-Hardware grundsätzlich, sobald ein Interrupt bearbeitet wird, das globale Interrupt-Enable-Bit löscht und damit weitere Interrupts innerhalb von Interruptroutinen unterdrückt. Die Hardware setzt das globale Interrupt-Enable-Bit erst wieder bei der Rückkehr aus der Interruptroutine und kann dann erst weitere eventuell vorhandene Interrupt-Anforderungen bearbeiten.


    Dieses Verhalten kann man zwar ändern, indem man gleich bei Einstieg in die Interruptroutine einen SEI-Befehl (bzw. Enable Interrupts) ausführt (dann kann man auch eine Interruptroutine mit einem weiteren Interrupt unterbrechen), es ist aber eher schlechte Praxis, sowas zu machen, weil man sich damit schnell Probleme mit Stack-Überläufen etc. einhandeln kann.


    Viel besser wäre es, wenn du anstatt des Powerdown-Befehls eine Flag-Variable an der entsprechenden Stelle im Timer-Interrupt setzst. In der Main-Schleife (Do...Loop) überprüfst du jeweils diese Flag-Variable, und wenn sie gesetzt ist, gehst du in den Powerdown-Modus. In der Interruptroutine zum PCINT-Interrupt (Aufwachen) setzst du die Flag-Variable wieder zurück. Somit geht's nach dem 'Aufwachen' (nach dem PCINT-Interrupt) auch immer definiert dort weiter, wo der Powerdown-Befehl in der Hauptschleife platziert ist.


    Gruss
    Neni

  • Besten dank an alle die mir geholfen haben.


    Stefan


    Ja die variable wurde zugeordnet. Hatte ich nur aus Platzgründen weggelassen, da es ja noch paar mehr variablen gibt :rolleyes:


    @ synvox


    Du bist der beste.... genau das war der Fehler... er hatte probleme, dass ich aus dem INterrupt direkt in den Powerdown mode gegangen bin. Einfach nur klasse. FUnktioniert jetzt tadellos.


    *happy*


    MfG