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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.