LED auf Halbmast

wer

Neues Mitglied
02. Juli 2012
485
0
0
Sprachen
  1. Assembler
Eine kleine Frage:

ich habe eine LED an PortB7 und GND. Die soll über den Controller (ATmega1284p) mit Strom versorgt werden. Bei der Programmierung hatte ich einen Zahlendreher 0x08 statt 0x80, also so:

Code:
	ldi	temp1,0x08  ; 0x80!
	out	DDRB, temp1
	out	PORTB, temp1

Der Pin ist jetzt im Tri-State, trotzdem leuchtet die LED. Die Spannung PortB7 -- GND beträgt immerhin 2,48V. Warum liegt dort diese Spannung an? Wo holt er die her?

Mit PORTA7 ist das nicht so.

Dino: In Deiner Minifaq in der ersten Abbildung leuchtet meines Erachtens die obere LED wenn PORTB0 0 ist.

Wolfgang
 
Genau um sowas zu vermeiden verwendet man auch vordefinierte Konstanten - hier also:
LDI temp1, (1<<PORTB7)

Noch besser wäre es, sich entsprechend der Verwendung (Funktion) eine Konstante zu wählen, also zB LED
.equ LED, PORTB7
und dann im Code:
LDI temp1, (1<<LED)

Vorteil ist, daß man lediglich einmal am Anfang die Equation anpassen muß, wenn man die LED an zB B6 anschließen will - ohne nun überall im Code suchen zu müssen.
Bei Deiner Wunderlichkeit hilft das jetzt allerdings auch nicht weiter...
Schaltplan?
Wie hast Du den 40poligen AVR denn verdrahtet?
Zu Dinos Mini-FAQ - richtig, in der Darstellung ist die LED zwischen Vcc und AVR - der AVR muß dann auf Gnd schalten (PORT=0, DDR=1) damit die LED leuchtet. Dino hat nirgends was widersprüchliches geschrieben.

In dem Absatz darüber steht lediglich
Wenn er [der Controllerpin] +5V liefert [PORT=1, DDR=1], dann fließt der Strom zwangsläufig aus dem Anschluß heraus (source) durch einen Verbraucher (LED, Widerstand, ...) nach GND.
Also: Wenn der Pin auf Ausgang, high eingestellt ist, liegt dort (fast) Vcc (bezüglich Gnd) an. Ist der Stromkreis über einen etwaigen Verbraucher (LED, Wiederstand,...) nach Gnd nun geschlossen, fließt Strom (Physik Klasse 5 oder so...)
Darunter dann dasselbe mit umgekehrten Potentialen, wobei auf Polarität der eventuellen LED zu achten ist...
 
Der Controller steckt in einer STK500. Die LED (mit eingebautem Widerstand) ist direkt mit PORTB7 und GND verbunden.
Zu Dinos Mini-FAQ - richtig, in der Darstellung ist die LED zwischen Vcc und AVR - der AVR muß dann auf Gnd schalten (PORT=0, DDR=1) damit die LED leuchtet. Dino hat nirgends was widersprüchliches geschrieben.
In der Abbildung, bei der oberen LED steht PORTB0=1. Ob sich dieser Text auf den Pfeil oder die LED bezieht ist nicht recht klar. Um das eindeutig zu machen könnte man die obere LED an GND und die untere an Vcc hängen.

Wolfgang
 
