PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe mit C-Code für einen ATmega645 auf STK600 Board



Igge3004
03.04.2014, 20:45
Hallo,

ich habe ein Problem mit meinem C-Code und komme irgend wie nicht dahinter warum :(
Unten ein Ausschnitt aus meinem Programm. Ich habe diverse Test LEDs zwischen geschaltet um zu testen wo ich im Ablaufprogramm hängen bleibe. Ich komme in die Stop Routine rein bis unten zu den letzten Zeilen durchläuft er das Programm ohne Fehler. Auch die TestLED4 wird gesetzt. Mein Problem ist jetzt das er mir die Variable Stop (zum verlassen der Stop Routine) nicht auf 0 setzt. Wenn er das machen würde müsste die TestLED0 wieder aus gehen und das tut sie nicht und mein "normales" Ablaufprogramm bleibt gesperrt. Also warum setzt er die TestLED4 aber Stop nicht auf 0 obwohl beide in der gleichen if-Schleife sind? Ich hoffe mir kann hier einer weiter helfen bin grad am Verzweifeln :(
Programmiert ist alles mit dem Atmel AVR Studio 6 Version 6.1.2730 mit dem STK600 Experimentierboard.
Ich sag schon mal Danke für alle Tips ;)

// Auswertung Stop Variable ob 0 oder 1

if (Stop==0) {
PORTB &= ~(1 << TestLED0);}
if (Stop==1) {
PORTB |= (1 << TestLED0);}

// -------------- Programmabschnitt Stop --------------------------
// Auswertung Stop Routine
if (Stop==1){
if ((Stop_aktiv==0) && (Schluessel_auf==0) && (Schluessel_zu==0)) {
Stop_aktiv=1;
PORTB |= (1<<TestLED1);} // Ansteuerung von Test LEDs
PORTB |= (1<<TestLED2);

if ((Pointer_oeffnen>=1) && (Stop_aktiv==1)){ // Auswertung Programm öffnen aktiv
cli();// Globale Interuptfreigabe löschen
if (Schluessel_auf==1) { // Auswertung das "Schlüssel auf" betätigt wurde
Stop=0; // Stop Routine verlassen
PORTB |= (1<<TestLED4);
Stop_aktiv=0;}
sei(); }

witkatz
03.04.2014, 21:19
Geht die Auswerteroutine noch weiter? Wenn man sich den Code in einem Editor mit Syntax Highlighting anschaut (habe kein AVR - auf die Schnelle Notepad++ benutzt), fällt auf, dass die geschweifte Klammer nach if (Stop==1){ nicht geschlossen wird. Nicht dass dann Code mit ausgeführt wird, das nicht zu der Routine gehört, in dem Stop gesetzt wird :confused:
if (Stop==1){
if ((Stop_aktiv==0) && (Schluessel_auf==0) && (Schluessel_zu==0)) {
Stop_aktiv=1;
PORTB |= (1<<TestLED1);
} // Ansteuerung von Test LEDs
PORTB |= (1<<TestLED2);

if ((Pointer_oeffnen>=1) && (Stop_aktiv==1)){ // Auswertung Programm öffnen aktiv
cli();// Globale Interuptfreigabe löschen
if (Schluessel_auf==1) { // Auswertung das "Schlüssel auf" betätigt wurde
Stop=0; // Stop Routine verlassen
PORTB |= (1<<TestLED4);
Stop_aktiv=0;
}
sei();
}

Igge3004
03.04.2014, 21:40
Geht die Auswerteroutine noch weiter? Wenn man sich den Code in einem Editor mit Syntax Highlighting anschaut (habe kein AVR - auf die Schnelle Notepad++ benutzt), fällt auf, dass die geschweifte Klammer nach if (Stop==1){ nicht geschlossen wird. Nicht dass dann Code mit ausgeführt wird, das nicht zu der Routine gehört, in dem Stop gesetzt wird :confused:


Ja die Auswerteroutine geht noch weiter. Ich habe allerdings den Rest auskommentiert damit mir nicht irgend etwas weiter unten da oben rein pfuscht. Die Fehlenden Klammern kommen ganz unten am Schluss. Das war das erste was ich gecheckt hab. Den Eingang in die Stop Schleife ist eine Auswertung von zwei Eingängen und zwei Variablen. Das hab ich bereits gecheckt, das die mir stop nicht mehr auf 1 setzt. Das ist die einzigste Stelle wo ich stop setze.

MfG.