Mikrocontroller programmieren

OP #6336230
Lesenswert?

Hi,

ich hab mal eine kleine Frage. Ich bin gerade neu im Bereich des 
programmieren was Mikrocontroller betrifft.

Ich hab an meinem µC mehrere LED's. Ich hab jetzt mal eine LED zum 
leuchten gebracht mit dem Befehl:

while(1){
GPIOB -> ODR = 0x1; // LED 1
}

Die LED 1 leuchtet auch soweit. Nun will ich sich zum blinken bringen.

while(1){
GPIOB -> ODR = 0x1; // LED 1
delay(100);
GPIOB -> ODR &=~ 0x1;
delay(100);
}

void delay(int delay)
{
   int i;
   for (;delay > 0; delay--)
   {
      for (i = 0; i < 3195; i++);
   }
}

Das hat auch wunderbar geklappt.

Nun wollte ich das spiel mit zwei LED's machen, aber irgendwie 
funktioniert das ganze nicht wie ich es mir vorgestellt habe. Ich würde 
gerne wollen, dass beide LED's gleichzeitig blinken und nicht 
nacheinander. Ich dachte mit dem Code:

while(1){
GPIOB -> ODR = 0x1; // LED 1
GPIOB -> ODR = 0x2; // LED 2
delay(100);
GPIOB -> ODR &=~ 0x1; // invertieren LED aus
GPIOB -> ODR &=~ 0x2; // inverdieren LED aus
delay(100);
}

void delay(int delay)
{
   int i;
   for (;delay > 0; delay--)
   {
      for (i = 0; i < 3195; i++);
   }
}

sollte es klappen aber nur LED 2 blinkt und LED 1 nicht. Programmiert 
man das nicht so oder wo ist hier mein Fehler?

Bitte nur darauf antworten, wenn es für mich hilfreich ist, alles andere 
wird von mir ignoriert. Meine Zeit ist kostbar!

LG
RW
#6336246
Lesenswert?

jo mei schrieb:
> Es ist unnötig den Mikrocontroller anzugeben

Das stimmt hier tatsächlich, denn den Fehler kann man im Code schön 
sehen.

Zuerst werden die IOs auf 0x1 gesetzt, also wenn das z. B. 8 IOs sind, 
dann wird 00000001 ausgegeben. Die LED am letzten IO leuchtet.

Danach setzt er die IOs auf 0x2 und es wird 00000010 ausgegeben, also 
eine 2 (siehe Binärsystem). Die letzte LED ist dann wieder aus.
OP #6336250
Lesenswert?

Lars schrieb:
> jo mei schrieb:
>> Es ist unnötig den Mikrocontroller anzugeben denn es gibt
>> ja nur einen Einheits-Controller auf der ganzen Welt.
>
> Stimmt. Ist dir das noch nicht aufgefallen?
>
> Richard W. schrieb:
>> GPIOB -> ODR = 0x1; // LED 1
>> GPIOB -> ODR = 0x2; // LED 2
>
> versuchs mal mit:
>
>> GPIOB -> ODR |= 0x1; // LED 1
>> GPIOB -> ODR |= 0x2; // LED 2

danke lars, ich hab das genau so auch vorher recherchiert und mir in 
meinem block aufgeschrieben aber leider habe ich das vergessen im code 
zu übernehmen. danke es klappt jetzt.
Gast #6336263
Lesenswert?

Richard W. schrieb:
> Hi,
>

> Bitte nur darauf antworten, wenn es für mich hilfreich ist, alles andere
> wird von mir ignoriert. Meine Zeit ist kostbar!
>
> LG
> RW

Und warum stellst Du hier Fragen, wenn Du selbst erkennen kannst, was an 
möglichen Antworten richtig ist, bevor Du sie liest? Nix anderes ist 
ignorieren.
Arrogant und zu b*** Tutorials zu durchforsten.
#6338093
Lesenswert?

Richard W. schrieb:
> GPIOB -> ODR = 0x1; // LED 1
> GPIOB -> ODR = 0x2; // LED 2

Wird nicht beim Setzen der LED 2 die LED 1 abgedreht?

GPIOB->ODR = 0x03; // LED 1 & LED 2

oder

GPIOB -> ODR |= 0x1; //LED 1
GPIOB -> ODR |= 0x2; // LED 2

gleiches gilt :

Richard W. schrieb:
> GPIOB -> ODR &=~ 0x1; // invertieren LED aus
> GPIOB -> ODR &=~ 0x2; // inverdieren LED aus

GPIOB->ODR = ~0x03; // LED 1 & LED 2

oder

GPIOB -> ODR &= ~0x1; //LED 1
GPIOB -> ODR &= ~0x2; // LED 2
Gast #6338596
Lesenswert?

Bommelmütze schrieb:
> Wer sich mit Mikrocontroller programmieren beschäftigt,
> braucht Zeit ohne Ende.

Wer sich wirklich beschäftigt , ja.

Aktuell stellt man sich eher faul und fragt jeden Kinderkram im Forum, 
da sind immer ein paar Dussel, die eine Lösung vorkauen.

Schon alleine dieser rotzfrech arrogante Satz
Richard W. schrieb:
> Bitte nur darauf antworten, wenn es für mich hilfreich ist,
> alles andere wird von mir ignoriert. Meine Zeit ist kostbar!

sollte ein Grund sein, den Kasper auflaufen zu lassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren