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

Thema: LED Matrix 8 x 8 AVR C

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Also ich habe bei unserer Matrix folgendes Prinzip angewandt: Ein großer langer Videospeicher enthält alle LED an/aus Informationen des gesamten anzuzeigenden Textes. Und dann gibt es zwei kleine Videospeicher, die genau so groß sind wie die Fläche, auf der angezeigt werden kann. Jetzt wird ein socher Videospeicher wie ein "Fenster" auf den großen gelegt und dann der Multiplex-Einheit zur anzeige übergeben. Währenddessen wird der zweite kleine Videospeicher beschrieben, nur dass das "Fenster" jetzt um eine Spalte weiter verschoben wurde (Sozusagen das nächste Frame, der Text ist eine Spalte weitergewandert). Nach einer gewissen Zeit (z.B. ein vielfaches der Multiplex-Frequenz, dann kann man den gleichen Timer benutzen) werden die beiden Arrays dann ausgetauscht.

    Um einen Teil des großen Videospeichers in den kleinen zu bekommen ist halt eine Schleife und die entsprechenden << und >> - Anweisungen nötig.
    Da hilft es ungemein wenn man sich eine Skizze des Speichers auf einem Blatt Papier macht und sich überlegt was wieviel wohin geshiftet werden muss

    Alternativ, falls du es dir vom Speicher her leisten kannst, könnte man auch für jede LED ein eigenes Byte spendieren, dadurch erspart man sich die ganze Bitshifterei und kann mit übersichtlicheren Schleifen arbeiten.

    Hoffentlich war das jetzt einigermaßen verständlich ausgedrückt.
    Ich kann auch ein bisschen Quellcode posten, nur glaube ich nicht dass er dir viel hilft.

    Grüße Thegon

  2. #2
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Hallo Thegon,

    Wie hast du es realisiert, dass die Zeichen direkt hintereinander kommen ? Sprich z.B "www.google.de" das man die "leerzeichen" frei wählen kann.
    Code würde mich sehr freuen, ich habe im moment echt noch keinen Ansatz wie ich das einigermaßen ordentlich umsetzen könnte.
    Geändert von Janiiix3 (12.08.2014 um 18:30 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Also der Zeichengenerator (der den großen Videospeicher vollschreibt) besteht aus einem großen PROGMEM-Array, das die ganzen Pixel-Informationen der einzelnen Buchstaben enthält (damit alles schön in ein Byte passt kann bei mir ein Buchstabe nicht länger sein als 8 Spalten, da ich 7 Zeilen LEDs habe sind es dann 7 Bytes pro Buchstabe). Jeder Buchstabe enthält bei mir eine Leerspalte (gehört also fix zu den Pixeldaten), dass die Buchstaben nicht so aufeinander kleben. Ein Leerzeichen besteht dann halt aus vier oder fünf Leerspalten, glaube ich. Die perfekte Umsetzung ist auch das nicht, aber so schlecht schaut es meiner Meinung nicht aus. Bleibt noch, dass manche Buchstaben mehr Spalten brauchen als andere (z.B. ist B länger als i), deswegen gibt es ein zweites PROGMEM-Array, in dem die Längen abgespeichert sind für die einzelnen Buchstaben. Die beiden Arrays generiere ich mit einem simplen kleinen VB.net Programm, das geht schneller ein solches zu schreiben als alles per Hand reinzuklopfen.

    Code:
    #define     used_length       5 // d.h. der große Videospeicher ist 5*8 Spalten lang, wenn wir darüber hinaus sind fängts von vorne an
    
    void bufcpy(char startpoint, char targetbuffer){
        /*
            So, was macht diese Funktion jetzt: 
            Sie kopiert ausgehend vom Startpoint (in Bits -> LED-Spalten im großen Videospeicher) ein Byte in den Ausgabebuffer, das in jeder Zeile
            
            d1[5][8] ist der große Videospeicher, 
                  wobei [5] bedeutet dass die Länge 8*5 = 40 Spalten beträgt. 
                  [8] bedeutet, dass die Matrix 8 Zeilen hat
    
           dm[2][8] sind die zwei Swap-Buffer 
                  [2] bedeutet dass es zwei gibt, in die geschrieben werden kann (als Funktionsparameter übergeben,
                  in welchen geschrieben werden soll)
                  [8] bedeutet, dass die Matrix 8 Zeilen hat
    
        */
        
        //Funktionsinterne Variablen:
            //So viele Bits ist unterschied zwischen den Byte-Reihen der beiden Buffer
                char startblock = startpoint/8; 
                char offset = startpoint%8; 
            
            //Zählervariablen der Schleifen
                char i, j; 
                
            //Hier werden die beiden Bytes, also das halbe drüber und das halbe drunter hineinkopiert und entsprechend geshiftet
                char low, high; 
        
        //Die Zeilen durchgehen
        for(i=0; i < 8; i++){   
                //Lowbyte laden und entsprechend verschieben, gleiches für Highbyte
                low = d1[(startblock )%used_length][i]; 
                low = low >> offset; 
                high = d1[(startblock + 1)%used_length][i]; 
                high = high << (8-offset); 
                
                //Nun zusammenfügen
                dm[targetbuffer][i] = high | low; 
        }
        
    
    }
    Das ist jetzt ein wenig angepasst, dass es zu deinen Abmessungen passt, deshalb auch nicht getestet und eher nur als "Pseudocode" zu verstehen.
    Aber ich hoffe, es ist ein wenig verständlich wie ich das meine

    Grüße
    Thegon

  4. #4
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Danke schon mal für eure Mühe! Sehr Lobenswert.

    Die Funktion "ScrollText" habe ich ja nicht in meinem Programm so realisiert. Sollte ich mein Programm was dieses Thema angeht umschreiben ? In dem Beispiel von Mic (Link), wurde doch ohne "VRAM" gearbeitet oder sehe ich das falsch? Dort wird immer nur die aktuellen Pixelinformationen an die jeweilige "col" übergeben. Ich schiebe ja imoment die ganzen Pixelinformationen von einem Zeichen in den "VRAM" und arbeite den dann ab. Das ist doch eigentlich gar nicht nötig oder sehe ich das falsch? Das ist ohne doch viel einfacher?!

    Code:
    
    /* -------------------------------------------------------------------------  * Funktion ScrollLeft  *  * Verschiebt den Inhalt LED-Matrix um eine Spalte nach links.  * Die erste Spalte tritt dabei an die Position der letzten Spalte.  * -------------------------------------------------------------------------*/ void ScrollLeft(void) {   uint8_t xcol;                           /* Spaltenzähler */   uint16_t first;                         /* Zwischenspeicher der ersten Spalte */    first = leds[0];                        /* Erste Spalte sichern */   for (xcol=0;xcol<WIDTH-1;xcol++)   { 	  leds[xcol]=leds[xcol+1];            /* Spalten nach links verschieben */   }   leds[WIDTH-1] = first;                  /* Erste Spalte an letzte Spalte kopieren */ }
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  5. #5
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Hey Mic,

    Habe da noch mal eine Frage...!

    Was genau macht diese Deklaration ? (prog_uint8_t * fnt = (prog_uint8_t *) font; )

    Ich vermute mal das dass irgendwas mit nem Pointer (*) zu tun hat oder ? Wieso machst du das mit dem Pointer ? Was hat das für Vorteile ? ( Ich habe mit Pointern keine Erfahrung )
    Den Datentyp "prog_uint8_t" habe ich auch noch nie gelesen... Was macht der genau ? Flash ?
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  6. #6
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Kann man das so machen ?

    for (uint8_t i = 0 ; i < 50 ; i++)
    {


    for (uint16_t d = 0 ; d < 8 ; d++)
    {
    VRAM[d] = VRAM[d] + pgm_read_byte(&charMap[i][d]) * 0xFF; // ins Highbyte schreiben
    VRAM[d] = VRAM[d] + pgm_read_byte(&charMap[i][d]); // ins Lowbyte schreiben
    }


    ShiftVRAM();
    }
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Die Frage ist: was genau machst du da?
    In welchem Zusammenhang wird das Codefragment verwendet, was soll es bewirken? Auch wäre gut, wenn man sieht, wie die Variablen deklariert sind.

    Und dieser Ausdruck
    Code:
    &charMap[i][d]
    ist, soweit ich mich jetzt auskenne, der Zugriff auf einen RAM-Speicherplatz, dessen Adresse in einem zweidimensionalen Array bestehend aus Pointern gespeichert ist. Ich glaube zwar, dass das prinzipiell funktioniert, ein Array aus Pointern zu machen, aber wozu?
    Es kann aber auch sein, dass ich das jetzt nicht richtig lese, aber dann wird mich jemand anders aus dem Forum hoffentlich korrigieren

    Grüße
    Thegon

Ähnliche Themen

  1. LED Matrix
    Von Zwerwelfliescher im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 02.09.2011, 19:54
  2. LED Matrix
    Von Tanne123 im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 13.10.2010, 22:20
  3. LED MATRIX
    Von Beta im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 01.06.2009, 21:47
  4. LED Matrix Baustein
    Von karlmonster im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 07.04.2008, 19:57
  5. LED Matrix
    Von .Johannes. im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 30.08.2006, 21:29

Berechtigungen

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

Labornetzteil AliExpress