www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mein if Anweisung geht nicht


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bin am verzweifeln das Programm macht nicht das was es soll.
Ich möchte das es die If Anweisungen aufruft (if 1-4 ) obwohl ich 
izeile1 auf 1 setze tut sich nichts?

int main(void)
{
DDRC = 0x00;  //c1=1 c2=2 c3=3 c4=4 c5=5 c6=6 c7=7 d0=8 d1=9 d2=0 d3=up d4=down d5=left d6=right c0=return d7=enter
DDRD = 0x00;



lcd_init();
izeile1 = 1;
izeile2 = 2;
izeile3 = 3;
izeile4 = 4;
while(1){
hauptmenu();
}
return 0;
}


int hauptmenu(void)
  
    if    (PIND == ((0b00001000)&(0b00001000))){    // up
    while(PIND == ((0b00001000)&(0b00001000))){} 
    //if (!(izeile1==-2)){
                izeile1 = izeile1 -1;
    izeile2 = izeile2 -1;
    izeile3 = izeile3 -1;
    izeile4 = izeile4 -1;
    }//}

    if    (PIND == ((0b00010000)&(0b00010000))){     // down
    while(PIND == ((0b00010000)&(0b00010000))){} 
    //if (!(izeile3==4)){
                izeile1 = izeile1 +1;
    izeile2 = izeile2 +1;
    izeile3 = izeile3 +1;
    izeile4 = izeile4 +1;
    }//}


  
    
    


lcd_clear();
//set_cursor(0,2);
//lcd_string(">");

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 1
set_cursor(1,izeile1);
lcd_string("1 SETUP");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 2
set_cursor(1,izeile2);
lcd_string("2 STARTEN");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1== 2||izeile1 == 3){   // If 3
set_cursor(1,izeile3);
lcd_string("3 SILO");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 4
set_cursor(1,izeile4);
lcd_string("4 STATUS");
//izeichen=izeichen+1;
}




//set_cursor(1,4);
//lcd_string("ANLAGE AUS");
uebergabe();
_delay_ms(200);

return 0;
}


Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    0b00001000
 &  0b00001000
 -------------
 =  0b00001000
Das & ist an der Stelle absolut überflüssig, weil es nichts macht. Ich 
vermute fast, Du hast das mit der Bitzustandsabfrage nicht ganz 
verstanden. Ich kann mir nämlich nicht vorstellen, dass Du garantieren 
kannst, dass PIND jemals wirklich exakt gleich 0b00001000 oder 
ob00010000 wird.

Schau Dir mal den Artikel Bitmanipulation an. Da steht, wie es 
richtig geht!

Allerdings ist es verdammt schwer, wirklich sinnvoll zu helfen, wenn Du 
sagst "Das Programm macht nicht, was es soll", aber nicht erzählst, 
was es denn machen soll. Außerdem ist der Code oben absolut 
unzureichend kommentiert, was es für dritte sehr schwer macht, 
nachzuvollziehen, was da passiert.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gewöhn dir mal eine anständige Klammersetzung
und einrücken von Code an. Den Scheiss da oben
überblickt doch kein Schwein.

Beispiel:

while(1){
hauptmenu();
}


while(1)
 {
  hauptmenu();
 }

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry es geht um if 1-4 und nicht up und down oder was meinst du

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein das durch

izeile1 = izeile1 -1;

izeile1 = 0 ist?


