PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beginner Problem, LED steuern?



micron
20.09.2014, 19:54
Hallo Forum,
ich beschreibe erst mein Vorhaben was ich ereichen wollte und dann zum Problem ok? :)

Ich hab das Einsteiger Board von Olimex mit ATmega8 Controller, auf der Platine ist eine LED die ich mit dem "blink" Programm zum blinken bringen kann.
Das geht, jetzt zum Problem:
Ich hab auf das Board noch 2 weitere LEDs gelötet und wollte die der reihe nach ein/ausschalten:
Rot->ein
aus
wait(1000)
Gelb->ein
aus
wait(1000)
Grün->ein
aus
wait(1000)

das ganze dann in Schleife das mit 1000ms verzögerung.

Wenn ich nur 2 (egal welche LEDs) "einschalte" funktioniert das wie ich mir das vorgestellt habe, aber sobald alle 3 angesprochen werden stimmt schon nicht.
Das Problem ist das diese 3 LEDs zu schnell blinken, es ist eher ein "blinzeln" als blinken, als ob keine 1000ms Pause dazwischen wäre.
Die grüne LED ist an PC1 und die gelbe ist am PC2 angschlossen, die Rote LED ist an PC5.
Die gelbe LED hat einen Vorwiderstand von 150 Ohm, die Grüne auch, obwohl es laut berechnung 190 sein sollten (ist das ein grober Fehler?? falls ja, wieso funktioniert die grüne LED im 2er kombination, also mit nur 2 LEDs gehts)

So,hier mein Versuch mit dem Sourcecode:



int main(void)
{

DDRC |= (1<<PC5);
DDRC |= (1<<PC2);
//DDRC |= (1<<PC1);

while(1)
{
//TODO:: Please write your application code
PORTC = 0b0100000; // Rote LED
_delay_ms(1000); //
PORTC = 0b0000000;
PORTC = 0b0000100; // Gelbe LED
_delay_ms(1000); //
PORTC = 0b0000000;
/* wenn der Teil aktiv ist dann blinzeln die LEDs nur, das blinken ist so schnell das man es kaum als blinken definieren kann, eher blinzeln
PORTC = 0b0000010; // Grüne LED
_delay_ms(1000); //
PORTC = 0b0000000;
*/
}
}



