www.mikrocontroller.net

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


Autor: S. B. (sebezahn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pschober (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc Meise (bytewood) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marc Meise (bytewood) Benutzerseite
Datum:

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

Grüße

Autor: sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Sebezahn

Autor: Marc Meise (bytewood) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.