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.
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.
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)
@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.
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
>> 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?
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
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.
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.
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
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
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
@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
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
@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
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.
@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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.