PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GCC Anfangsprobleme



Furtion
23.12.2008, 14:54
Hi,

ich habe mich wieder einmal mit AVR-GCC beschäftigt und man staune es
sogar geschaft 2 Leds blinken zu lassen (bei dem vorherigen Versuch habe
ich sie nicht mal getrennt anbekommen...). Naja ich habe mich dann mal
an deinen Taster gewagt, was auch funktioniert hat. Nun möchte ich über
einen Taster eine Variable hochzählen und je nach Wert die Leds an schalten.

Nur geht das nicht so ganz wie ich das will, hier erstmal der Code den ich
habe:


#include <avr/io.h> // (1)
#include <util/delay.h>
#include <stdint.h>
uint8_t i;

int main (void) { // (2)

i = 1;

DDRD = (0 << DDD2) | (1 << DDD5) | (1 << DDD6);

while(1) { // (5a)

if (PIND & 0x04) {
_delay_ms(150);
i++;
if (i==3){
i=1;
}
}
if (i==1) {
PORTD = (1 << PORTD5);
PORTD = (0 << PORTD6);
}

if (i==2) {
PORTD = (0 << PORTD5);
PORTD = (1 << PORTD6);
}
} // (5c)

/* wird nie erreicht */
return 0; // (6)
}


Wenn man auf den Taster (Portd.2) drückt (kurz) wird der gewünschte
Effekt eigendlich erzieht (die Leds (Portd.5 & 6) blinken). Wenn ich den
Taster gedrückt halte blinkt nur die Led an D.6, bzw. passiert irgendwas.
Irgendwie ist das ganze Programm auch etwas instabil und macht was
es will.

Gibt es irgendwo in meine Program größere Fehler?

Was ich auch noch nicht so raus habe ist der Vergleich von Variablen. Muss
man da if ( i & 0x01 ) ; if ( i == 1 ) oder if ( i = 1 ) benutzen?

zerush
23.12.2008, 15:05
Ja, den gibt es:

setzten eines Bits geht so:

PORTD |= ( 1 << PORTD5);

und löschen so:

PORTD &= ~(1 << PORTD5);

Zum Vergleich:

if( i & 0x01 ) macht eigentlich folgendes: if( (i & 0x01) != 0)
i & 0x01 ist hierbei ein bitweises UND.
Mit der if-Anweisung prüfst du quasi, ob das Bit mit dem Wert 0x01 gesetzt ist.

if( i == 1) prüft, ob i den Wert 1 hat.

if ( i = 1) ist nicht das, was du haben willst und vergleicht NICHT i mit 1.


Viel Erfolg und frohes Fest,
Thomas

Furtion
23.12.2008, 15:16
Hi,

es geht :)

Danke und ein frohes Fest