Forum: Mikrocontroller und Digitale Elektronik 8051 - Pins auf Low, damit LEDs zunächst aus?


von Nic (Gast)


Angehängte Dateien:

Lesenswert?

Mahlzeit,

ich bin absoluter Laie was Informatik betrifft und versuche
gerade für mein Projekt zwei RGB-Leds über eine
LED-Display-Taster-Kombination anzusteuern. Als µC verwende ich den
AT89S51, als Compiler Ride's Raisonance, um das Ganze in C zu schreiben.
Die LEDs sollen bei Drücken eines Tasters aufleuchten. Schalte ich das
Board ein, blinken die LEDs kurz auf und erlöschen sofort wieder. Ich
nehme mal an, das liegt an der invertierenden Logik des Controllers. Nun
zu meiner Frage: Gibt es irgendeine Möglichkeit, dieses Aufblinken nach
dem Einschaltvorgang zu verhindern? Wie setze ich die Pins nun auf Low? 
Wäre nett, wenn das mal jemand anhand des Quelltextes zeigen könnte.
Danke schon mal im Voraus!

Gruß Nic

von Karl H. (kbuchegg)


Lesenswert?

Nic wrote:
> Mahlzeit,
>
> ich bin absoluter Laie was Informatik betrifft

Das merkt man :-)

In C beginnt die Programmausführung immer in der Funktion main()
main() muss auch main() heissen und kann keinen anderen Namen
tragen.

Da du kein main() hast, macht dein Controller irgendwas.
Was weiss kein Mensch genau.

Obwohl mich das eigentlich wundert. Eigentlich hätte sich
dein Linker beschweren müssen, dass er keine main() Funktion
findet.

von Patrick (Gast)


Lesenswert?

Beitrag "Ungewolltes Aufleuchten der LEDs nach Einschaltvorgang"

Hast wohl nicht die gewünschte Antwort bekommen ;-)

von Nic (Gast)


Lesenswert?

Richtig, ich hab gedacht, ich probier's hier mal ohne dass es jemand 
merkt.
Sorry!

von R. M. (rmax)


Lesenswert?

@Nic:
Dazu wäre es hilfreich, erstmal zu wissen, wie Du die LEDs angeschlossen 
hast, also zwischen Portpin und Versorgungsspannung oder zwischen 
Portpin und Masse (natürlich jeweils mit einem passenden Vorwiderstand). 
Wenn Du dann noch die Codesequenz postest, mit der Du die LED-Pins 
initialisierst, kann Dir vielleicht geholfen werden.

@Karl heinz:
Wer sagt denn, daß led.c die einzige Quelldatei des Projektes ist?

von Karl H. (kbuchegg)


Lesenswert?

Was Peter im anderen Thread meint:

Du musst die LED umlöten.
Bisher hast du sie wahrscheinlich so:

       µC Pin
   -----o-----------+
                    |
                   ---
                   | |
                   ---
                    |
                   ---
                   \ /
                   ---
                    |
   -----------------+-------- GND

du musst sie aber so umlöten

         -----------+-------- Vcc (+5V)
                    |
                   ---
                   | |
                   ---
                    |
                   ---
                   \ /
                   ---
          µC Pin    |
        ---o--------+


        --------------------- GND

D.h. um die LED leuchten zu lassen, muss eine 0 an den
Port Pin geschrieben werden. Bei einer 1 ist die LED aus.
Das meint man mit low-active: Wenn der Ausgang low (also 0)
ist, dann ist Funktionalität (in deinem Fall LED ein) eingeschaltet.

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Max wrote:
> @Karl heinz:
> Wer sagt denn, daß led.c die einzige Quelldatei des Projektes ist?

Prinzipiell niemand.
Aber ich glaube nicht, dass ein Neuling, der mit LEDs Schwierigkeiten
hat, mehr als ein *.c File benutzt. :-)
Und ich glaube auch nicht, dass er mehr als 1 Funktion benutzt.
(nur um dem zuvor zu kommen)


von R. M. (rmax)


Lesenswert?

Karl heinz Buchegger wrote:
> Aber ich glaube nicht, dass ein Neuling, der mit LEDs Schwierigkeiten
> hat, mehr als ein *.c File benutzt. :-)
> Und ich glaube auch nicht, dass er mehr als 1 Funktion benutzt.
> (nur um dem zuvor zu kommen)

Nun, irgendwo muß er die Portpins als Ausgänge initialisieren (IIRC sind 
sie im Reset-Zustand als Eingänge geschaltet). Täte er das nicht, würde 
er hier nicht fragen, warum sie beim einschalten kurz blinken, sondern 
warum er sie mit seiner Taste nicht ein- und ausschalten kann. Also muß 
irgendwo eine main() vorhanden sein ;)

Aber lassen wir Nic doch einfach selber antworten...

von Nic (Gast)


Lesenswert?

Hallo Karl Heinz,

das hab ich schon verstanden. Hab die LEDs auch so wie in Deinem zweiten 
Beispiel verlötet - nur eben die jeweiligen Kathoden über eine 
Transistorstufe angesteuert, da es sich schließlich um RGB-LEDs mit 
gemeinsamer Anode handelt.  Verstehe jetzt nur nicht, wie ich die 
LED-Portleitungen als Ausgang (also logisch NULL) hinkriege. Gibt es da 
irgendeinen Clear-Bit-Befehl, wie in Assembler? Wundert mich doch jetz 
etwas, dass das Programm einwandfrei läuft, bis auf das kurze 
Aufleuchten am Anfang. Trotzdem mal Danke!

von Joe (Gast)


Lesenswert?

z.B. LED = 0; dann ist sie ein
LED = 1; LED = aus

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Max wrote:

> Aber lassen wir Nic doch einfach selber antworten...

Im Zweifelsfall hast du natürlich recht.

Also Nic.
Zeig doch mal dein ganzes Programm.

von Nic (Gast)


Lesenswert?

Der Anhang im ersten Beitrag ist mein gesamtes Programm bis jetzt. Weiß 
leider immer noch nicht wirklich, wie ich die Portleitungen als Aus- 
bzw. Eingang definiere. Ich glaub, da liegt auch das eigentliche Problem 
-  versteh nur immer noch nicht, wieso der Controller trotzdem das 
gemacht hat, was ich wollte. Also sehe ich das richtig? Wenn ich eine 
Portleitung mit "sbit" deklariere, steht sie mir als Eingang zur 
Verfügung (so steht's ja schließlich im Datenblatt)? Dann wären ja auch 
meine Taster definiert, wie aber deklariere ich die Ausgänge zu den Leds 
(r_led, g_led, b_led), damit ich diese dann auch ansteuern kann???

von Patrick (Gast)


Lesenswert?

Hast Du das Tutorial auf dieser Seite schon mal angeschaut?

von Joe (Gast)


Lesenswert?

>> sbit r_led = P1^0;

r_led = 1; Pin hat highpegel
r_led = 0; Pin hat lowpegel

alles klar ?

von ARM-Fan (Gast)


Lesenswert?

Wenn du den Transistor noch dazwischen hängen hast, ist die Logik
(low aktiv zu sein) ja wieder in die Dutten.

Die µC Pins sind nach dem Reset High --> Transistor steuert deine
RGB-Kathoden nach Masse durch --> LEDs an.

Nun geht dein Programm los, stellt fest dass dein Taster losgelassen
ist --> LEDs wieder aus.

Alles klar?

Der 8051er benötigt keine Definitionen für Ein- oder Ausgang.
die Pins sind Open-Drain und ziehen nur nach Masse vernünftig
runter. Nach Plus schalten sie über Pullups. Können also nur
"sinken" und nicht "sourcen".

von Nic (Gast)


Lesenswert?

Danke an alle, das wollt ich wissen. Klasse Forum, weiter so!

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.