www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED-Laufband schieben


Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich bau mir zur Zeit ein kleines LED-Laufband, das aus Modulen besteht 
welche 16 Zeilen hoch sind und 32 LEDs( oder eine vielfache von 32) 
breit...,
Ich hab mein Programm jetzt so weit das ich auf einem Modul ein Bild 
anzeigen kann, und die Information für jeweils eine LED nur ein Bit groß 
ist (sprich LED an = 1, aus = 0), jetzt will ich dass das Bild von 
rechts nach Links läuft, also das es im "kreis" geschoben wird, dh.  das 
Bit ganz links soll bei der nächsten geänderten Darstellung ganz rechts 
dargestellt werden, und da nach auf der zweiten LED von rechts usw usf.
Doch leider hab ich keine Idee wie ich mein bisheriges Programm anpassen 
muss das es funktioniert....
Wie ich zb einen Scroll-Effekt von oben nach unten oder umgedreht hin 
bekomme ist mir klar, aber ein Schiebe-Effekt, am besten ohne irgend ein 
Hilfsfeld da hab ich nicht mal ansatzweise ne Idee...
wäre cool wenn mir jemand ein Denkanstoß geben könnte....
so jetzt noch mein bisheriges Programm:

void auswertung(uint8_t feld[],uint8_t laenge, uint8_t pixel)
{
  uint8_t d;
  uint8_t e;
  uint8_t f; 
  uint8_t g;
    
  for(e=0;e<laenge;e++) 
        {
    g=feld[e]; 
                for(d=0;d<8 ; d++)
    {
      f= g & 0x80;       
      g<<=1;              
      if(f == pixel)  
        PORTD |= _BV(PD4);    
      else
        PORTD &= ~_BV(PD4);    
      PORTD |= _BV(PD6);  
      PORTD &= ~_BV(PD6);  
    }
  }
}

int main()
{
  uint8_t a[] =  {0x00,  0x00,  0x00,  0x00,
       0x49,  0x91,  0x0C,  0x00,
       0x4A,  0x51,  0x12,  0x3E,
       0x4A,  0x51,  0x12,  0x41,
       0x7B,  0xD1,  0x12,  0x41,
       0x4A,  0x51,  0x12,  0x55,
       0x4A,  0x51,  0x12,  0x41,
       0x4A,  0x51,  0x12,  0x41,
       0x4A,  0x5D,  0xCC,  0x63,
       0x00,  0x00,  0x00,  0x5D,
       0x00,  0x00,  0x00,  0x41,
       0x00,  0x00,  0x00,  0x3E,
       0x10,  0x41,  0x04,  0x00,
       0x28,  0xA2,  0x8A,  0x00,
       0x45,  0x14,  0x51,  0x00,
       0x82,  0x08,  0x20,  0x80};

  uint8_t pixel = 0;  // 0 = invertierte Anzeige
  uint8_t laenge = 4;       // 4 da im momentan vier Byte pro zeile 
  uint8_t zeilen;
  uint8_t schieben;
  uint8_t *activeBuffer = a; 
  DDRD =0xFF;        
  DDRF =0xFF;
  PORTD =0x00;      
  PORTD |= _BV(PD7);    
  PORTF =0x00;      
  
  do
  {
     for (zeilen=0; zeilen < 16; zeilen++ )
     {
    auswertung(&activeBuffer[zeilen*laenge],laenge,pixel);
    PORTD |= _BV(PD7);
    PORTF =0xff;  
    PORTF = zeilen;    //Ausgabe Zeilenaddresierung
    PORTD |= _BV(PD5);  
    PORTD &= ~_BV(PD5);    
    PORTD &= ~_BV(PD7);    
     }
  }while(1);
  return 0;          
}  
wäre echt cool wenn jemand ne Idee oder einen Vorschlag hätte
Vielen Dank schon einmal

TT

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
word_a = (byte_1 * 0x100) + byte_2;
word_a <<= 1;  // Das ist dein eigendliches links scrollen
byte_ausgeben = word_a / 0x100;

Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber scrolle ich da nicht immer nur ein Byte? in dem momentanen Fall 
muss ich aber alles durch 4 Bytes scrollen....
sprich das erste bit eines Bytes muss erst durch das eigene byte, und 
dann noch durch 4 andere Bytes durch bevor es wieder an der 
ursprünglichen stelle stehen darf/soll/muss.

Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mir überlegt das es auch möglich wäre ein Feld pro Zeile 
zumachen, ist am Anfang vielleicht einfacher zu realisieren.
Aber ich hätte da immer noch das Problem das ich die Bits durchs ganze 
Feld schieben muss, weiß jemand ob es ne Funktion gibt die des kann oder 
wie ich des machen kann?
Wäre echt nett wenn mir jemand weiterhelfen könnte... denn des Problem 
hat mir schon einige schlaflose Nächte beschert
MFG
TT

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.