Aber die code ist wirklich unübersichtlich, wo geht überhaupt die 
klammer { für die funktion int hauptmenu(void) auf?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger wrote:
> Sorry es geht um if 1-4 und nicht up und down oder was meinst du
Noch mal: Solange hier keiner außer Dir weiß, was das Programm machen 
soll und was es konkret nicht macht, kann Dir auch keiner wirklich 
helfen.

"Funktioniert nicht" ist keine Fehlerbeschreibung.

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe da ein Problem:

Es sind 4 If- Abfragen. Aber alle fragen das selbe ab. Gewollt??

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie schauen die Funktionen
lcd_string
und
set_cursor
aus?

Wenn nichts passiert kann das auch an diesen Funktionen liegen.

Grüße

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter

Aber doch nur wenn ich den Taster betätige aber izeile ist doch auf 1 
gesetzt

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.8T-Passat

ja das soll so, dass ist ein menu auf eim LCD

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher sollen wir wissen wie deine Taster sein, können ja auch invertiert 
sein.

Schreibe mal das izeile1 = 1; direkt über die IF anweisung die deiner 
meinung nach nicht geht.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tom

das sind Funktionen von LCD.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe izeile1 = 1; über die Anweisung geschrieben dann geht es aber 
wenn ich es weg mache geht es nicht mehr.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann geht doch mal logisch ran und kommentiere alle stellen aus die 
izeile1 verändern (auser die zuweisung auf 1).

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur die Taster und an denen machen ich doch nichts

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe mir auch die Variabel izeile1 auch schon anzeigen lassen und 
sie ist 1 aber die if Anweisung geht nicht.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sie kann aber nicht 1 sein, sonst würde es ja gehen, wenn du sie vorher 
auf 1 setzt und es geht muss sie jemand verändern.

mache es einfach und kommentiere die stellen mal aus!

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe up und down komplett auskommentiere und ich komme nicht in die 
if

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <util/delay.h>
#include <avr/io.h>
#include "lcd.h"
// Prototypen
int hauptmenu(void);
int uebergabe(void);

// globale Variablen 
int izeile1;  // zeilen gehen von 1-4 
int izeile2;
int izeile3;
int izeile4;
int izeichen; // zeichen gehen von 0-15

// main

int main(void)
{
DDRC = 0x00;  //c1=1 c2=2 c3=3 c4=4 c5=5 c6=6 c7=7 d0=8 d1=9 d2=0 d3=up d4=down d5=left d6=right c0=return d7=enter
DDRD = 0x00;



lcd_init();
izeile1 = 1;
izeile2 = 2;
izeile3 = 3;
izeile4 = 4;
while(1)
{
  hauptmenu();
}
return 0;
}










int hauptmenu(void)
{  /**
    if    (PIND == ((0b00001000)&(0b00001000))){    // up
    while(PIND == ((0b00001000)&(0b00001000))){} 
    //if (!(izeile1==-2)){
        //izeile1 = izeile1 -1;
    //izeile2 = izeile2 -1;
    //izeile3 = izeile3 -1;
    //izeile4 = izeile4 -1;
    }//}

    if    (PIND == ((0b00010000)&(0b00010000))){     // down
    while(PIND == ((0b00010000)&(0b00010000))){} 
    //if (!(izeile3==4)){
        //izeile1 = izeile1 +1;
    //izeile2 = izeile2 +1;
    //izeile3 = izeile3 +1;
    //izeile4 = izeile4 +1;
    }//}

**/
  
    
    


lcd_clear();
//set_cursor(0,2);
//lcd_string(">");

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
set_cursor(1,izeile1);
lcd_string("1 SETUP");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
set_cursor(1,izeile2);
lcd_string("2 STARTEN");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1== 2||izeile1 == 3){
set_cursor(1,izeile3);
lcd_string("3 SILO");
//izeichen=izeichen+1;
}

if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
set_cursor(1,izeile4);
lcd_string("4 STATUS");
//izeichen=izeichen+1;
}




//set_cursor(1,4);
//lcd_string("ANLAGE AUS");
uebergabe();
_delay_ms(200);

return 0;
}


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann solltest du uns vielleicht erstmal den kompletten code zur 
verfügung stellen, denn izeile1 hat überhaupt kein Datentyp.

Und ich bezweifele das der code von oben überhaupt compiliert.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch das tut er

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja also ich persönlich habe meine LCD-Funktionen selber 
geschrieben..deswegen hab ich gefragt.

Stell einfach mal deinen kompletten Source-Code als c-File bzw als 
Zip-File hier rein.

Grüße

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja der code ja, ist ja auch etwas mehr als oben.

Was macht übergabe? kann sein das er die izeile1 ändert?

wenn du izeile1=1 über die if einweisung schreibst geht es, also kann ja 
izeile1 nicht 1 sein.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tut er nicht weil nach int hauptmenu(void) keine "{" kommt...

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
übergabe habe ich grade ausgeklammert und bringt nichts

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Tut er nicht weil nach int hauptmenu(void) keine "{" kommt...

ich bekomme aber kein error und am ende ist }

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahso, sorry, hab den 2ten Code übersehen, den du eingefügt hast.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teste bitte noch mal ob es mit izeile1=1 über den IF immer noch geht. 
Denn jetzt denn sonst kann ich keinen Fehler mehr finden - und das 
verhalten ist nicht erklärbar.

Lade es mal in den Simulator und gehe schrittweise durch.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angezeigt werden kann gar nix, da jedesmal nach erneutem Ausführen der 
Funktion Hauptmenü lcd_clear ausgeführt wird...ich nehme an das löscht 
den Displayinhalt.
Des weiteren wird das LCD alle 200 ms überschrieben.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na gut angezeigt müsste schon was werden, aber wahrscheinlich flackerts.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Angezeigt werden kann gar nix, da jedesmal nach erneutem Ausführen der
>Funktion Hauptmenü lcd_clear ausgeführt wird...ich nehme an das löscht
>den Displayinhalt.
>Des weiteren wird das LCD alle 200 ms überschrieben.

das ist alles richtig denn wenn ich izeile1 =1; über if1 einfüge bekomme 
ich eine Anzeige

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

na dann passts ja. :)
Viel Erfolg noch.

Grüße

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke an alle!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.