Forum: Mikrocontroller und Digitale Elektronik "UserInterface", Sleep Modus, etc.


von Alexander Höller (Gast)


Lesenswert?

Hallooo ....

Ich arbeite derzeit an einem Projekt mit einem ATMega64 bei dem soweit
auch alles prima funktioniert, nur bereitet mir das UserInterface -
also die Steuerung des Projektes - ein wenig Kopfzerbrechen!

Kurzerklärung um was es geht:
Ein Gerät, das - wenn es eingeschalten ist - in 2 verschiedenen Modi
arbeiten kann, und zwischen diesen will ich während des Betriebes
jederzeit umschalten können (natürlich soll der derzeit laufende
„Zyklus“ des Modus noch fertig durchlaufen werden).
Weiters soll das Gerät in den StandBy geschickt werden können, wo es
nicht all zu viel Strom verbrauchen sollte (es läuft eh nur der µC).
Aus dem StandBy Mode soll es allerdings auch wieder eingeschalten
werden können, wobei es danach zuerst abfragen soll in welchem Mode es
arbeiten soll.

Dazu hätte ich mich folgende Steuerung überlegt:
2 Schalter (Druckschalter, die ihre Stellung auch beibehalten, um nicht
Impulse eines prellenden Tasters zählen zu müssen). Einer um den Mode
umzustellen und einen um das Gerät in den StandBy zu schicken. Mit dem
Konzept an sich bin ich eigentlich eh recht zufrieden, nur weiß ich
nicht wirklich wie ich das am besten umsetze - und wäre deswegen über
Tipps von euch sehr erfreut ;)


Bis jetzt hab ich mir gedacht, ich werd es so (in etwa) lösen:

Während des Betriebes werden die Taster gepollt, also durch einen Timer
(der sowieso auch andere Aufgaben erfüllen muss) alle 10ms (reicht das?)
abgefragt. Falls ein Taster gedrückt wurde wird ein Flag gesetzt, dass
in der Endlos-Schleife in der Main-Fkt. die gewünschte Funktionen
ausführt. Falls beide Taster gedrückt sind, hat der StandBy-Schalter
natürlich die höhere Priorität.

Falls das Gerät in den StandBy geschickt wird, werden zuerst alle
andere Verbraucher abgeschaltet, ein Ext.Interrupt (an den
entsprechenden Pin ist der Schalter für den StandBy angeschlossen)
aktiviert und der µC in den SleepModus (welchen am besten??) geschickt
wo er darauf wartet durch den Ext.Int wieder geweckt zu werden. Nach
dem Wecken würde ich am liebsten einen Software-Reset durchführen (wie
mach ich das am besten?) und danach gibt es ein Zeitfenster von etwa 3
Sekunden in dem man den Mode-Taster drücken kann. Falls dies nicht
geschieht geht das Gerät in den Mode der vermutlich öfter verwendet
wird, falls er gedrückt wurde in den anderen.

Was haltet ihr von dieser Idee? Irgendwelche Verbesserungsvorschläge?
Komplett andere Idee? Und natürlich würde ich mich freuen, die im Text
gestellten Fragen beantwortet zu bekommen ;)

mit freundlichen Grüßen,
Alexander Höller

von Peter D. (peda)


Lesenswert?

Im Prinzip geht es so.
Mach einen Programmablaufplan danach und dann leg los.


Prellfreie Taster sind sehr teuer, Entprellen in Software kostet
dagegen nix.
In der Codesammlung ist eine Entprellroutine von mir, im
Schedulerbeispiel ist eine Anwendung dazu.

Die Umschaltung geht dann ganz einfach in der Main-Loop:

void main( int )
{
  init();                          // Power on Funktionen
  for(;;){                         // main loop
    for(;;){                       // Schleife für Funktion 1
      if( getkey( 1<<key_sleep )){
        sleep_awake();             // Schlafen + Aufwachen
      }
      if( getkey( 1<<key_mode )){
        break;                     // Wechsel zu Funktion 2
      {
      funktion1();                 // Funktion 1 aufrufen
    }
    for(;;){                       // Schleife für Funktion 2
      if( getkey( 1<<key_sleep )){
        sleep_awake();             // Schlafen + Aufwachen
      }
      if( getkey( 1<<key_mode )){
        break;                     // Wechsel zu Funktion 1
      }
      funktion2();
    }
  }
}


Ich bin jetzt mal davon ausgegangen, da Du ja einen Mega64 Boliden
nimmst, daß Du in C programmierst.

Ein Reset mitten im Programm sollte man vermeiden, man weiß ja
dann nicht mehr, wo man stand.
Auch schränkt man sich nur unnötig ein, wenn das Programm mal erweitert
werden soll.

Den Interrupt zum Aufwachen läßt Du einfach leer, dann geht das
Programm nach dem sleep-Befehl ganz normal weiter.


Peter

von Alexander Höller (Gast)


Lesenswert?

Hi Peter!

Stimmt, ich programmiere in C - Asm wär für das Projekt zu aufwändig
gewesen, vorallem mit dem vorgegebnem Zeitrahmen.

Dass es keine prellfreien Schalter gibt (bzw. ich sie nicht verwende)
ist mir schon klar.

Aber ich hab mir zum Entprellen folgendes gedacht:

Da ja der Pegel entscheidet in welchem Mode in der Main-Fkt. gearbeitet
werden soll, kann ich in dem 10ms Timer diesen Pegel aben pollen ... und
wenn eine Änderung auftritt änder ich das Mode-Flag und ignorierte
außerdem in den nächsten 5 (?) 10ms-Interruts Änderungen des Pegels
(also dass ich den Schalter direkt in der Interrupt-Fkt. entprelle).


Und zu dem Reset hätte ich eh noch eine Frage - weil da ist mir einiges
nicht ganz klar!

Was ich erreichen will:
Wenn ich das Gerät wieder einschalte soll es von ganz neu beginnen -
also es soll NICHT dort weitermachen wo es ausgeschalten wurde! Wenn
ich es einschalte sollen alle alten Variablen-Werte weg sein, der Mode
soll nicht gespeichert sein, usw.! Also komplett unabhängig von dem was
beim letzten mal war.

Nur weiß ich eben leider nicht wie ich das am besten realisieren kann.
Ich dachte mir eben einfach einen Reset (per Software) auszulösen.

Wäre über andre Vorschläge - die aber eben das Gerät "neu starten" -
froh, weil das mit dem Reset in meinen Augen schon ein wenig "dirty"
ist ;)
Falls es aber nicht anders geht, mach ich es eben so ... nur weiß ich
nicht mal wirklich wie ich das am besten so machen kann!
Den Reset über einen PortPin auszulösen ist ja die uneleganteste
Lösung. Direkt auf den Reset-Int.-Vektor zspringen wäre da natürlich
deutich schöner - nur wie mache ich das in C?


Alexander

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.