mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programm für Dot Matrix Ansteuerung


Autor: Stefan K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute

Bin gerade eine Laufschrift am Programmieren. Das ganze soll an eine 5*6 
Dot Matrix Anzeige ausgegeben werden.
Die Anzeige hab ich aus 35 einzelnen LED's aufgebaut, ist also kein 
fertiges Modul.
Die einzelnen Reihen und spalten hab ich wie auf dem Bild im Anhang 
direkt über Transistoren mit dem uC (ATMEGA 168) verdratet (keine 
Schieberegister oder Treiber).

Mit der Hardware bin ich so zufrieden, brauche keine Treiber oder so. 
Wird ein Geburtstagsgeschenk und muss technisch nicht top sein, optisch 
ist es aber in Ordnung.

Nun kommen wir zum Code. Wie bei Dot Matrix Anzeigen üblich steuere ich 
sie per Multiplexen an. Nun ist es aber relativ mühsam, einen Text über 
die Anzeige laufen zu lassen. Habe bis jetzt Happy B-Day implementiert, 
und habe ziemlich viel Zeit, sowie 57% des Programmspeichers gebraucht.
Im Anhang sieht ihr mein Code. habe alles über for Schleifen gemacht.

Ich bin sicher, es gibt viel einfachere Wege, das ganze zu realisieren. 
Ich hoffe ihr könnt mir einen guten zeigen.

Die Implementierung sollte nicht zu viel Zeit in Anspruch nehmen, da es 
wie gesagt ein Geburtstagsgeschenk werden soll und dieses bis spätestens 
Freitag fertig sein muss;)

Hoffe auf eure Hilfe

Grüsse Stefan

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung einschalten.
Kommentare einfügen.
Ansonsten bist du nicht der erste der Multiplexert. Wie haben es deine 
Vorgänger gemacht?

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne jetzt zu tief in den Code einzusteigen würde ich es folgendermaßen 
machen:

- ein globales 2D-Array, dass deine LEDs repräsentiert (Kann auch 1D 
sein, dann nimmst du halt die Bits eines Wertes als Repräsentation der 
LEDs)

- Eine Funktion, die in einem bestimmten Takt dieses Array "anzeigt", 
soll heißen: die Funktion iteriert über das Array und setzt bzw. löscht 
die LEDs

- Nun kannst du die einzelnen - nennen wir es Frames - als 
Array-Deklarationen nehmen und immer in das globale Array kopieren

Pseudocode für ein durchlaufendes 'A':
uint8_t Frame1[]
{
    0b00000001,
    0b00000001,
    0b00000001,
    0b00000001,
    0b00000001   
};

uint8_t Frame2[]
{
    0b00000011,
    0b00000010,
    0b00000011,
    0b00000010,
    0b00000010   
};

uint8_t Frame3[]
{
    0b00000111,
    0b00000100,
    0b00000111,
    0b00000100,
    0b00000100   
};

uint8_t Frame4[]
{
    0b00001111,
    0b00001000,
    0b00001111,
    0b00001000,
    0b00001000   
};

uint8_t Frame5[]
{
    0b00011111,
    0b00010001,
    0b00011111,
    0b00010001,
    0b00010001   
};


Geht sicher noch eleganter, aber zum Einstieg sollte es klappen. Die 
Arrays solltest du in den Programmspeicher packen.

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MoinMoin,

hier mal ein Beispiel für eine 8x8-Matrix, welches sich aber an deine 
Hardware anpassen lassen sollte (und beliebigen Text ausgeben kann)...

http://bralug.de/wiki/8x8-LED-Matrix#Laufschrift

Grüße Uwe

PS.: 5x6 sind 30 (und nicht 35)...

Autor: S. T. (cmdrkeen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier meine Anregung ... das Programm schreibt H A L L O
7 LED-Zeilen hängen an PORTB
und die 5 Spalten an PORTD
Die Buchstaben könnte man noch im EEPROM ablegen und gezielt per 
funktion aufrufen.
den Refresh der Anzeige übernimmt der TIMER1
die Hauptschleife kümmert sich nur um den Text (und das effizienter zu 
programmieren sollte kein Problem sein)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile char disp[5];
volatile char col;

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
      PORTB=0x00;
      PORTD=0x00;
}

SIGNAL(SIG_OUTPUT_COMPARE1B)
{
    TCNT1H=0; TCNT1L=0;
    
    PORTD=(1<<col);
    PORTB=disp[col-2];
    if(col==7) col=2;
    else col++;
    TCNT1H=0; TCNT1L=0;
}

void Start_Timer()  // the timer disables the current after 0.25 sec
{
  OCR1AH=0x00; OCR1AL=0x38;  
  OCR1BH=0x02; OCR1BL=0x40;  
  TCNT1H=0;  TCNT1L=0;       
  TIMSK |= (1 << OCIE1A);    
  TIMSK |= (1 << OCIE1B);  
  sei();            
  TCCR1B=0b00000010;      
  
}

int main()
{
  DDRB=0xFF;
  PORTB=0x00;
  DDRD=0xFF;
  PORTD=0x00;
  col=2;
  Start_Timer();
  while (1)
  {
    
    disp[0]=0b01111111;
    disp[1]=0b00001000;
    disp[2]=0b00001000;
    disp[3]=0b00001000;
    disp[4]=0b01111111;
    _delay_ms(750);
    disp[0]=0x00;
    disp[1]=0x00;
    disp[2]=0x00;
    disp[3]=0x00;
    disp[4]=0x00;
    _delay_ms(150);
    disp[0]=0b00111111;
    disp[1]=0b01001000;
    disp[2]=0b01001000;
    disp[3]=0b01001000;
    disp[4]=0b00111111;
    _delay_ms(750);
    disp[0]=0x00;
    disp[1]=0x00;
    disp[2]=0x00;
    disp[3]=0x00;
    disp[4]=0x00;
    _delay_ms(150);
    disp[0]=0b00000001;
    disp[1]=0b00000001;
    disp[2]=0b00000001;
    disp[3]=0b00000001;
    disp[4]=0b01111111;
    _delay_ms(750);
    disp[0]=0x00;
    disp[1]=0x00;
    disp[2]=0x00;
    disp[3]=0x00;
    disp[4]=0x00;
    _delay_ms(150);
    disp[0]=0b00000001;
    disp[1]=0b00000001;
    disp[2]=0b00000001;
    disp[3]=0b00000001;
    disp[4]=0b01111111;
    _delay_ms(750);
    disp[0]=0x00;
    disp[1]=0x00;
    disp[2]=0x00;
    disp[3]=0x00;
    disp[4]=0x00;
    _delay_ms(150);
    disp[0]=0b00111110;
    disp[1]=0b01000001;
    disp[2]=0b01000001;
    disp[3]=0b01000001;
    disp[4]=0b00111110;
    _delay_ms(750);
    disp[0]=0x00;
    disp[1]=0x00;
    disp[2]=0x00;
    disp[3]=0x00;
    disp[4]=0x00;
    _delay_ms(150);
  }
}

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.