PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgänge setzen



mumum
29.12.2008, 17:45
Es gibt ja mehrere Arten Ausgänge anzusteuern aber bei mir machen die alle was andres.
1. PORTB |= (1<<PB4);
2. PORTB &= ~_BV(PB4);

Bei diesem Code habe ich die 2. Variante verwendet. Wenn ich bei dem gleichen Programm die 1. Variante anwende, dann gehen nach 50 mal Durchblinken meine LED`s nicht mehr aus.



#include <avr/io.h>
#define F_CPU 1000000UL // 1 MHz
#include <util/delay.h>

int main(void)
{
DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3); // PB0, PB1, PB2 Ausgänge
int leuchtzeit =200; // Blinkzeit
int i=1;

while (i<50) { //

PORTB &= ~_BV(PB0); _delay_ms(leuchtzeit); PORTB |= _BV(PB0);
PORTB &= ~_BV(PB1); _delay_ms(leuchtzeit); PORTB |= _BV(PB1);
PORTB &= ~_BV(PB2); _delay_ms(leuchtzeit); PORTB |= _BV(PB2);

i++;
}
return(0);
}


Was ist der Unterschied zwischen 1. und 2.??

Felix G
29.12.2008, 18:05
Variante 1 setzt ein Bit, Variante 2 löscht es... davon abgesehen gibt es keine Unterschiede, da _BV(x) letztendlich auch nur durch (1 << x) ersetzt wird

thewulf00
30.12.2008, 09:16
Wie Felix schon sagte, ist Deine Reihenfolge einfach falschrum.

Erst setzen mit "PORTB |= _BV(PB0)" (Da wird verODERt, d.h. ein Bit GESETZT), dann löschen mit "PORTB &= ~_BV(PB0)"! (Da wird mit dem Gegenteil verUNDet, d.h. ein bit GELÖSCHT)

mumum
30.12.2008, 14:10
Ah super das geht jetzt.

wollt jetz bisschen erweitern mit ner if Anweisung.


#include <avr/io.h>
#define F_CPU 1000000UL // 1 MHz
#include <util/delay.h>
#include <inttypes.h>
#include <stdint.h>
#define leuchtzeit 200



int main(void)
{
DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3); // PB0, PB1,PB2Ausgänge

int i=1;



while (1)
{

if (i > 30){

PORTB |= (1<<PB3);

}
else {
while (i<50) {

PORTB &= ~(1<<PB0); _delay_ms(leuchtzeit); PORTB |= (1<<PB0);
PORTB &= ~(1<<PB1); _delay_ms(leuchtzeit); PORTB |= (1<<PB1);
PORTB &= ~(1<<PB2); _delay_ms(leuchtzeit); PORTB |= (1<<PB2);

i++;
} }
}

return(0);
}


Jetzt sollte ja eigentlich nach 30 mal blinken der Ausgang PB3 angesprochen sein. Aber PB3 ist nach Programmstart sofort an und geht dann wieder aus wen PB0..3 aufhören durch zulaufen. Irgendwie ignoriert der meine if Anweisung.

mumum
30.12.2008, 14:22
Ich hab jetz mal die If anweisung in die Schleife gemacht dan geht es.
Wie krig ich das hin das es auch außerhalb funktioniert?