Forum: Mikrocontroller und Digitale Elektronik Menu Steuerung mit Rücksprung


von Rudi (Gast)


Lesenswert?

Hy zusammen,

sehe den Wald vorlauter Bäumen nicht, also ich will mit einem Atmega 
Ports schalten. Das ganze funktioniert auch alles wie ich es möchte. Nur 
ein Punkt macht mir Kopfschmerzen.
Per UART lesen ich ein Zeichen, das wird gespeichert im eeprom(Klappt) 
und später geladen (bzw. eine Funktion). Das "Menu" kommt und wartet 
max. 5 Sekunden und Lädt die Einstellung (aus eeprom). Wenn man aber ein 
Zeichen eingibt zb. 'a' wird das Menu früher verlassen oder man kann 
eine andere Einstellung laden. Bis hier hin Klappt auch alles, nur ich 
will ein schutz einbauen der unbekannte Zeichen meldet durch ein neu 
start des Menus und einer kleinen Meldung anzeigt.
ich habe das ganz erst mal so stehen:
1
//start: 
2
state = 5000;
3
while((buff_comp != 1) && (state--))_delay_ms(1);
4
buff_comp = 0;
5
if(buf[0] == 'a')send(text7);
6
else if(buf[0] == '1'){eeprom_write_byte(2,1);}
7
else if(buf[0] == '2'){eeprom_write_byte(2,2);}
8
else if(buf[0] == '3'){eeprom_write_byte(2,3);}
9
else if(buf[0] == '4'){eeprom_write_byte(2,4);}
10
else if(buf[0] == '5'){eeprom_write_byte(2,5);}
11
else if(buf[0] == '6'){eeprom_write_byte(2,6);}
12
else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0] != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] != 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
13
14
send_(text7);

Als erstes dachte ich, ich mache das mit dem goto aber wenn der spring 
zwar zum anfang zurück aber das mach er auch wenn die zeit abgelaufen 
ist. Das ist nicht der Sinn den er machen soll.

Danke für eure Ratschläge und Tipps

mfg Rudi

von Daniel S. (daniel_s49)


Lesenswert?

Davon ab, dass goto von den meisten Programmierern eher nicht so gerne 
gesehen wird (Stichwort: Spaghetticode) und dass sich mir der Sinn nicht 
erschließt, wieso du den Wert in den eeprom schreibst um ihn später in 
einer anderen Funktion wieder auszulesen (reichen keine normalen 
Variablen dafür? EEPROM ist langsam und hat eine begrenzte Anzahl an 
Schreibzugriffen).

Dein letztes else if:
1
else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0] != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] != 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
kann man auch so schreiben:
1
else if(buf[0] != 'E'){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
Wäre buf[0]== '4', wäre er bereits oben in das else if gegangen. Da er 
nicht dort rein ging und statt dessen die weiteren else ifs testet, 
weißt du, dass buf[0] != '4' sein muss wenn er unten ankommt.

So, und im Timeout-Fall ist buf[0] != 'E' und damit geht er dort rein. 
Denk mal, da musst du den Timeout gesondert abfangen. ZB oben direkt als 
erstes if ein if(state==0).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Rudi schrieb:
> if(buf[0] == 'a')send(text7);
> else if(buf[0] == '1'){eeprom_write_byte(2,1);}
> else if(buf[0] == '2'){eeprom_write_byte(2,2);}
> else if(buf[0] == '3'){eeprom_write_byte(2,3);}
> else if(buf[0] == '4'){eeprom_write_byte(2,4);}
> else if(buf[0] == '5'){eeprom_write_byte(2,5);}
> else if(buf[0] == '6'){eeprom_write_byte(2,6);}
> else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0]
> != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] !=
> 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto
> start;*/}
>
1
if(buf[0] == 'a')send(text7);
2
else if((buf[0] >= '1') && (buf[0] <= '6')))
3
   {eeprom_write_byte(2, buf[0]-0x30);}
4
else if(buf[0] == 'E'){/* Timeout */}
5
else
6
 {send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}

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.