Forum: Mikrocontroller und Digitale Elektronik Labor Aufgabe LED-Lauflicht


von Florian *. (haribohunter)


Angehängte Dateien:

Lesenswert?

Servus Leutz,
Ich Poste mal die Labor- Aufgabe damit alle was davon haben.
Eines vorab. Ich erwarte weder Hilfe noch Sourcecodes, da ich diese
Aufgabe allein erledigen soll. Bin aber natürlich dankbar für alles ^^.
Spätestens wenn der Code von meinem Labor-Fuzzi abgenommen wurde kommt
er dann hier rein. (bis zum 20.9 muss das fertig sein, dann hab ich
Prüfung ^^).

Nun zur Aufgabe:
Schreiben sie ein C-Programm zur Ansteuerung einer LED-Matrix als
Laufschriftanzeige.
Vorgaben:
Zeitgesteuertes Multiplexen der 16 Columnen im Milisekunden- Rhythmus.
Nach links schieben der Anzeige in bestimmten Intervallen. Z.B alle 100
ms.
Aufbau der ASCII-Zeichen in einer 8x15 Matrix
Alle ASCII-Zeichen-Matrizen im Programmspeicher- ASCII-Zeichensatz
Eingabe von beliebigen Strings per UART ins EEPROM
Lauftext -Anzeige des Strings im EEPROM.

Zur verfügung stehen: Leiterplatten mit µc und 16x8 LED-Matrix
Programier- Adapter
5V Netzteil und PC
Software Ponyprog und AVR Studio
CODE-Vision-C-compiler

Der Kerl fragt dabei nach so ziemlich allem was son µC kann. (Nix
analoges)
Interrupts, Zähler, uart, Ausgänge, Speicherabfragen, Tabellen
Ich habe bereits in die diversen Tutorials hier geschaut und vieles
davon hilft. Jetzt heißt es quasi nur noch einen Quelltext schrauben
der das ganze Gekröse irgendwie miteinander verbindet seuftz.
Naja, ich werde auf jedenfall hierhinein über Misserfolge und
Fortschritte berichten. Schaden kanns net.

In der Datei oben stehen die codierten ASCII Zeichen für die Tabelle.

von Florian *. (haribohunter)


Lesenswert?

Ach so vergessen.
der µc isn AT90S8515

Es gilt noch folgende Fragen zu beantworten.

Was Bedeutet der Begriff ASCII- Generator?
Wie erfolgt die Zeitsteuerung der Ausgabe?
Wie wird die Menueführung des Benutzers realisiert?


Eigene Gehversuche:

Zunächst habe ich mir einmal die Tutorials hier auf der Seite
angeschaut. Danach das CodeVision (degenerierte Freeversion)
Über den Code-Wizard hab ich mir zunächst ein Gerüst aufgebaut, an dem
ich nun versuche mich entlangzuhangeln.
Ich denke der Anfang ist am schwersten. Also wo anfangen? Beim Uart?
Bei der ASCII- Tabelle?
oder bei den Dioden? mal sehen.

von bob (Gast)


Lesenswert?

Hallo. also 16lang und 8 hoch? da kriegt man vernünftig 3 buchstaben
nebeneinander. Was soll das programm machen? ich würde das mit zwei
interrupts machen

1)urxc - uart empfangsinterrupt. dann überlegst du dir nen befehlssatz,
dass er zB bei (!) den eeprom löscht und dann anfängt bei eins
reinzuschreiben (in null würde ich die länge des strings
reinschreiben).
Sinnvoll ist hier, den empfangenen string mit einem anderen befehl
abzuschliessen, dass er erst dann in den eeprom übertragen wird. (und
die null nicht mit jedem tastendruck überschrieben wird)

2) timer (zb 250ms) für die laufschrift -> hier wird der ausgegebene
string in 3er grüppchen ausgelesen und dann ans hauptprogramm
übergeben.

im hauptprogramm machst du die multiplexanzeige. (somit kommen sich die
timer nicht in die quere)

