Forum: Mikrocontroller und Digitale Elektronik LEDs zwischen zwei Ports - Programmfehler?


von S. B. (sebezahn)


Lesenswert?

Hi alle,

ich habe zwischen PortD und PortC eines ATMEGA64 acht LEDs verdrahtet.
Die Teile sind LowCurrent LEDs, als Widerstände habe ich 1650 Ohm
genommen. Das Programm, mit dem ich die Polarität immer umschalte, ist
in Bascom geschrieben:

$regfile = "m64def.dat"
$crystal = 1000000

Do
  Ddrd = &B11111111
  Portd = &B11111111
  Ddrc = &B00000000
  Portc = &B00000000

  Waitms 500

  Ddrd = &B00000000
  Portd = &B00000000
  Ddrc = &B11111111
  Portc = &B11111111

  Waitms 500
Loop

Eigentlich sollten die Dinger doch blinken. Aber irgendwie tut sich gar
nichts. Auch wenn ich zwischen den Pins Spannung messen will, bleibt die
bei Null. Die Fuses JTAG und M103 sind beide deaktiviert, das Problem
sollte es also nicht sein.

Programmiert habe ich mit TwinAVR, das scheint auch einwandfrei zu
laufen.

Habe ich einen Denkfehler? Vielen Dank!

Gruß
Sebezahn

von Detlev (Gast)


Lesenswert?

Ich kenne TwinAVR zwar nicht, nehme aber an, dass Ddrc und Ddrd die
Datadirection Ports sind.

Sowohl bei Port C als auch PortD müssen diese Werte dann immer auf
&B11111111 sein, damit beide Ausgänge sind.

BTW: Ich verstehe nicht, warum du die Polarität umkehrst? handelt es
sich um zweifarbige LEDs? Zum Blinken würde es doch reichen, bei der
Anode zwischen VCC und GND zu wechseln.

von Johnny (Gast)


Lesenswert?

Die Vowiderstände der LED's scheinen ein wenig zu gross dimensioniert
zu sein.

R = (U - ULED) / I

Also mal angenommen

R = (3.3V - 1.6V) / 5mA = 340 Ohm

Vielleicht liegt der Fehler also nur in der Hardware.


Gruss, Johnny

von pschober (Gast)


Lesenswert?

Ich bin zwar kein Bascom Spezialist, aber soweit ich sehe schaltest du
nicht nur den Zustand der Ports um sondern auch jedesmal die Richtung
(DDRC,DDRD). Wenn die LED's zwischen den Ports hängen, ist immer
jeweils eine Seite "in der Luft".

So müsste es funktionieren :

$regfile = "m64def.dat"
$crystal = 1000000

 Ddrd = &B11111111
 Ddrc = &B11111111

Do

  Portd = &B11111111
  Portc = &B00000000

  Waitms 500

  Portd = &B00000000
  Portc = &B11111111

  Waitms 500
Loop

von Marc M. (bytewood) Benutzerseite


Lesenswert?

Noch einfacher ist:

$regfile = "m64def.dat"
$crystal = 1000000

 Ddrd = &B11111111
 Ddrc = &B11111111
 Portd = &B11111111
Do
  Portc = &B00000000 'Einschalten
  Waitms 500
  Portc = &B11111111 'Ausschalten
  Waitms 500
Loop

Weniger Tipparbeit wenn Du &HFF bzw. &H00 verwendest.

von Marc M. (bytewood) Benutzerseite


Lesenswert?

Ach ja, und dimensioniere die Widerstände so, wie Johnny schon postete,
dann klappt auch mit'm Blinken.

Grüße

von sebezahn (Gast)


Lesenswert?

Hi alle,

danke erstmal für die vielen Anregungen. Zu den Vorwiderständen: Ich
dachte, aus dem Port eines AVR kommen 5 Volt, die LEDs brauchen nur 2mA
und ca. 1,7 Volt, das habe ich im Datenblatt nachgeschaut. Wären also
(5V-1,7V) / 0.002A = 1650 Ohm. Oder denke ich da falsch? Ich werde mal
5Volt direkt anschließen, habe ich irgendwie noch nicht dran gedacht.
Aber zwischen den Ports kann ich auch überhaupt keine Spannung messen.

Dass ich die Ports "umdrehe" und die LEDs von beiden Seiten mit Strom
versorge, ist tatsächlich so gedacht. Deshalb bin ich ja auch nicht mit
einer Seite gegen Masse gegangen. Leuchten sollen sie allerdings nur
"in einer Richtung", klar. Umgekehrt werden die Dinger mit ein wenig
mehr Programmierarbeit zu Fotosensoren. Wer mehr wissen möchte, ist
herzlich zu weiteren Diskussionen eingeladen.  ;-)

Nochmal zum Grundverständnis für mich: Ich habe acht Dioden ZWISCHEN
den Ports hängen, also PC1 auf PD1, PC2 auf PD2 usw.

