- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: LED's über mehrere Ports verteilt

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.09.2006
    Beiträge
    17

    LED's über mehrere Ports verteilt

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich habe folgende Situation:
    An einem ATMega8 sind insgesamt 10 LED's angeschlossen. Diese sind über alle drei Ports verteilt (PD2-PD5, PB4-PB5, PC0-PC3).
    Jetzt möchte ich über die 10 LED's ein Lauflicht programmieren. Bis jetzt löse ich das Ganze, indem ich mitzähle bei welcher LED ich gerade bin und dann die entsprechend nächste LED per |= einschalte. Das schaut aber ehrlich gesagt nicht so wirklich toll aus
    Code:
    void Lauflicht1(void)
    {
    	//schaltet das Lauflicht eine Position weiter
    	switch (zaehler)
    	{
    		case 0:
    			//->erste weiße LED ist an
    			PORTD &= 0xfb;
    			PORTD |= 0x8;
    			break;
    		case 1:
    			//->zweite weiße LED ist an
    			PORTD &= 0xf7;
    			PORTD |= 0x10;
    			break;
    		case 2:
    			//->dritte weiße LED ist an
    			PORTD &= 0xef;
    			PORTD |= 0x20;
    			break;
    		case 3:
    			//->vierte weiße LED ist an
    			PORTD &= 0xc3;
    			PORTB |= 0x10;
    			break;
    		case 4:
    			//->erste grüne LED ist an
    			PORTB &= 0xef;
    			PORTB |= 0x20;
    			break;
    		case 5:
    			//->zweite grüne LED ist an
    			PORTB &= 0xdf;
    			PORTC |= 0x1;
    			break;
    		case 6:
    			//->erste der weißen LED's ist an
    			PORTC &= 0xfe;
    			PORTC |= 0x2;
    			break;
    		case 7:
    			//->zweite der weißen LED's ist an
    			PORTC &= 0xfd;
    			PORTC |= 0x4;
    			break;
    		case 8:
    			//->dritte der weißen LED's ist an
    			PORTC &= 0xfb;
    			PORTC |= 0x8;
    			break;
    		case 9:
    			//->letzte der weißen LED's ist an->zurückgehen
    			PORTC &= 0xf0;
    			PORTC |= 0x4;
    			break;
    		case 10:
    			//->dritte der weißen LED's ist an
    			PORTC &= 0xfb;
    			PORTC |= 0x2;
    			break;
    		case 11:
    			//->zweite der weißen LED's ist an
    			PORTC &= 0xfd;
    			PORTC |= 0x1;
    			break;
    		case 12:
    			//->erste der weißen LED's ist an
    			PORTC &= 0xfe;
    			PORTB |= 0x20;
    			break;
    		case 13:
    			//->zweite der grünen LED's ist an
    			PORTB &= 0xdf;
    			PORTB |= 0x10;
    			break;
    		case 14:
    			//->erste der grünen LED's ist an
    			PORTB &= 0xef;
    			PORTD |= 0x20;
    			break;
    		case 15:
    			//->vierte der weißen LED's ist an
    			PORTD &= 0xdf;
    			PORTD |= 0x10;
    			break;
    		case 16:
    			//->dritte der weißen LED's ist an
    			PORTD &= 0xef;
    			PORTD |= 0x8;
    			break;
    		case 17:
    			//->zweite der weißen LED's ist an
    			PORTD &= 0xf7;
    			PORTD |= 0x4;
    			break;
    	}
    	if (zaehler < 17)
    	{
    		zaehler++;
    	}
    	else
    	{
    		zaehler = 0;
    	}
    }
    Den Code finde ich nicht besonders toll wenn ich ehrlich sein darf. Gibt es eine Möglichkeit das Ganze eleganter zu machen? Optimal wäre natürlich, wenn ich einfach nur mit links- bzw. rechtsshift arbeiten könnte...

    Vielen Dank im voraus schonmal fürs lesen und viele Grüße

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich mach sowas, indem ich zwei Tabellen anlege:
    Code:
    char cPortAddr[17] = { port1, port2,...... port17 };
    char cPinMask[17] = { 0x10, 0x20,...... 0xNN };
    Portaddr aus dem Datenblatt IO-REG, d.h. meist z.B. PORTD + 0x20  
    
    LedAufdrehen( zaehler)
    {
    uint* Port = cPortAddr[zaehler];
       *Port |=  cPinMask[zaehler];
    }
    LedAbdrehen( zaehler)
    {
    uint* Port = cPortAddr[zaehler];
       *Port &=  ~cPinMask[zaehler];
    }
    
      while (1)
      {
          sleep (x)      // oder sowas ähliches
          LedAbdrehen( zaehler);
          if (zaehler < 17)          zaehler++; 
         else                             zaehler = 0; 
          LedAufdrehen( zaehler);
      }
    Verständlich ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.09.2006
    Beiträge
    17

    Gar nicht schlecht

    Hallo Robert,

    ja, dein Code ist verständlich
    Danke für den Tipp, das schaut auf jeden Fall schon sehr viel besser aus als mein Versuch.

    Viele Grüße

Berechtigungen

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

Labornetzteil AliExpress