von Jadeclaw (Gast)


Lesenswert?

@Florian: Wirf mal einen Blick hierauf:
http://www.attiny.com/dotmatrix.htm

Dürfte für einige Ideen gut sein.
Aber nicht kopieren, dein Dozent dürfte das Ding auch kennen ;-)

Gruss
Jadeclaw.

von Peter Dannegger (Gast)


Lesenswert?

Also einfach ist die Aufgabe nicht gerade, fange also zeitig an.

Und besonders sinnvoll ist eine Laufschrift mit nur einem Buchstaben
auch nicht gerade.

Der AT90S8515 könnte knapp werden, die Hälfte ist ja schon durch den
8*15 Zeichensatz belegt. Bzw. frag mal, wie komplett der ASCII
Zeichensatz sein soll, oftmals wird ja nur von 20h..7Fh benötigt.
Ich hoffe Du findest irgendwo einen 8*15, üblich ist ja oft nur 5*7.

Und versuche vor allem nicht alles gleichzeitg zu machen (=
Spaghetticode) sondern teile alles in kleine Module auf
(Baby-Schritte).

Die UART sollte man als erstes machen, dann kann man sie später für
Debug-Ein-/Ausgaben nehmen, der Codevision hat ja schon vorgefertigte
Blackboxen dafür. Oder man macht es selber (Interrupthandler), dann
versteht man es besser und hat die volle Kontrolle über die
Ressourcen.


Peter

von Läubi (Gast)


Lesenswert?

>> Was Bedeutet der Begriff ASCII- Generator?
Naja, ASCII ist ja nur ein Zeichensatz (8bit) fidnest du auch Tabellen
zu im Internet, im Prinzip Zahlen von 0 - 255, davon sind die ersten 32
Zeichen (meist nicht darstellbare) Steuerzeichen.
Dann kommen halt Sonderzeiche, Zahlen, Groß und Kleinbuchstaben.
Ein ASCCII Generator müßte eben in deinem Beispiel in der Lage sein aus
der Zahl 84 (welche im EPPROM liegt bspw) das Bitmuster für den
Buchstaben T zu generieren das du dann über deine Multiplexersteuerung
ausgeben kannst:
http://elektronik.laeubi-soft.de/index.php?id=13
Da hab ich mal mit einem einselnem LED Modul nen kleinen Test gemacht,
später wollte ich eine richtige Laufschrift mit 10 dieser Module
machen, aber im Prinzip ist es ja nur ne verdoppelung :)
Habt ihr wirklich nur ne 8x15 Matrix zum ANzeigen? Oder mehrere 8x15
Module hinteinander?

von Florian *. (haribohunter)


Angehängte Dateien:

Lesenswert?

Schade die Links auf
http://www.attiny.com/dotmatrix.htm
sind tot.

Aber ich hab was gefunden was mir sicherlich weiterhilft.
Ist ja nicht so das nicht alles irgendwo schon einmal geproggt worden
wäre. Es hat aber nicht die geforderte Datenbank... der hat das mit
case programiert.
Aber für tabellen hab ich hier auf der Seite im Tutorial schon was
gelesen.
Also dieser Quellcode sieht ziemlich fertig aus. Den werde ich mir
genauer anschauen.
Greez

von Florian *. (haribohunter)


Lesenswert?

Oha, Danke für die Anteilname.

Also ich hab mich verkuggt. Ist eine 16*8 Matrix (0-15).
Und der Code ist wie ganz mitgeliefert ein 5x7 ascii.

      D7....D4/B3..B0 /C7...........C0
A7    o o o o o o o o o o o o o o o o
A6    o o o o o o o o o o o o o o o o
A5    o o o o o o o o o o o o o o o o
A4    o o o o o o o o o o o o o o o o
A3    o o o o o o o o o o o o o o o o
A2    o o o o o o o o o o o o o o o o
A1    o o o o o o o o o o o o o o o o
A0    o o o o o o o o o o o o o o o o