Dieser rote Text bezieht sich auf den roten Pfeil - also im AVR von Vcc auf das Bein, Strom fließt "aus dem AVR raus" Richtung Gnd (wenn der Kreis geschlossen ist...)
Entsprechend dazu der grüne Text (PortB0=0) am grünen Pfeil - Strom kann dann aus extern Vcc kommend "in das Bein reinsickern", da dieses dann intern auf Gnd geschaltet ist - auch hier wieder bei geschlossenem Kreis...
Anmerkung: diese Darstellung trifft zumindest auf den Tiny441/841 nicht zu (Pullup wird nicht mehr über PORT-Register gesteuert, sondern besitzt seperates PUE-Register. Ich spekuliere, daß uns dieses Design auch noch in anderen Controllern begegnen wird...
Zu Deinem Problem: in welchem Sockel steckt der AVR? dann schau ich mal in den Plan...
Die LED ist also direkt in der PORTB-Buchse (B7 --|>|-- Gnd)?
Was ist sonst noch so gejumpert?
 
Hallo Wolfgang,

an PB7 befindet sich bei dem Mikrocontroller SCK der SPI Schnittstelle. Das Signal wird auch für ISP verwendet. Vielleicht liefert hier der Programmer den Strom für die LED.

Eine kleine Frage:

ich habe eine LED an PortB7 und GND. Die soll über den Controller (ATmega1284p) mit Strom versorgt werden. Bei der Programmierung hatte ich einen Zahlendreher 0x08 statt 0x80, also so:

Code:
    ldi    temp1,0x08  ; 0x80!
    out    DDRB, temp1
    out    PORTB, temp1

Der Pin ist jetzt im Tri-State, trotzdem leuchtet die LED. Die Spannung PortB7 -- GND beträgt immerhin 2,48V. Warum liegt dort diese Spannung an? Wo holt er die her?

Mit PORTA7 ist das nicht so.
 
Hallo,

ups sind da schnell Antworten dazugekommen :p Heute morgen war es noch ne einsame Frage ;)

Ich hab das selbe Phänomen schonmal wegen nem Tipfehler gehabt. Da war über DDRx.y der Pin auf Eingang gestellt und über PORTx.y dann nicht der Ausgang auf High geschaltet sondern der PullUp-Widerstand aktiviert. Endergebnis war ne rumfunzelnde LED an dem Pin die eigentlich richtig leuchten sollte. Ich hab dann schon an einen defekten Ausgangstreiber gedacht bis ich dann endlich den Tipfehler im Programm entdeckt habe.

Bei dem Phänomen wird die LED am Ausgang über den internen PullUp und den Vorwiderstand der LED zum leuchten gebracht. Ich tippe mal das deine LED gegen GND geschaltet ist (hast du ja so ähnlich geschrieben). Da die meißte Spannung am internen 40k-PullUp abfällt mißt du am Atmel-Pin lediglich etwa die Durchlaßspannung der LED.

Folgende Spielerei: Wenn man ne ultrahelle LED verwendet, dann könnte man die direkt vom Pin nach GND schalten. Wenn man dann den Pin auf Eingang konfiguriert, kann man über An/Abschalten des internen PullUp die LED zu leuchten bringen bzw abschalten und spart sich den Vorwiderstand :cool: Problem dabei ... wenn man den Pin einmal auf Ausgang schaltet, dann kocht man sich den Ausgangstreiber weg und der Atmel ist mit Sicherheit hin! :p

EDIT: Ich les grade das DDRx.y auch auf 0 ist (PullUp aus) ... dann muß der Strom über irgendeinen anderen externen PullUp kommen. Wird aber wohl ein ähnliches Phänomen sein.

Gruß
Dino
 
Dieser rote Text bezieht sich auf den roten Pfeil - also im AVR von Vcc auf das Bein, Strom fließt "aus dem AVR raus" Richtung Gnd (wenn der Kreis geschlossen ist...)
Entsprechend dazu der grüne Text (PortB0=0) am grünen Pfeil - Strom kann dann aus extern Vcc kommend "in das Bein reinsickern", da dieses dann intern auf Gnd geschaltet ist - auch hier wieder bei geschlossenem Kreis...
Das ist ja klar! Das Problem(?) ist die Position der zwei LEDs. Das ist halt mißverständlich. Es würde hingegen passen, wenn die obere LED gegen GND und die untere gegen VCC geschaltet wäre. Hab ich mich jetzt klar ausgedrückt?:vollkommenauf:

