-         

Ergebnis 1 bis 8 von 8

Thema: LED's Dimmen mit ATmega88 funktioniert... aber nicht immer.

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80

    LED's Dimmen mit ATmega88 funktioniert... aber nicht immer.

    Anzeige

    Hi Leute

    Ich hab mal wieder ne Frage

    Diesmal gehts um das dimmen von LED's, ich hab hier mal einen Code aus dem Netzt stibitzt.

    Dieser mit 2 LED's funktioniert tip top:
    Code:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    
    void Delay(uint8_t ms)
    {
      while(ms > 0) {
        _delay_us(100);
        --ms;
      }
    }
    
    void Time1(uint8_t OnTime)
    {
      if(OnTime > 0) {
        // Led ein
        PORTC = 0x00;
        // OnTime abwarten
        Delay(OnTime);
      }
    
      if(OnTime < 120) {
        // Led aus
        PORTC = 0x01;
        // Aus-Zeit abwarten
        Delay(120 - OnTime);
      }
    }
    
    void Time2(uint8_t OnTime2)
    {
      if(OnTime2 > 0) {
        // Led ein
        PORTC = 0x00;
        // OnTime abwarten
        Delay(OnTime2);
      }
    
      if(OnTime2 < 120) {
        // Led aus
        PORTC = 0x02;
        // Aus-Zeit abwarten
        Delay(120 - OnTime2);
      }
    }
    
    int main()
    {
      
      uint8_t Level;
      uint8_t Level2;
    
      DDRC = 0xFF;   // alles auf Ausgang
    
      Level = 0;
      Level2 = 0;
     
    while(1){
    
    //LED 1
    while(Level >0){  
      Time1(Level);  // Obere Grenze erreicht ?
        Level -=1;}         // Ja: Auf dunkler werden umschalten
    
    while(Level <=120){
    
        Time1(Level);
        Level += 1;}  		// LED 1 soll heller werden
    
    //LED 2
    while(Level2 > 0){
      Time2(Level2);	// Obere Grenze erreicht ?
        Level2 -=1;}		// Ja: Auf dunkler werden umschalten
        
    
    while(Level2 <= 120){
      Time2(Level2);
        Level2 += 1;} 		// LED 2 soll heller werden
    
     }   
    }
    Dieser hier mit 4 LED's funktoiniert auch tip top:
    Code:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #define delay 80
    #define delay2 1000
    
    void Delay( uint8_t ms ){
      while( ms > 0 ) {
        _delay_us( delay );
        --ms; }
    }
    
    // LED 1
    void Time1( uint8_t OnTime ){
      if( OnTime > 0 ) {
        PORTC = 0x00;
        Delay( OnTime );
     }
      if( OnTime < 120 ) {
        PORTC = 0x01;
        Delay( 120 - OnTime );
      }
    }
    
    // LED 2
    void Time2( uint8_t OnTime2 ){
      if( OnTime2 > 0 ) {
        PORTC = 0x00;
        Delay( OnTime2 );
     }
      if( OnTime2 < 120 ) {
        PORTC = 0x02;
        Delay( 120 - OnTime2 );
      }
    }
    
    //LED 3
    void Time3 ( uint8_t OnTime3 ){
      if( OnTime3 > 0 ) {
        PORTC = 0x00;
        Delay( OnTime3 );
      }
      if( OnTime3 < 120 ) {
        PORTC = 0x04;
        Delay( 120 - OnTime3 );
      }
    }
    
    //LED 4
    void Time4( uint8_t OnTime4 ){
      if( OnTime4 > 0 ) {
        PORTC = 0x00;
        Delay( OnTime4 );
      }
      if( OnTime4 < 120 ) {
        PORTC = 0x08;
        Delay( 120 - OnTime4 );
      }
    }
    int main()
    {
      
      uint8_t Level;
      uint8_t Level2;
      uint8_t Level3;
      uint8_t Level4;
    
      DDRC = 0xFF;   // alles auf Ausgang
    
      Level  = 0;
      Level2 = 0;
      Level3 = 0;
      Level4 = 0;
     
    while(1){
    
    
    //LED 1
    while(Level >0 ){  
     		Time1( Level );  // Obere Grenze erreicht ?
        	Level -=1;}         // Ja: Auf dunkler werden umschalten
    
    	//	_delay_ms(delay2);
    
    while(Level <=120 ){
        	Time1( Level );
        	Level += 1;}  		// LED 1 soll heller werden
    
    
    //LED 2
    while(Level2 > 0){
      		Time2( Level2 );  	 // Obere Grenze erreicht ?
       		Level2 -=1;}		// Ja: Auf dunkler werden umschalten
    
    	//	_delay_ms(delay2);
    
    while(Level2 <= 120){
      		Time2( Level2 );
       		Level2 += 1;} 		// LED 2 soll heller werden
    
    
    //LED 3
    while(Level3 >0 ){  
     		Time3( Level3 );  // Obere Grenze erreicht ?
       		Level3 -=1;}         // Ja: Auf dunkler werden umschalten
    
    	//	_delay_ms(delay2);
    
    while(Level3 <=120 ){
        	Time3( Level3 );
        	Level3 += 1;}  		// LED 3 soll heller werden
    
    
    //LED 4
    while(Level4 > 0){
      		Time4( Level4 );   	// Obere Grenze erreicht ?
        	Level4 -=1;}		// Ja: Auf dunkler werden umschalten
    
    	//	_delay_ms(delay2);
    
    while(Level4 <= 120){
      		Time4( Level4 );
        	Level4 += 1;} 		// LED 4 soll heller werden
    
     }   
    }
    Wenn ich allerdings ein neues AVR GCC Projekt starte und genau den selben Code (also einen von den beiden) rein kopiere, (code wurde nicht verändert), dann dimmen die LED's nicht mehr so wie vorhin.

    Die LED's dimmen normal so (richtig):
    (a)
    LED 1 ein , langsam ausdimmen
    LED 2 ein , langsam ausdimmen
    LED 3 ein , langsam ausdimmen
    LED 4 ein , langsam ausdimmen
    (b)
    LED 1 langsam eindimmen, dann langsam ausdimmen
    LED 2 langsam eindimmen, dann langsam ausdimmen
    LED 3 langsam eindimmen, dann langsam ausdimmen
    LED 4 langsam eindimmen, dann langsam ausdimmen
    LED 1 langsam eindimmen, dann langsam ausdimmen
    Immer so weiter: LED langsam eindimmen, dann langsam ausdimmen.
    Der erste Durchgang (a) wird nur einmal ausgeführt dann immer mit (b) weiter.

    wenn ich aber wie gesagt den selben Code kopiere, dann dimmen die LED's so(falsch):

    LED 1 ein dann einmal ausblinken dann lange Pause, Pause wird mit jeden Blink vorgang immer kürzer, bis dunkel. weiter mit LED 2.

    Ich weis nicht wie das genau passieren kann denn es wird einfach die verzögerung erhöht, richtiger weise sind es 100 us, dieser Takt wird einfach immer schneller bis die LED schliesslich aus ist dann weiter mit LED 2.

    Ich habe alles beachtet bei den Kompilierungsoptionen wurde der ATmega88 ausgewählt bei AVRDude auch ATmega88 ich habe nichts verändert beim kopierten Code.
    Aber wenn ich einen neuen Code schreibe zb. Irgend etwas mit Schaltern wo nichts mit dimmen ist, dann klappt alles.

    Aber wiso nicht beim kopierten Code ?
    Das habe ich schon oft gemacht wenn ich einen Code in mehreren ausführungen brauche zb. einmal mit 2 und einmal mit 4 LED's.

    Ich hoffe jemand kann mir helfen.

    Danke schonmal für die Hilfe.

    Gruss rob_88_20p
    Hey ihr da OHM, macht doch WATT ihr VOLT !

    Strom ist machmal dick, damit er nicht aus der Steckdose läuft.

    http://netzdateien.ne.funpic.de/Emot...nstruction.gif

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Hast du auch kontrolliert ob die gleiche Optimierung eingestellt ist, eventuell mal ohne Optimierung probieren.
    Oder hast du aus den µsec vielleicht msec gemacht?
    Divide Clock by8 nicht abgeschalten.
    Oder fasche Taktquelle eingestellt
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    Also ich habe kontrolliert das es wirklich us sind und nicht ms.
    Das kann also nicht die Ursache sein.

    Was genau meinst Du mit den Optimierungen ist das das hier ?:
    http://netzdateien.ne.funpic.de/AVR.bmp

    Das ist übrigens von einem Code der funktioniert. Ich habe bei diesen einstellungen nichts geändert ausser dass ich den ATmega88 gewählt habe.
    Ich weis garnicht was man bei den häckchen einstellen kann, ausser das ich eines haben muss und das wäre "Create hex File" sonst kann ich das nicht auf den uC brutzeln.
    Hey ihr da OHM, macht doch WATT ihr VOLT !

    Strom ist machmal dick, damit er nicht aus der Steckdose läuft.

    http://netzdateien.ne.funpic.de/Emot...nstruction.gif

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Zwei Felder unter dem Mega88 seht "Optimization", dort stellst du den Optimierungsgrad ein.
    Sonst ist es schwer den Unterschied zu erkennen.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    was für einen Grad soll ich den da einstellen ich kan da ja wählen

    Sorry, hab noch nicht so viel erfarung damit

    aber wiso muss ich das jetzt plötzlich machen sonsts hats ja immer funktioniert ?
    Hey ihr da OHM, macht doch WATT ihr VOLT !

    Strom ist machmal dick, damit er nicht aus der Steckdose läuft.

    http://netzdateien.ne.funpic.de/Emot...nstruction.gif

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Ich stelle immer -0s ein. Es muss aber nicht der Fehler sein, wäre nur eine Möglichkeit.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    Danke
    ich probiers mal grade schnell meld mich dann wieder
    Hey ihr da OHM, macht doch WATT ihr VOLT !

    Strom ist machmal dick, damit er nicht aus der Steckdose läuft.

    http://netzdateien.ne.funpic.de/Emot...nstruction.gif

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    hey
    vielen Dank

    echt geil ich liebe dieses Forum
    Ich habe zwar nichts daran geändert aber komischer weise sind bei alles neuen Codes die ich gemacht habe -0O gewählt
    na toll jetzt kann ich alle Projekte ändern super !!!¨

    aber echt
    vielen Dank Hubert
    Hey ihr da OHM, macht doch WATT ihr VOLT !

    Strom ist machmal dick, damit er nicht aus der Steckdose läuft.

    http://netzdateien.ne.funpic.de/Emot...nstruction.gif

Berechtigungen

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