Wobei die Unterste Zeile trivial ist.

von Florian *. (haribohunter)


Lesenswert?

Jetzt hab ich das erst kapiert ^^

Ein R hat nach der Vorgabe meines verehrten Herrn Dozenten die
Codierung

R= 0x7F   0x09   0x19   0x29   0x46

Diese Zeile wird, sobald die entsprechenden Befehle kommen im
Programmspeicher zugewiesen und wenn jetzt Das Lauflicht-R in die
LED-Anzeige von Rechts hinein wandern soll, dann wird der Code von
Rechts nach links in die Multiplexer- register hineingeschrieben. und
entsprechend hinten hinausgeworfen (wie soll das denn gehen ??!?!??)

Wenn R dann vollständig ist, sieht R so aus:

      C4.....C0
A0    x x x x o
A1    x o o o x
A2    x o o o x
A3    x x x x o
A4    x o x o o
A5    x o o x o
A6    x o o o x
A7    o o o o o

J nachdem ob ich nach dem Höchstwertigen bit oder nach den Ausgängen im
Port schaue Ändert sich die Reihenfolge von A.

von Jens D. (jens) Benutzerseite


Lesenswert?

Hallo
ich hatte so etwas mal mit schieberegistern, zahelern und einem eprom
gemacht
irgendwo muss ich noch den schaltplan haben ich schau mal

Kleiner tipp, wenn du noch keine ahnung hast
geh hin und arbeite das tutorial durch in asm ich weiss aber es hilft
ungemein dem verstaendniss..