Ddrd = &B11111111
Portd = &B11111111
Ddrc = &B00000000
Portc = &B00000000

Ich schalte mit DDRD=&B111.. alle Pins auf Output... und mit Portd =
&B11... auf high. Mit anderen (laienhaften) Worten: Aus den Pins kommt
Strom. DCRC = &B00.. legt die Gegenstücke auf Input, also "nehmen"
die Strom entgegen, Portc = &B000... deaktiviert den Pullup-Widerstand,
richtig?

In der nächsten Phase ist es genau umgekehrt. Und bei einer Phase
müssten Sie leuchten. Tun sie aber nicht. Oder habe ich da einen
fundamentalen Denkfehler?

Ich werde morgen im Labor als erstes die Dioden gegen 5 Volt legen,
danach mal gegen 3,3 Volt und mal schauen, ob die überhaupt was
ausgeben. Auf die einfachsten Tests kommt man nicht. Und danach nehme
ich mal das Programm von pschober...

Vielen Dank Euch allen nochmal, für weitere Anregungen bin ich
jederzeit dankbar!

Gruß
Sebezahn

von Karl H. (kbuchegg)


Lesenswert?

> Mit anderen (laienhaften) Worten: Aus den Pins kommt
> Strom. DCRC = &B00.. legt die Gegenstücke auf Input, also
> "nehmen" die Strom entgegen,

Und hier ist dein Denkfehler.
Der Port muss immer auf 'Output' geschaltet sein.
Wenn der Ausgabepin dann auf 1 geschaltet wird, fungiert er
als Stromlieferant. Liegt der Ausgabepin auf 0 fungiert er
als Stromsenke.

von sebezahn (Gast)


Lesenswert?

Hi,

ja, das erklärt einiges. Ich hoffe auf einen erfolgreicheren morgigen
Tag... Vielen Dank!

Sebezahn

von Marc M. (bytewood) Benutzerseite


Lesenswert?

@sebezahn

Du musst Dir darüber klar werden, was DDRx (Data Dirction Register) ist
und die Befehle PORT und PIN bedeuten. Ferner solltest Du Dir ansehen,
wie der Pullup funktioniert.
Ein kuzer blick in die Kapitel des GCC-Tutorials kann Dir sehr helfen,
auch wenn Du mit BASCOM programmierst.

von Karl heinz B. (kbucheg)


Lesenswert?

@Marc

Ich denke sein Fehler war eine etwas naive Denkweise:
Der Strom kommt aus dem einen Port raus, rinnt durch die
LED und rinnt in einen anderen Port hinein.
Raus - rein.
Also muss der eine Port als Ausgang geschaltet werden und
der andere als Eingang.

Auch bei einem auf Ausgang geschalteten Port kann der
Strom in diesen Port hinein-'fliessen'. Nämlich dann wenn
das Potential (sprich die Spannung) ausserhalb des Ports
höher ist als innerhalb des Ports. Bei einem Port bezeichnet
die Datenrichtung (Ausgang/Eingang) eigentlich nur wer den
Pegel (sprich die Spannung) an diesem µC-Pin vorgibt:
Der µC oder die externe Schaltung.
(vereinfacht ausgedrückt)

von sebezahn (Gast)


Lesenswert?

Hi,

klar, eigentlich logisch, "naiv" ist nett g. Wenn ich das jetzt
richtig verstanden habe, heißt INPUT, dass ich quasi messen kann, ob
von extern eine Spannung anliegt. OUTPUT heißt hingegen, dass der uC
Lieferant ist, je nach Pegel von Spannung oder Masse. Entschuldigt
bitte die sehr unphysikalische Ausdrucksweise, aber es geht jetzt nur
ums Grundverständis.

Ich werde gleich testen, dann schreibe ich heute abend auf jeden Fall,
wie es und warum es hoffentlich geklappt hat.

Danke nochmal, der Gedankenwirrwarr ist erstmal beseitigt!

Gruß
Sebezahn

von Läubi (Gast)


Lesenswert?

Richtig.
Input = der uC can feststellen was am pin liegt (GND oder VCC)
Output = der uC legt fest welcher Pegel anliegt (GND oder VCC)
Für ne LED reicht es übrigesn diese z.B. per Vorwiderstand an VCC zu
legen, dann ist Pin = GND LED an, Pin = VCC Led aus :)

von Thomas O. (Gast)


Lesenswert?

Ja jetzt hast du es. Und ein Eingang hat immer einen sehr hochen
Eingangswiderstand deshalb kann da nicht viel Strom fließen und deshalb
leuchten deine LEDs nicht.

von Johnny (Gast)


Lesenswert?

Ah ja, mit 5V und 2mA für die LED's ist die Dimensionierung völlig ok.
Ich lebe wohl schon zu fest in der 3.3V Welt :-)

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.