Mir ist klar das der Fehler bei mir liegt nur ich weiss nicht wo ich das vermasselt habe. :(

Danke für jede Hilfe.
micron

schorsch_76
20.09.2014, 20:15
PORTC = 0b0100000; // Rote LED
_delay_ms(1000); //
PORTC = 0b0000000;
PORTC = 0b0000100; // Gelbe LED


Das Problem ist einfach .... du überschreibst den Wert und machst keine Verknüpfung mit |= bzw &=

PORTC=xxx. Setzt alle werte in diesem Register

PORTC |= (1<<5); // setzt das 5te Bit und lässt alle anderen so wie sie sind
PORTC &= ~(1<<5); // löscht das Bit 5 und lässt alle anderen so wie sie sind

Gruß
Georg

Peter(TOO)
20.09.2014, 20:39
Hallo micron,

WIE sind die LEDs angeschlossen?

Normal ist, dass die LEDs zwischen Vcc und Port angeschlossen werden, da die Ports mehr Strom gegen GND ableiten können als gegen Vcc.

Dann ist es aber so, dass eine "0" am Port die LED EIN und eine "1" AUS schaltet.

MfG Peter(TOO)

Hubert.G
21.09.2014, 09:11
Normal ist, dass die LEDs zwischen Vcc und Port angeschlossen werden, da die Ports mehr Strom gegen GND ableiten können als gegen Vcc.
MfG Peter(TOO)
Die neueren AVR (ATmega, ATTiny) können gleich viel Strom sourcen und sinken. Die Meinung LEDs und Sonstiges nach VCC schalten zu müssen hat sich aus der µC-Generation herübergerettet die nur Open-Collektor (OC) Ausgänge hatten.

Peter(TOO)
21.09.2014, 09:19
@Hubert,

Und wie hat er die LED nun angeschlossen?

MfG Peter(TOO)

Hubert.G
21.09.2014, 09:24
Wenn seine Beschreibung stimmt und er tatsächlich mit "Rot->ein"beginnt, dann nach GND.

micron
21.09.2014, 11:09
Hallo,
vielen Dank an alle die sich die Zeit genommen haben mir zu antworten,
hier die Grafik von der Schaltung:
PC5 ist das original, PC1 und PC2 sind von mir ergenzt:
29086

Gruß
micron

- - - Aktualisiert - - -


Wenn seine Beschreibung stimmt und er tatsächlich mit "Rot->ein"beginnt, dann nach GND.

Hallo Hubert,
Rot ist die LED die bereits auf dem Board drauf war, da hab ich nichts geändert.
Hab dann versucht nach dem selben "Muster" 2 weitere LEDs zu löten, ob das richtig ist was ich gemacht hab ist die nächste Frage.



Gruß
mircron

Hubert.G
21.09.2014, 11:26
Die Led sind schon richtig so, nur die Ansteuerung ist verkehrt.
Du beginnst mit

PORTC = 0b0100000; // Rote LED
Damit setzt du PC5 auf 1 (5V) die Led ist aber auch gegen 5V geschaltet und leuchtet daher nicht.
Infolge läuft deine Ansteuerung verkehrt.
Übersichtlicher ist auch die Schreibweise wie sie "schorsch_76" schon gezeigt hat:

PORTC |= (1<<5); // setzt das 5te Bit und lässt alle anderen so wie sie sind
PORTC &= ~(1<<5); // löscht das Bit 5 und lässt alle anderen so wie sie sind (Hier leuchtet die Led)

micron
21.09.2014, 21:55
Hallo,
so, hab jetzt den code überarbeitet von mikrocontroller.net nochmal das tutorial angeschaut, das funktioniert jetzt so wie gedacht.
Das Problem war meine falsche ansteuerung wie Hubert es gesagt, hab das falsch verstanden -.-.

Hier der code mit Kommentar, falls der falsch ist bitte nimmt euch etwas Zeit nochmal und sagt was ich falsch beschrieben habe, so hab ich das jedenfalls verstanden:



int main()
{

//DDRC |= (1<<PC5);
//DDRC |= (1<<PC2);
//DDRC |= (1<<PC1);
//
DDRC |= (1<<PC5)|(1<<PC2)|(1<<PC1); // Pins 5, 2 und 1 auf Ausgang setzen, jetzt leuchten alle LEDs

while(1)
{
//TODO:: Please write your application code
// Rote LED brennt
PORTC |= (1 << PC1); // Grüne und
PORTC |= (1 << PC2);// gelbe deaktivieren
_delay_ms(1000); // 1sec warten
PORTC |= (1 << PC5); // Bit PC5 setzen->rote LED aus
PORTC &= ~(1 << PC2); // Bit 2 auf Port 2 löschen die gelbe LED brennt
_delay_ms(1000);
PORTC |= (1 << PC2); // das selbe wieder mit Port PC2, Bit setzen gelbe LED ist aus
PORTC &= ~(1 << PC1); // Bit löschen grüne LED brennt
_delay_ms(1000);
PORTC &= ~(1 << PC5); // rot wieder aktivieren
}
return 0;
}



Ich hoffe ich hab das jetzt richtig verstanden, wenn nicht muss die Docu noch mal her :D

Besten Dank
micron

Hubert.G
22.09.2014, 09:12
Ich denke mal du hast es richtig verstanden. Ein kleiner Schönheitsfehler ist aber noch drinnen.


while(1) { //TODO:: Please write your application code // Rote LED brennt PORTC |= (1 << PC1); // Grüne und "Diese beiden Zeilen gehören vor das PORTC |= (1 << PC2);// gelbe deaktivieren "while(1)
_delay_ms(1000); // 1sec warten






PC1 und PC2 musst du nur einmal aktivieren, gehört daher vor das while(1)

Da ist wohl irgendwie die Formatierung davongelaufen.