Wolfgang
 
Hi Wolfgang,

Dino: In Deiner Minifaq in der ersten Abbildung leuchtet meines Erachtens die obere LED wenn PORTB0 0 ist.
stimmt.

Aus dem Grund steht an der oberen LED D1 auch "Low" dran. Rechts daneben steht dann in grün "0=GND" und der Pfeil auf GND ist auch grün und es steht "PORTB0=0" daneben. Paßt also alles.

Gruß
Dino
 
...wenn die obere LED gegen GND und die untere gegen VCC geschaltet wäre...
Also dann oben Gnd und unten Vcc...
konsequenterweise dann auch bei der Darstellung der internen Push-Pull-Stufe andersrum, also verknotungsfrei auch hier Vcc unten und Gnd oben?
Und somit auch den roten Pfeil mit dem roten Text unten (eben bei Vcc), und den grünen Pfeil (mit dem grünen Text) oben (eben bei Gnd)...
Also einfach alles kopfstehend gezeichnet? Ist doch dasselbe...:p
Hallo Wolfgang,

an PB7 befindet sich bei dem Mikrocontroller SCK der SPI Schnittstelle. Das Signal wird auch für ISP verwendet. Vielleicht liefert hier der Programmer den Strom für die LED.
Also SPROG3.

Welcher Programmer wird denn verwendet? Der interne des STK500? Ist dieser dann über das 6polige Kabel mit der ISP6PIN-Buchse verbunden?
In diesem Falle läge nach dem eigentlichen Programmieren durch die Schutz-Darlingtons für das Board an B7 (SCK) und B5(MOSI) Vcc über je einen 1kOhm an (kann durch den Boardinternen Controller auf Gnd gezwungen werden), B6 (MISO) ist über einen 47kOhm auf Vcc gezogen, und kann durch das Target (AVR) auf Gnd gezwungen werden.

Diese Schutzschaltung befindet sich Boardseitig des ISP6Pin-Headers, wenn Du diesen mit SPROG3 verbindest, wirkt sich das natürlich auch auf die LED aus. Auch, wenn kein Controller im Sockel ist...

Wenn Du einen anderen Programmer mit SPROG3 verbunden hast, hat der eventuell eine ähnliche Schutzschaltung drin...
 
Also dann oben Gnd und unten Vcc...
konsequenterweise dann auch bei der Darstellung der internen Push-Pull-Stufe andersrum, also verknotungsfrei auch hier Vcc unten und Gnd oben?
Und somit auch den roten Pfeil mit dem roten Text unten (eben bei Vcc), und den grünen Pfeil (mit dem grünen Text) oben (eben bei Gnd)...
Also einfach alles kopfstehend gezeichnet? Ist doch dasselbe...:p
Wenn der obere Pfeil gilt, leuchtet die untere LED, stimmts!
 
Ja.
Der "Rote" gilt, wenn der obere interne Schalter (also PORT=1) Vcc von oben auf das Bein legt, von wo aus der Strom dann über die (untere) LED nach unten Richtung Gnd abfließen kann.
Der "Grüne" gilt, wenn der untere (PORT=0) Gnd von unten auf das Bein schaltet, sodaß der Strom von Vcc, also oben, über die obere LED über das Bein intern nach Gnd, also nach unten, abfließen kann.

Diese interne Verschaltung gilt aber nur, wenn das Bein über das Datenrichtungsregister als Ausgang deklariert ist. bei einem Eingang ist die PUsh-Pull-Stufe deaktiviert, das Bein somit erstmal tristate.
Bei den meisten AVR (Ausnahme zB.: ATtiny441/841) wirken sich die beiden Register aber auch auf den internen Pullup aus -> PORT=1 und DDR=0 schalten den Pin über einen Pullup auf Vcc. Dann kann auch Strom von Vcc "aus dem Bein herausfließen" - eben über den Pullup begrenzt, bzw fällt dort eine Spannung ab. Der interne Pullup hat üblicherweise so um die 50k (genauer stehts im Datenblatt).