dann geh hin und sende einen strimg (#start##clear#Hallo Welt#stop#)
zb. an den controller und sende ihn, wenn empfanngen wieder an den pc
#start# #stop# #clear# sind steuerzeichen, dass du erkennst, wo was
ist..

Frage ist nun sollst du noch irgendwelche schiebe register nutzen, um
die wenige ports nutzen zu muessen?

die ascii tabelle koenntest du aus einer LIB von einem Nokia LCD
missbrauchen..
zB.
    0x7E, 0x11, 0x11, 0x11, 0x7E,   // A
    0x7F, 0x49, 0x49, 0x49, 0x36,   // B
    0x3E, 0x41, 0x41, 0x41, 0x22,   // C
    0x7F, 0x41, 0x41, 0x22, 0x1C,   // D
    0x7F, 0x49, 0x49, 0x49, 0x41,   // E
    0x7F, 0x09, 0x09, 0x09, 0x01,   // F
    0x3E, 0x41, 0x49, 0x49, 0x7A,   // G
    0x7F, 0x08, 0x08, 0x08, 0x7F,   // H
    0x00, 0x41, 0x7F, 0x41, 0x00,   // I
    0x20, 0x40, 0x41, 0x3F, 0x01,   // J
    0x7F, 0x08, 0x14, 0x22, 0x41,   // K
    0x7F, 0x40, 0x40, 0x40, 0x40,   // L
(http://microsyl.com/nokialcd/nokialcd.html)
Das sind schon die 5 mal 8 Punkte pro zeichen..
die ausgabe ist dann relativ einfach ueber 2 for schleifen
nur der controller wird viel arbeiten muessen..

Gruss Jens

von Peter Dannegger (Gast)


Lesenswert?

Wie gesagt, teile alles in kleine Funktionen auf und herrsche:

Mach Dir nen Bildspeicher von 16 Bytes (= 8*16 Pixel).
Ein Prozeß legt dann dort das Zeichenmuster ab und ein anderer
(Timerinterrupt) gibt das dann aus.

Nochn Tip:

Mache Zeilenmultiplex (Tastverhältnis 1/8), dann ist die Anzeige heller
und flackert weniger. Außerdem kann man dann leichter z.B. auf 32
Spalten (= 5 Buchstaben) erweitern.


Peter

von Hauke Sattler (Gast)


Lesenswert?

Bei ein paar Sachen muß ich Peter Recht geben. Erstmal in funktionen
aufteilen. Und die einzel schonmal zum Laufen bringen.
Meine Reihenfolge wäre: Erstmal UART coden. Danach die Übergabe der
Daten in den EEprom. Wenn man dann Daten im EEprom hat kann man sich
dranmachen die darzustellen.
Zur Darstellung ist ein Bildspeicher wirklich zu empfehlen, jedoch (und
hier muß ich Peter widersprechen, (@Peter bitte nicht böse sein=8))
solte der größer als das darzustellende Bereich sein.
Ich würde 32 Bytes vorschlagen, von denen aber nur 16 dargestellt
werden (z.B. Byte 8-23). In dem zur Zeit nicht dargestellten Bereich
werden dann die Bilddaten vom Programmspeicher und vom EEprom(vorsicht
AVR-EEprom ist nicht sehr schnell!!!) geschrieben.
Das bewirkt das die Zeichen sauber Ein- und Ausscrollen und nicht
rechts Reinpoppen oder links als ganzes Zeichen verschwinden.
Vom dem Zeilenmultiplex würde ich die Finger lassen. Davon ist in der
Aufgabe nicht die Rede, und es macht die Sache nur schwieriger.


cu
Hauke

von Hagen (Gast)


Lesenswert?

@Hauke,

und da muß ich dir widersprechen ;)
Baue zuerst die Ansteuerung der Matrix, samt Bildschirmbuffer der aber
nur so groß ist die die Matrix. Diesen Buffer kannst du erstmal
hardcoded mit deinem ASCII für R befüllen und testen. Danach erweiterst
du diese Anzeigeroutine = Timer um einen Bildschirm-Zeiger der in den
Buffer zeigt. Dieser Zeiger stellt den Anfang der zu multiplexenden
Spalte dar und kann nun um +-1 verschoben werden um das Zeichen auf dem
Display zu scrollen (link/rechts). Der Buffer wird also nicht beim
Scrollen umkopiert sondern nur der Zeiger verändert.
Wenn das dann fertig ist setzt du den UART auf.

So würde ich rangehen.

Hat dein Fuzzi irgendwas darüber ausgesagt ob auf dem AVR die ASCII
Tabelle liegen muß ? Oder kann die PC Software direkt den
Bildschrimbuffer binär an den AVR übertragen. Ich frage weil es
meistens einfacher ist die Hardware dumm zu lassen und die PC
Steuersoftware intelligenter zu machen.

Gruß Hagen

von Jens D. (jens) Benutzerseite


Lesenswert?

Hallo
teilweise ok
aber wozu einen bildspeicher??
wenn man einen bildspeicher nutzen wollte muesste man immer den
gesamten string darin speichern (bei einem text "hallo" muesste
dieser 5 x 5 byte gross sein)
Ich wuerde erst einmal anfanngen den µC mit der Matrix zu verbinden
sprich:
PORTA : A0 .. A7
PORTB:  B0 .. B7
PORTC:  C0 .. C7

nu gehts los:

Speicher den String in einer Variablen zB. "Hallo"

nun gehst hin und gibst erst einmal den linken balken von dem H aus
dann schreibst den kompletten Buchtaben H aus
und dann eine neue schleife und gibst  das ganze wort aus

um das ganze dann zum "laufen" zu brinngen musst nur den "offset"
aendern

evtl kannst du alles in der main() machen mit ner endlosschleife

while(1==1)
{
   (ausgabe)
   i++;
   if(i >= 15)
      i = 0
}

das UART nutzt du dann fuer die eingabe und aenderst nu den String mit


Gruss Jens

von Peter Dannegger (Gast)


Lesenswert?

@Hauke,

"Vom dem Zeilenmultiplex würde ich die Finger lassen. Davon ist in
der
Aufgabe nicht die Rede, und es macht die Sache nur schwieriger."


???

Beim Zeilenmultiplex gibst Du 2 Bytes je Interrupt aus und schaltest
die Zeilenbits ein weiter.

Beim Spaltenmultiplex nur ein Byte je Interrupt, was ist denn daran so
viel einfacher ?

Allerdings hast Du dann schon flackerige 1000Hz / 16 = 62Hz
Bildfrequenz.
Und warscheinlich wirst Du auch noch die garantierten Betriebsparameter
und Maximalströme des AVR überschreiten müssen, um auf Helligkeit zu
kommen.


Die Idee mit dem Schattenspeicher ist ja ganz net, aber ob das
gefordert ist ?
Ich denke mal, die Zeichen sollen komplett eins weiter schalten.

Scrollen macht erst bei größeren Anzeigen einen Sinn, wo man komplette
Wörter lesen kann. Und dann reichen zusätzliche 5 Byte für das nächste
Zeichen vollkommen aus.

Und die 4 Zyklen fürs EEPROM lesen sind ja nicht der Rede wert.


Peter

von Jadeclaw (Gast)


Lesenswert?

Dass die ATtiny.com nicht kommt, kann daran liegen,
dass er hat eine Umleitung da drauf hat.
Die eigentliche Seite liegt hier:
http://home.wanadoo.nl/electro1/avr/dotmatrix.htm

Gruss
Jadeclaw.

von Peter Dannegger (Gast)


Lesenswert?

@Jens

"aber wozu einen bildspeicher??"

Ganz einfach, er entkoppelt das Multiplexen von der Zeichendekodierung,
EEPROM lesen, UART-Auswertung usw. usw.

Gemultiplext werden soll ja im ms-Takt, ein neues Zeichen wird aber nur
alle 100ms eingeschoben.

Der Bildspeicher ist quasi ein Abbild des sichtbaren Bereichs (+5 Byte,
wenn soft gescrollt werden soll). Der gesamte Text steht ja im EEPROM
und da steht er gut.


Aber macht man es so wie Du vorschlägst in der Hauptschleife, ergibt
sich ganz schnell der gefürchtete Spaghettikode und außerdem halst Du
der CPU nur unnötige Arbeit auf.

Zu allem Überdruß bedeutet Multilplexen ohne Timer in der Hauptschleife
schön flackernde unterschiedlich helle Pixel, je nach zufälliger
Programmlaufzeit der gerade aktiven Routinen. Das reicht dann
bestenfalls noch zur Note 4.


Peter

von Jens D. (jens) Benutzerseite


Lesenswert?

ooops
überredet
aber wie soll der buchtabe laufen?
ich mein es reicht bestenfalls fuer 3 zeichen und nicht mehr
ich kann mir nicht vorstellen, dass es klappt, wenn es nur als demo
sein soll ok
aber soll der gesamte text darueber laufen oder sich die zeichen
laufend aendern??
das mit dem EEPROM  hab ich nun verstanden
aber nimmt man da nicht lieber den SRAM?? EEPROM ist doch
"lanngsamer" und nicht so oft beschreibbar
da wuerde ich nur den string drin speichern

von Florian *. (haribohunter)


Lesenswert?

dat Ding soll ins Eeprom, das Ding kommt ins eeprom,
Ich hab schon genug Schwierigkeiten beim coden, da werde ich die
wenigen konstanten die ich in der Aufgabe hab bestimmt net
hinterfragen.
also...
Eingabe von beliebigen Strings übers Uart ins eeprom.
kompletter Ascii Zeichensatz (siehe ersten Post) innen
Programmspeicher. Und die Timer net vergessen.
Ich denke ich gehe jetzt nach Hause und bekomme einen gepflegten
Nervenzusammenbruch und schau mir die Sache morgen nochmal an. ^^
Hatte mir das Teil einfacher vorgestellt.
Also auf die weisen Worte vom Peter achten und Babyschritte machen.
Bis morgen dann.

von Jens D. (jens) Benutzerseite


Lesenswert?

Du schaffst das schon
und haennst du mal einfach fragen..
nur leider verstehe ich das ganze noch nciht
was soll wie wohin laufen??

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.