Forum: Mikrocontroller und Digitale Elektronik Frage zum C-Code (Beispiel)


von wulga (Gast)


Lesenswert?

Hi, schaut euch mal folgenden Code an:

#include <avr/io.h>

int main(void)
{
  DDRB = 0b00000001;

  PORTB = 0b00000001;

  return 1;
}

Ich habe an PB0 eine LED mit Vorwiderstand angeschlossen.

Wenn ich Minus der LED an PB0 und Plus der LED an +5V anschließe 
passiert gar nichts obwohl das auch so im Assemblertutorial 
eingezeichnet ist; drehe ich die LED d.h. Plus der LED kommt an PB0 und 
Minus der LED an GND leuchtet sie. Habe ich da was falsch verstanden? 
Geht das nicht auch andersrum?

von Peter (Gast)


Lesenswert?

Also ich finde es OK wenn die das minus der LED an den GND angeschlosse 
ist. Wo ist es denn anders dargestellt?

von wulga (Gast)


Lesenswert?

Schau mal hier:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

und scheinbar soll das auch gehen.

von Peter (Gast)


Lesenswert?

dann teste doch mal mit

>  PORTB = 0b00000000;

von Mike R. (thesealion)


Lesenswert?

Da wird aber auch ein anderer Wert in PortB geschrieben
1
         ldi r16, 0b11111100 ; 0b11111100 in r16 laden
2
         out PORTB, r16      ; r16 ins IO-Register PORTB ausgeben

Da wird der Port auf Low gesetzt, also muß die LED nach VCC, du setzt 
den Port auf High -> anderer LED Pin auf GND damit die LED leuchtet.

von wulga (Gast)


Lesenswert?

Werde ich ausprobieren, danke. Aber wenn du DDRB = 0b00000001 setzt ist 
er doch auf Ausgang gesetz oder? Wie kann ich dann den PORTB = 
0b00000000 (LOW also Minus?) setzen, widerspricht sich das nicht 
irgendwie?

von wulga (Gast)


Lesenswert?

bitte meinen vorigen Post nicht weiter beachten er ist ungültig.

von Peter (Gast)


Lesenswert?

wulga schrieb:
> widerspricht sich das nicht irgendwie?
nein weil ein ausgang auch 2 zustände anehmen kann, einmal liefert er 
strom und einmal kann er welchen aufnehmen.

Schau dir doch mal das BLockschaltbild von den IO-Anschlüssen das Atmels 
an.

von wulga (Gast)


Lesenswert?

@Mike S.
danke ich habs jetzt glaube ich verstanden. Muss das nur selber nochmal 
testen, damit es sitzt.

von Mike R. (thesealion)


Lesenswert?

Das DDRB setzt die Richtung (Eingang oder Ausgang) während du mit PORTB 
die einzelnen Pins HIGH oder LOW schalten kannst.

Ist bei deinem Link unter Pullup-Widerstand eigentlich sehr schön 
erklärt.

von Oliver J. (skriptkiddy)


Lesenswert?

>return 1;
Wohin soll denn das Programm zurückkehren?
Mach mal nen while(1); draus.

von Seltsam (Gast)


Lesenswert?

> Ich habe an PB0 eine LED mit Vorwiderstand angeschlossen.
> Minus der LED an PB0 und Plus der LED an +5V

Das ist eine active low Schaltung:
Die LED leuchtet, wenn PB0 einen LOW Pegel hat.

> DDRB = 0b00000001;
> PORTB = 0b00000001;

Das erzeugt einen HIGH Pegel an PB0.

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.