PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem: Beim Benutzen von if schweigt der µC



mZ
01.03.2008, 18:07
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 :)

#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

Felix G
01.03.2008, 20:06
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:


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

Ceos
02.03.2008, 09:08
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 ?

Felix G
02.03.2008, 13:04
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.

Ceos
03.03.2008, 00:56
*GRUMMEL* ich sagte doch bitte erst denken

naja hier die wahrscheinliche auflösung, kann sein das da noch was technisches hinter steckt


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 ....

Felix G
03.03.2008, 01:29
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.

Ceos
03.03.2008, 17:57
ouh shite wie peinlich XD voll übersehen hast recht, das iss komisch