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
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.
@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?
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.
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)
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...
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!
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.
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???
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".