Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller programmieren


von Richard W. (richard00)


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

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

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

was macht das denn mit der vorher gesetzten 0x1 ?

von jo mei (Gast)


Lesenswert?

Richard W. schrieb:
> Ich hab an meinem µC mehrere LED's.

Es ist unnötig den Mikrocontroller anzugeben denn es gibt
ja nur einen Einheits-Controller auf der ganzen Welt.

Richard W. schrieb:
> mehrere LED's.
-------------^---

Dazu gibt es eine hilf- und lehrreiche Seite.
http://www.deppenapostroph.info

von Lars (Gast)


Lesenswert?

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

von Richard W. (richard00)


Lesenswert?

Johannes S. schrieb:
> Richard W. schrieb:
>> GPIOB -> ODR = 0x2; // LED 2
>
> was macht das denn mit der vorher gesetzten 0x1 ?

die leuchtet nicht. Ist das denn soweit richtig programmiert? oder mach 
ich irgendwo einen Fehler?

von Oliver S. (oliverso)


Lesenswert?

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

Bitte nur Fragen stellen, die mit allen Informationen kommen, die man 
zur Beantwortung braucht. Unsere Zeit ist noch viel kostbarer.

Oliver

von Gustl B. (gustl_b)


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.

von pegel (Gast)


Lesenswert?

Mach dir den Unterschied zwischen Bit- und Byteweise Registerzugriff 
klar.

von Richard W. (richard00)


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.

von Gustl B. (gustl_b)


Lesenswert?

Edit:
1
while(1){
2
GPIOB -> ODR = 0x3; // LED 1 und LED2
3
delay(100);
4
GPIOB -> ODR &=~ 0x3; // invertieren LED aus
5
delay(100);
6
}

Sollte beide LEDs leuchten lassen.

: Bearbeitet durch User
von pegel (Gast)


Lesenswert?

Gustl B. schrieb:
> GPIOB -> ODR = 0x3;

Was? Selber rechnen?
Dann schon lieber:

GPIOB -> ODR = 0x1 | 0x2;

von Richard W. (richard00)


Lesenswert?

Gustl B. schrieb:
> Edit:
>
>
1
> while(1){
2
> GPIOB -> ODR = 0x3; // LED 1 und LED2
3
> delay(100);
4
> GPIOB -> ODR &=~ 0x3; // invertieren LED aus
5
> delay(100);
6
> }
>
> Sollte beide LEDs leuchten lassen.

stimmt, das klappt auch. danke...

von Awsome (Gast)


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.

von Publikum (Gast)


Lesenswert?

jo mei schrieb:
> Dazu gibt es eine hilf- und lehrreiche Seite.
> http://www.deppenapostroph.info

Danke dafür, hahahahahaa

von Gerald K. (geku)


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

: Bearbeitet durch User
von Sandro g. Z (Gast)


Lesenswert?

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

Welchen Mikrocontroller?
Gibt's zwei, drei am Markt!

Bist du Callboy, weil deine Zeit ach so kostbar ist?

von Bommelmütze (Gast)


Lesenswert?

> Meine Zeit ist kostbar!
Wer sich mit Mikrocontroller programmieren beschäftigt, braucht Zeit 
ohne Ende.

von Manfred (Gast)


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.

von jo mei (Gast)


Lesenswert?

Manfred schrieb:
> da sind immer ein paar Dussel, die eine Lösung vorkauen.

Volle Zustimmung.

Manfred schrieb:
> sollte ein Grund sein, den Kasper auflaufen zu lassen.

Volle Zustimmung.

von Johannes S. (Gast)


Lesenswert?

Is Facebook schon zu?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.