Hallo ,
ich besitze noch keine große Programmiererfahrung, aber es macht Spaß. Jetzt habe ich eine Zeitablaufanzeige mit LEDs und millis() begonnen.
Ein Timer (im Sketch fest 60 sec.) wird per Taster gestartet. Zu Beginn leuchten 6 LEDs. Nach jeweils einem Zeitintervall von 10 Sekunden erlischt eine LED nach der anderen.
Problem 1: Das 1. Zeitintervall hat nicht genau 10 Sekunden (Wert ca. 6-8 Sek.).Intervall 2 - 6 sind dagegen immer genau 10 Sek. lang. Durch den Fehler im 1. Intervall wird aber schon nach 56 - 58 Sek. ausgeschaltet.
Problem 2:Ein definierter Zustand bei Drücken des Tasters wird z. Zt. nur mit Reset erreicht.
Kann man diese Fehler beseitigen oder ist der Ansatz falsch.
rexonator:
... ich besitze noch keine große Programmiererfahrung, aber es macht Spaß. ...
Über hilfreiche Tipps würde ich mich freuen.
Ich finde, dass Dein Code schlecht lesbar ist. Ich habe allerdings fast keine Erfahrung im Lesen fremder Codes. Aber vielleicht hilft ja: Wenn Du den Code so formatierst (Einrückungen, Zeilenlängen), dass er gut les- und nachvollziehbar ist, findest Du den Fehler wahrscheinlich auf Anhieb. Mir geht’s jedenfalls immer wieder so.
Hallo rexonator,
erstmal herzlich willkommen im Forum.
Bei deinem Sketch sind t1 bis t6 nach dem Start des Arduino =0, während der Laufzeit werden sie gesetzt, daher ist die Zeit nach dem Start bis zum drücken des Tasters für t1 schon vorbei. Vermutlich brauchst du ca. 4 sek. bis der Taster gedrückt ist. Wenn du den Arduino neu startest und lange genug (>60 sek) wartest, läuft alles nicht mehr wie es soll.
void setup() {
DDRB &= ~(1<<PB0); // PORTB pin 0 als Eingang
PORTB |= (1<<PB0); // pull-up in PORTB pin 0 aktivieren
DDRB |= (1<<PB5); // PORTB pin5 als Ausgang (digital 13 Arduino )
DDRD = 0b11111100; // PortD Pin 2 - Pin 7 als Ausgang setzen
unsigned long now = millis();
}
Du solltest dich entscheiden, ob du Arduino Pin Bezeichnungen oder atmega PORT/BIT Namen verwenden willst. Für deine LED nimmst du digitalWrite, entsprechend wäre
( PORTB &=~ (1<<PB5); heisst in der "Arduino Sprache" digitalWrite(13, LOW); )
Die lokale Variable now in setup ist eine andere als die in loop. ( Die in setup ist also unnötig )
Problem 2:Ein definierter Zustand bei Drücken des Tasters wird z. Zt. nur mit Reset erreicht.
Kann man diese Fehler beseitigen oder ist der Ansatz falsch.
Korrigieren kann man auch einen falschen Ansatz
Die Zeit seit Tastendruck wird durch ( now - t1 ) gemessen, also muss die Zeit t1 auch beim Tastendruck neu gesetzt werden.
Wofür du t2 .. t6 brauchst, weiss ich nicht.
Die LEDs sollen ausgehen, wenn (now - t1) > 10, 20, 30, 40 sec ist, richtig ?
Wenn egal ist , was passiert wenn du 50 Tage lang den Taster nicht drückst, kannst du den Wert von t1 auch "für immer" so lassen, wie er beim jeweiligen Tastendruck gesetzt wurde.
Problem 1 ist die Zeit zwischen Reset und deinem ersten Test-Tastendruck.
danke für die schnelle und kompetente Hilfe. Es funktioniert! Entscheidend war es, in die "if"-Schleife des Tasters den Zeitstempel t1=millis() einzubringen.
Ich lese mich parallel auch in C und die hardwarenahe Programmierung des Atmega 328 ein. Deshalb wurden von mir teilweise Befehle der Bitmanipulation verwendet. Zur Übung.
Der Arduino-Compiler kann beides.
Die millis()-Funktion habe ich durch eure Hinweise jetzt wohl verstanden .