Hallo, Bin dabei mit meinem Microcontroller eine LED Matrix anzusteuern. Nun werden meine Daten aber so groß das sie langsam unübersichtlich werden. Ich weiß es gibt einen Datenpointer, aber ich weiß nicht wie ich diesen richtig ansprechen soll. Kann mir da bitte einer helfen Danke schon im voraus für die hilfe
Hallo Ulrich, ich wollte es in Assembler versuchen. Ein Kollege der mir dabei ein wenig hilft wollte dies in C programmieren. Wenn du eine Idee hast. Ich nehme alles. Danke für deine schnelle ANtwort
http://www.mikrocontroller.net/forum/read-1-63156.html#new Schau dir den Beitrag von crazy_horse (hätt fast crazy_hores geschrieben...:]) an.
Warst du schon auf dieser Homepage? http://www.avr-asm-tutorial.net Da war das so gut für mich erklärt das ich damit mir problemlos bereits einen Rinpuffer bauen konnte.
Hallo Markus_8051, um deine Frage zu beantworten ich benutze den AT89S8252. Ich benutze diesen, da ELEKTOR dazu ein Entwicklerboard herausgebracht hat. Hallo TheForce, Danke für den link, aber diese Befehle sagen mir überhaupt nichts. Wie ein paar Zeile höher schon gesagt benutze ich den AT89S8252 von Atmel und dieser hat ganz andere Befehle.
Hallo Ulrich, habe mir gerade deinen Link angeschaut. Sieht ja alles gut erklärt aus, aber dies war eine Seite für die µC der Serie AT90XXXX und ich weiß nicht inwieweit die zu meinem kompatibel sind, da die ganzen Befehle komplett anders sind als meine die ich jetzt benutze.
Der 89S8252 hat genau einen 16-Bit-Pointer, den DPTR, aufgeteilt in DPL und DPH. Wenn die Daten ab "Basisadresse" im Code-Segment stehen und Null-terminiert sind, sähe ein Programm dazu etwa so aus: (Stehen die Daten im externen RAM, mußt Du statt MOVC einen MOVX-Befehl verwenden. Wenn Du über Datenpointer auf das interne RAM zugreifen möchtest, kannst du hier Index-Adressierung über die Register realisieren.) MOV dptr, Basisadresse CLR r0 loop: MOV a,r0 MOVC a,@a+dptr JZ ende ; wenn Null gelesen, Ende MOV Display_Data_Register,a INC r0 JMP loop ende: Gruß, Markus_8051
Hallo Markus_8051, Danke das sieht auf den ersten Blick sehr gut aus und die Befehle sagen mir auch was. Ich werd das heut abend gleich mal ausprobieren. Vielen Dank
Hallo Markus_8051, hab noch ne kurze Frage: Welches Assembler compilierprogramm nutzt du eigentlich? Meines heißt TASM und ist ein weinig umständlich in der Graphischen Umgebung.
@Matthias: Ich benutze den Assembler von Keil. Na, dann viel Erfolg beim ausprobieren, Markus_8051
Hallo Markus_8051, die Procedure die du mir gegeben hast, funktioniert soweit das mein Compiler nicht gemeckert hat, aber es ist doch nur dazu da die Daten aus dem Speicher auszulesen, aber wie bekomme ich die Daten erstmal dahin?
Na, ich weiß nicht, was das für Daten sind, die Du da ausgeben möchtest. Sind es feste Daten (z.B. Texte, Bilder, etc. die beim compilieren schon feststehen) oder Daten, die erst zur Laufzeit berechnet werden? Feste Daten würde ich halt direkt im Code-Segment ablegen. Wenn die Daten erst berechnet werden, gehören sie in externe RAM. Dazu gibt es - wie geschrieben - den MOVX Befehl. Dabei kann man "@A+DPTR" sowohl als Quelle, als auch als Ziel der Operation angeben. Also, wo kommen die Daten bei Dir her? Gemäß Deinem ersten Posting schienst Du Schwierigkeiten mit der Benutzung von Datenpointern und Index-Adressierung zu haben. Das scheint es aber noch nicht so ganz getroffen zu haben. Also beschreib Dein Problem mal etwas genauer, sonst kann Dir hier keiner helfen. Markus_8051
Ok Markus_8051, so sieht meine Matrix aus. 0=LEDaus -=LEDan 000---00 P1.0 //Dies soll z.B. den Buchstaben "A" darstellen. 00-000-0 P1.1 //Der Port 3 dient nur zum durchschalten der Spalten. 00-000-0 P1.2 //An Port 1 gebe ich nun immer ein Hex-Wert an 00-000-0 P1.3 //z.B.011h, der beim Beispiel Spalte P3.3 und P3.4 00-----0 P1.4 //beinhaltet. Diese Hexwerte würde ich am liebsten 00-000-0 P1.5 //vorher irgendwie in den internen Speicher schreiben. 00-000-0 P1.6 //Dann im Programm ihm eine Adresse geben der dann halt 00-000-0 P1.7 //8 Hexwerte nacheinander ausliest und auf Port 1 gibt. //Dies wollte ich nun mit dem Datenpointer realisieren, PPPPPPPP //aber ich weiß nicht genau wie. Per Hand die ganzen 33333333 //Werte angeben funktioniert bis auf meine ........ //Warteschleife so wie ich es haben möchte, aber bei 01234567 //der große der Daten die immer mehr Zeichen mit sich bringen wird es sehr unübersichtlich. Ich hoffe diese Erklärung reicht dir Markus bzw. den anderen guten Menschen die mir Helfen, wenn nicht sagt es. Dies ist nur die Kurzfassung.
Dafür kennt der Assembler die db-Anweisung. Damit kannst Du Daten im Code ablegen. Das könnte dann so aussehen: char_tab: char_A: db 0,0,254,17,17,17,254,0 char_B: db ...... . . . (Solche Tabellen stehen üblicherweise am Ende des Programm-Codes) mit MOV dptr,#char_A kannst Du nun den Datenpointer auf die richtige Start-Adresse setzen. Da alle Buchstaben gleich lang sind (also 8 Bytes) kannst Du dir auch eine Formel basteln, mit der Du aus dem ASCII-Code den richtigen Startwert in der gesamten Tabelle (char_tab) berechnen kannst. So kannst Du eine Prozedur schreiben, der Du nur das ASCII-Zeichen übergibst, und die es dann auf der LED-Matrix anzeigt. Viel Erfolg, Markus_8051
Mensch Markus das sieht ja richtig toll aus genau soetwas habe ich mir gedacht, aber davon habe ich ja noch nie etwas gesehen mit diesen db Anweisungen. Wird nachhergleich mal ausprobiert. herzlichen Dank
Hallo Markus_8051 ich habe deinen Vorschlag mal ausprobiert, aber mein Compiler versteht irgendwie nicht diese "db" Anweisung. Sobald ich mir deinen Compiler von Keil besorgt habe werde ich es nochmal ausprobieren.
Setz mal einen '.' davor char_A: .db 0,0,254,17,17,17,254,0 Im Zweifel: Mal in die Doku des Assemblers schauen. Solche Definitionen kann jeder Assembler in der einen oder anderen Form.
Hallo Karl Heinz, Danke für diesen Vorschlag. Jetzt funzt das alles wie von Markus_8051 beschrieben.
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.