Hallo,
wo hängt es denn? Hast du schon angefangen? Funktioniert schon ein Teil?
Hallo zusammen,
ich würde gerne den letzten Zustand nach einem Tastendruck Speichern.
Es soll so funktionieren.
Strom am Attiny AN.
Jetzt leuchtet eine LED für 10 Sekunden.
Wenn ich jetzt den Taster mindestens 5 Sekunden drücke schreibt es mir einen neuen Wert in das Eeprom und bei einem Neustart leuchtet die LED nicht mehr da ja der neue Wert im Eeprom steht ( LED aus )
Wenn ich den Taster jetzt wieder für mindestens 5 Sekunden drücke schreibt er mir wieder den alten Wert ins Eeprom und nach einem Neustart leuchtet auch die LED wieder für 10 Sekunden.
Könntet Ihr mir bitte sagen wie ich das am einfachsten Umsetzen kann?
Ich weiß nicht welcher Weg der einfachste ist um ans Ziel zu kommen ?
Und wie genau lautet hier der Fachbegriff für diese Funktion?
Hallo,
wo hängt es denn? Hast du schon angefangen? Funktioniert schon ein Teil?
So wirklich viel habe ich leider noch nicht.
Code:int main (void) { DDRB |= (1<<PB1); // Ausgang für LED DDRB = ~(1<<PB0); // Eingang für Taster PORTB |= (1<<PB0); // Pullup Einschalten PORTB = (1<<PB1); _delay_ms(10000); PORTB &= ~(1<<PB1); while (1) { } }
Jetzt ist die Frage mit welcher Funktion kann ich zum Erfolg kommen ?
Natürlich benötige ich einen Taster das ist mir soweit klar.
Nur eben wie mache ich die Afrage das der Taster mindestens 5 Sekunden gedrückt wurde ?
Und wie sage ich ihm das er den neuen Wert auch nach dem Neustart speichern soll?
Nun jetzt zerlegen wir dein Problem mal in einige kleine Teilprobleme:
1. Einlesen eines Tasters
//Entnommen hier raus: https://www.mikrocontroller.net/arti...R-GCC-Tutorial
2. Zeit messen können.Code:/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */ if ( PINC & (1<<PINC1) ) { /* Aktion */ }
Variante 1: Einfach 5 Sekunden schlafen und dann schauen ob der Taster immer noch High ist
Variante 2: Mit einem Timer der alle 10 Millisekunden eine Variable hochzählt die Zeit messen. Dazu merkt man sich in der Hauptschleife beim ersten mal Abfragen den Wert der Zeitvariable und prüft diese bei jeden Durchlauf ab. Wenn 5 Sekunden vergangen sind noch mal den Eingangspin des Tasters prüfen. (Hat den Vorteil man kann die Zeit auch noch anders verwenden)
3. In den EEPROM schreiben
Das lesen/ schreiben in den EEPROM ist vom Code her eine etwas aufwendigere Geschichte. Deshalb verweise ich an der Stelle nur auf die passende Stelle im AVR GCC Tutorial: https://www.mikrocontroller.net/arti...Tutorial#EEMEM
Ein Hinweis dabei: Man sollte das EEPROM ringweise beschreiben, da die einzelnen Zellen eine stark begrenzte Anzahl von Schreibzyklen haben.
Schreib einfach wenn du konkrete Fragen zu einem der Punkte hast.
Einlesen eines Tasters ist kein Problem.
Nur einen Timer der alle 10 Millisekunden eine Variable hochzählt und die Zeit mist ist ein Problem
Würde die Berechnung für die 10 ms so passen für den Timer ?
Code:TCCR0 |= (1<<CS02) | (1<<CS00) TCNT0 = 158
Dann mach doch erst mal die Variante mit _delay_ms(5000).
Also
Bezüglich Timer: Lies das Datenblatt, da wird das erklärt Ich weiß es leider auch nicht auswendig.Code:if(Pin HIGH) { _delay_ms(5000); if(Pin ist immer noch HIGH) { //DO some stuff //Und natürlich die Pin ist high abfrage durch den richtigen Code ersetzen ;) } }
Um die Timerkonfig durchzugehen, müsstest Du schreiben, welchen genauen Typ Du verwendest (wahrscheinlich ATTiny11 oder 12???) und bei welcher Frequenz der Controller läuft (bei 16MHz würde die Konfiguration rechnerisch Sinn ergeben, es funktioniert aber bei den o.g. Typen nicht, weil die nur einen Overflow im TCNT0 signalisieren).
Das ist richtig, ich nutze einen Attiny85.
Der Controller wurde von mir nicht verändert.
Somit sollte er mit 1 MHz laufen denke ich
shedepe, wenn ich das richtig verstanden habe nützt es mir jetzt nichts, wenn ich einfach eine if Abfrage mit einbaue.
Warum ?
Ich habe ja dan über der If Abfrage meinen Code stehen ( siehe weiter oben )
Der Code wird jedes mal Abgearbeitet wenn der Controller Strom bekommt.
Somit darf doch der Code nicht über der If Abfrage stehen oder ?
Ich möchte ja per Taster sagen, wenn 5 Sekunden gedrückt Funktion deaktivieren.
Wenn wieder 5 Sekunden gedrückt wurde Funktion aktivieren.
Verstehe ich das falsch ?
Ich glaube dir fehlt so ein bisschen das Grundverständnis für Mikrocontroller.
Letztendlich hat dein Code eine main Funktion
Wenn der Controller startet oder einen Reset durchführt schaut er im Speicher an einer bestimmten Stelle nach. Nämlich dort wo der Code für die Main Funktion liegt. Dieser Code wird dann ausgeführt.Code:int main(void) { }
D.h. effektiv wenn wir einfach nur eine Anweisung reinschreiben, dann wird diese ausgeführt und das Programm ist zu Ende.
Also z.B
Deshalb haben wir die Main schleife. Jede Anweisung darin wird so lange ausgeführt bis der Controller ausgeschaltet wird:Code:int main(void) { DDRB = (1<<PB0); //Und jetzt endet das Programm }
Also:
Für Deinen Fall bedeutet das jetzt, dass du in etwa sowas hier willst:Code:int main(void) { //Einmalige Setup Sachen (z.B. pin auf Eingang setzen) while(1) { //Sachen die wiederholt getan werden sollen (Also z.B. Pin Zustand abfragen) } }
Ich habe hier Pseudocode(als Kommentar) und realen Code gemischtCode:int main(void) { DDRB = (1<<PB0); //Entsprechende PINs auf Eingang setzen //Weitere Setup Aktionen durchführen wie z.B. LED Pin auf Ausgang setzten //Zustand aus dem EEPROM lesen if(statusfromeeprom) { //LED an //10 Sekunden warten //LED aus } while(1) { //Hier jetzt den Taster abfragen: if(PINB & (1<<PB0)) { _delay_ms(5000); //5 Sekunden warten if(PINB & (1<<PB0)) //Schauen ob der Pin immer noch High ist { //Jetzt wissen wir der Taster wurde für mindestens 5 sekunden gedrückt //Also neuen Status in das EEPROM schreiben } } } }
PS. Was ich vergessen habe: Tu dir selber den Gefallen und verbringe einfach mal paar Stunden zum einen damit das passende Datenblatt des Controllers zu lesen:
http://www.atmel.com/images/atmel-25..._datasheet.pdf (Schau ob das das richtige ist!)
Und vorallem das AVR-GCC Tutorial: https://www.mikrocontroller.net/arti...R-GCC-Tutorial
https://www.mikrocontroller.net/arti...n-_und_Ausgabe
Dabei geht es gar nicht darum dass man danach alles weiß was drin steht, sondern in den Datenblättern/Tutorien wird auch allgemein einiges über Prinzipien und Abläufe erklärt. Wenn man sich die Mühe macht das mal durchzuarbeiten hat man danach einen viel tieferen Einblick was alles möglich ist und vorallem wie es möglich ist.
Das Konstrukt mit dem Delay sollte man wirklich ert mal machen und zum laufen bringen, also inklusive Abfrage des Zustandmerkers aus dem EEPROM und schreiben des selben.
Auch wenn das Delay nicht erkennt, wenn jemand den Taster drückt für 4,9 Sekunden loslässt und grade noch rechtzeitig vor Ende des Delays ein zweites mal drückt.
Das wird man dann später mit einem Interrupt der auf Pegeländerung des Tastereingangs reagiert und einem Timer abfangen können.
Lesezeichen