Aber zurück zur eigentlichen Frage: Tritt dieses Verhalten an B7 auf, wenn irgendein Programmer auf SPROG3 steckt? (insbesondere der STK500 interne via Verbindung mit ISP6PIN? <- da ist der Sachverhalt klar, sollte bei B5 auch so sein, bei B6 wird die LED sicher nicht mehr leuchten, da der maximale Strom irgendwo bei einem zehntel mA liegen sollte).
 
Ja.
Der "Rote" gilt, wenn der obere interne Schalter (also PORT=1) Vcc von oben auf das Bein legt, von wo aus der Strom dann über die (untere) LED nach unten Richtung Gnd abfließen kann.
Der "Grüne" gilt, wenn der untere (PORT=0) Gnd von unten auf das Bein schaltet, sodaß der Strom von Vcc, also oben, über die obere LED über das Bein intern nach Gnd, also nach unten, abfließen kann.
Na, da sind wir uns ja endlich einig. Und alles was ich vorgeschlagen habe, damit oben immer zu oben und unten zu unten paßt, war, die obere LED an GND und die untere an VCC zu hängen. Aber das war nur ein Vorschlag zum besseren Verständnis.;)
Aber zurück zur eigentlichen Frage: Tritt dieses Verhalten an B7 auf, wenn irgendein Programmer auf SPROG3 steckt? (insbesondere der STK500 interne via Verbindung mit ISP6PIN? <- da ist der Sachverhalt klar, sollte bei B5 auch so sein, bei B6 wird die LED sicher nicht mehr leuchten, da der maximale Strom irgendwo bei einem zehntel mA liegen sollte).
Der ISP-Stecker steckt. Den laße ich immer stecken.

Wolfgang
 
Na, da sind wir uns ja endlich einig. Und alles was ich vorgeschlagen habe, damit oben immer zu oben und unten zu unten paßt, war, die obere LED an GND und die untere an VCC zu hängen...
Das ist mir schon klar - aber ich finde es übersichtlicher, wenn die technische Stromrichtung (Vcc->Gnd) von oben nach unten dargestellt wird. Oder zumindest auf dem ganzen Bild einheitlich. Eben im inneren des AVR und im äußeren.
Aber das hat mit Deinem eigentlichen Problem nichts zu tun...
...Der ISP-Stecker steckt. Den laße ich immer stecken...
Damit wissen wir immer noch nicht, ob Du einen externen Programmer (mit mir unbekannter (Schutz-)Beschaltung) an SPROG3 hast, oder eben den internen. Zumindest für den internen steht die ausführliche Antwort in #10, bei einem anderen Programmer wird das sicher ähnlich sein.
Dann zieh doch einfach mal den Programmer ab, dann sollte(n) die LED(s) aus sein...
 
Damit wissen wir immer noch nicht, ob Du einen externen Programmer (mit mir unbekannter (Schutz-)Beschaltung) an SPROG3 hast, oder eben den internen. Zumindest für den internen steht die ausführliche Antwort in #10, bei einem anderen Programmer wird das sicher ähnlich sein.
Dann zieh doch einfach mal den Programmer ab, dann sollte(n) die LED(s) aus sein...
Kein externer Programmer!
Wenn ich das Kabel an ISP6PIN abziehe geht die LED tatsächlich aus.
Allerdings ...
Wenn ich es anschließend wieder stecke (mit oder ohne Ausschalten des STK500) geht weder die LED wieder an, noch kommt das AVR-Studio in den Programmiermodus (entspr. Fehlermeldung).
Erst nach ein paar mal ausschalten und wieder einschalten brennt wieder die LED und dann kann ich auch wieder programmieren.

Wolfgang
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)