- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Beginner Problem, LED steuern?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.04.2013
    Beiträge
    13

    Beginner Problem, LED steuern?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    Code:
    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
    Geändert von micron (20.09.2014 um 21:09 Uhr)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Code:
    	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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    @Hubert,

    Und wie hat er die LED nun angeschlossen?

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Wenn seine Beschreibung stimmt und er tatsächlich mit "Rot->ein"beginnt, dann nach GND.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    12.04.2013
    Beiträge
    13
    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:
    Klicke auf die Grafik für eine größere Ansicht

Name:	avr-p28-sch_2.jpg
Hits:	12
Größe:	61,2 KB
ID:	29086

    Gruß
    micron

    - - - Aktualisiert - - -

    Zitat Zitat von Hubert.G Beitrag anzeigen
    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

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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)
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    12.04.2013
    Beiträge
    13
    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:

    Code:
    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

    Besten Dank
    micron
    Geändert von micron (21.09.2014 um 23:10 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich denke mal du hast es richtig verstanden. Ein kleiner Schönheitsfehler ist aber noch drinnen.
    Code:
        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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Ähnliche Themen

  1. RNFBA Absolute Beginner
    Von mas im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 9
    Letzter Beitrag: 14.06.2011, 13:10
  2. Beginner, mehrer Fragen
    Von Thalhammer im Forum AVR Hardwarethemen
    Antworten: 34
    Letzter Beitrag: 03.12.2010, 21:29
  3. Beginner
    Von Thalhammer im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 21.05.2010, 19:20
  4. Beginner Code korrigieren
    Von onion im Forum Assembler-Programmierung
    Antworten: 23
    Letzter Beitrag: 21.08.2008, 23:01
  5. RGB LED Steuern
    Von luxor im Forum Elektronik
    Antworten: 21
    Letzter Beitrag: 08.12.2005, 09:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests