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.
Beitrag "Ungewolltes Aufleuchten der LEDs nach Einschaltvorgang" Hast wohl nicht die gewünschte Antwort bekommen ;-)
Richtig, ich hab gedacht, ich probier's hier mal ohne dass es jemand merkt. Sorry!
@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???
Hast Du das Tutorial auf dieser Seite schon mal angeschaut?
>> sbit r_led = P1^0;
r_led = 1; Pin hat highpegel
r_led = 0; Pin hat lowpegel
alles klar ?
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.