-         

Ergebnis 1 bis 7 von 7

Thema: Anfängerproblem: Beim Benutzen von if schweigt der µC

  1. #1

    Anfängerproblem: Beim Benutzen von if schweigt der µC

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    heute habe ich mich mal an meinen mega8 rangewagt. Immerhin - blinken kann er schonmal. ^^
    Nun habe ich aber das seltsame Problem, dass der Controller scheinbar nichts mehr macht, wenn ich eine if-Anweisung benutze. Ob es am Code liegt oder an etwas Anderem, da bin ich mir mittlerweile nicht so sicher. Der Code sieht für mich zwar soweit richtig aus, aber selbst wenn ich den größten Mist schreibe, meckert WinAVR nur selten und lässt alles schön kompilieren :/

    Hier mal das höchstaufwändige Programm
    Code:
    #include <avr/io.h>          
    
    int main (void) {            
     
    	DDRD  = 0b01100000;
    	PORTD = 0x00;
    	int i = 10;
    	
    	while(1)
    	{	
    		//if((PIND & (1<<PIND2)) && i>1) i--;
    		//if((PIND & (1<<PIND4)) && i<20) i++;
    		if((PIND & (1<<PIND3)) && i<20) PORTD = 0b01100000;
    		warte(1000 * i);
    		PORTD = 0x00;
    		warte(1000);
    	}                     
    	return 0; 
    }
    
    
    void warte(long iZyklen)
    {
    	long j = iZyklen;
    	long l = 10000;
    	while(j>0)
    	{
    		j--;
    		while(l>0)
    		{
    			l--;
    		}
    	}
    }
    So lange die beiden Zeilen auskommentiert sind, blinkt der Controller fröhlich vor sich hin...
    mfg

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Obwohl die Nutzung von if ohne geschweifte Klammern möglich ist, würde ich generell eher davon abraten.

    Denn ohne die Klammern steht nur die erste der folgenden Anweisungen im if-Block, der rest wird behandelt als wäre das if nicht da. Aber naja, immerhin ist das bei deiner Schreibweise (mit der Anweisung direkt hinter dem if) ja noch ganz gut zu erkennen.


    Also bei deinen if Anweisungen fallen mir zunächst mal fehlende Klammern auf...

    der && Operator hat nämlich eine höhere Priorität als < und >, dein erstes if würde also etwa so vom Compiler interpretiert:

    Code:
    if(((PIND & (1<<PIND2)) && i) >1)
    Ich würde daher zuerst mal die i>1 und i<20 jeweils in Klammern setzen, vielleicht reicht das schon
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    die lösung liegt doch klar auf der hand, deine warte() hat nen fehler, du wartest nach dem du das bit gesetzt hast 10000 + (1000*i) zyklen (zyklen zu warten iss sowieso doof)

    bevor ich dir die lösung präsentiere schau dir mal deine schleifen und die variable L genau an, iss n kleiner fieser tippfehler bvermute ich mal XD

    deine wartezeit sollte sicherlich 10000 * (1000 * i) statt + sein oder ?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Naja, obwohl die Funktion warte fehlerhaft ist, denke ich nicht daß sie das von ihm beschriebene Problem verursacht.

    Denn warte wird immer aufgerufen, egal ob die if Anweisungen auskommentiert sind oder nicht.
    So viele Treppen und so wenig Zeit!

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    *GRUMMEL* ich sagte doch bitte erst denken

    naja hier die wahrscheinliche auflösung, kann sein das da noch was technisches hinter steckt
    Code:
          if((PIND & (1<<PIND3)) && i<20) PORTD = 0b01100000;
          warte(1000 * i);  // selbst bei i = 256 ist das nur 8 / 256 000 * 4 = 1/8 Sek das licht an dann gleich wieder AUS! 
          PORTD = 0x00;
    das licht ist VIEL zu kurz an, ich vermute das er den blitz kaum wahrnimmt
    aber eigentlich müsste er sowas wie ein pseudo pwm signal mit nem tastverhältnis 10:1 haben und dann sollte man schon ein glimmen wahrnehmen oder überhaupt eine reaktion ....

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Das mag ja alles sein, aber es erklärt nicht warum das Blinken ohne die ersten beiden if Anweisungen funktioniert.

    siehe 1. post ganz unten:
    So lange die beiden Zeilen auskommentiert sind, blinkt der Controller fröhlich vor sich hin...
    Damit ist die warte Funktion als Verursacher des Problems eigentlich schon ausgeschlossen, da sie wie gesagt unabhängig von den if Anweisungen immer ausgeführt wird.


    Natürlich ist die warte Funktion auch fehlerhaft, aber sie ist eben nicht das Hauptproblem.
    So viele Treppen und so wenig Zeit!

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    ouh shite wie peinlich XD voll übersehen hast recht, das iss komisch

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •