Archiv verlassen und diese Seite im Standarddesign anzeigen : String-definition
Import-Script
06.09.2003, 00:04
Hallo! <BR> <BR>Ich hab da mal eine typische Anfängerfrage. <BR>Ich will jetzt etwas mit LCDs herumspielen, und habe mir von <a href="http://www.erikbuchmann.de" target=_top>www.erikbuchmann.de</a> die lcd.inc Datei heruntergeladen. <BR>Gane Texte ausgeben ist kein Problem, aber wie kann ich zu Beispiel einen Aufwärtszähler realisieren? <BR>Das Problem ist, daß man entweder einen Datenstrring aus dem Datenpointer oder ein Character aus ACC darstellen kann, aber wie kann ich in DB incrementieren? <BR> <BR>Soll nur zu Lernzwecken dienen, ist kein Projekt. <BR> <BR>mfg <BR>hannes
Import-Script
06.09.2003, 23:59
Hi, <BR> <BR>Deinen Messwert musst Du in einen teilstring umwandeln. Also eine Speicherstelle für Einer, eine für Zehner, usw. (Aufeinanderfolgend!) Addierst Du zu den zellen noch den ASCII-Wert für '0', stehen die Zahlen als ASCII-String in den Zellen. Dann brauchst Du diesen String nur normal auszugeben, z.B. durch 3 Strings hintereinander ausgeben: <BR> <BR>String 1 = "Messwert: " <BR>String 2 enthält Deine Zahlen, z.B. "123" <BR>String 3 = " dB" <BR> <BR>Dann würde "Messwert: 123 dB" ausgegeben. <BR> <BR>gruß <BR>Elmar
Import-Script
07.09.2003, 01:06
Danke <BR> <BR>Prinzipiell ist mir das jetzt ganz klar, und natürlich hab ich das gleich mal ausprobiert, nur hab ich da eventuell was falsch verstanden. <BR> <BR>Wenn ich zb. "5" ausgeben will, muß ich 48 dazuaddieren, eben ASCII für 0, gibt 53. <BR>0 dient ja nur zur "efinition"eines Strings wenn ich mich nicht täusche. <BR> <BR>Also müßte das doch so eine 5 auf dem Display ausgeben: <BR> <BR> <BR>call clear_display <BR>mov DPTR,#53 ;Es wird Wert aus DPTR aufs Display gechrieben <BR>call LCD_PRINTS ;String aufs Display schreiben <BR> <BR>Da kommen aber die wildesten Zeichen. <BR>Was is denn da schon wieder falsch? <BR> <BR>mfg <BR>hannes
Import-Script
07.09.2003, 11:33
Hi, <BR> <BR>ein String braucht noch einen Abschluß, damit die Routine weiss, wann Ende ist. Vermutlich gibt er nach der 5 noch viele weitere Zeichen aus dem Ram aus, bis zufällig das Stringendezeichen kommt. <BR> <BR>Also musst Du eine zusammenhängende Kette von Speicherzellen mit Deinen Werten beschreiben, die letzte Zelle sollte das Stringendezeichen enthalten (Wahrscheinlich '0') und der DPTR auf das erste Element der Kette zeigen. Dann sollte die Funktion aber funktionieren. Denk auch dran, dass das Display vor der ersten AUsgabe initialisiert werden muss. Da ist bestimmt noch eine Routine da, die das macht. Die musst Du irgendwo am Programmanfang einmalig aufrufen. <BR> <BR>Gruß <BR>Elmar
Import-Script
07.09.2003, 23:19
Hallo! <BR> <BR>Danke, jetzt bin ich wieder ein Stückchen näher, nur leider ist mir das noch nicht ganz klar, oder besser gesagt es will noch noch nicht <BR>so ganz. <BR> <BR>Angenommen ich will einen einfachen Aufwärtszähler, angenommen für Ladungsmenge, <BR> <BR>Er soll von 0 bis ca. 3000 zählen können. <BR>Zuerst nehme Ich R0-R3 (Stellen des Zählerstandes, gibts da noch was anderes wo man "zwischenspeichern kann?) <BR>Und angenommen am Display soll dan stehen "Kapazität: xxxx mAH" dann könnte der Code doch folgendermaßen aussehen <BR> <BR> <BR> <BR>. <BR>. <BR>call lcd_init <BR>call lcd_clear <BR> <BR>mov DPTR,#Kapazität <BR>call LCD_prints ;Gibt Text aus <BR>mov DPTR,#Tausender <BR>call LCD_prints ;Gibt Tausenderstelle aus <BR>mov DPTR,#Hunderter <BR>call LCD_prints ;Gibt Hundertestelle aus <BR>mov DPTR,#Zehner <BR>call LCD_prints ;Gibt Zehnerstelle aus <BR>mov DPTR,#Einer <BR>call LCD_prints ;Gibt Einerstelle aus <BR>mov DPTR,#mah <BR>call LCD_prints ;Gibt Text aus <BR> <BR> <BR> <BR>Kapazität: db "Kapazität:",0 <BR>Tausender: ???db R0,0 GEHT NICHT!! <BR>Hunderter: ??? <BR>Zehner: ??? <BR>Einer: ??? <BR>mah: db "mAH",0 <BR> <BR>END <BR> <BR>Wie kann ich jetz die Stellen ausgeben? R0-R3 kann man nicht in db schreiben, <BR>es hat nur ACC und B funktioniert, und das geht ja nicht, da ja LCD_prints darauf zugreift. <BR> <BR> <BR> <BR>Tut mir leid, ich muß euch da leider quälen, aber ich will daß das einfach mal funktioniert. <BR> <BR>mfg <BR>hannes
Import-Script
08.09.2003, 11:35
Hi, <BR> <BR>Du hast an die 100 freie Speicherzellen. Da sollte es doch nicht schwehr fallen, ein paar zusammenhängende zu finden, die man dann benutzen kann. Den DPTR nur noch auf die Anfangsadresse setzen und gut. <BR> <BR>Also: <BR> <BR><center><table border=1><tr><td><b>A0</TD><TD>A1</TD><TD>A2</TD><TD>A3</TD><TD>A4</TD><TD>A4</TD><TD>A6</TD><TD>A7</TD><TD>A8</TD><TD>A9</TD><TD>AA</TD><TD>AB</TD><TD>AC</TD><TD>AD</TD><TD>AE</TD><TD>AF</b> </TD></TR><TR><TD>W</TD><TD>E</TD><TD>R</TD><TD>T</TD><TD>:</TD><TD> </TD><TD>1</TD><TD>2</TD><TD>3</TD><TD> </TD><TD>Ä</TD><TD>p</TD><TD>f</TD><TD>e</TD><TD>l</TD><TD>\0</td></tr></table></center> <BR> <BR>So schreibst Du den Ausgabestring in die Speicherzellen, biegst den DPTR auf die Anfangsadresse (Hier: A0) und lässt das von der Routine ausgeben. Die Ziffern 123 kannst Du dann immer passend mit Deinem Messwert überschreiben. <BR> <BR>Gruß <BR>Elmar
Import-Script
08.09.2003, 12:01
Mit DB bist Du auf dem Holzweg ! <BR>Damit kann man nur konstante Texte ausgeben, d.h. die müssen schon zur Assemblierzeit feststehen. <BR> <BR>Um Variablen auszugeben brauchst Du entsprechende Umwandlungsroutinen, z.B. nach der Subtraktionsmethode oder mit der Division mit Rest. <BR> <BR>Dazu findest Du haufenweise Beispiele im Netz. <BR> <BR> <BR>Peter <BR>
Import-Script
09.09.2003, 22:55
Hallo <BR> <BR>Leider bin ichs nochmal, aber das verdammte Ding will nicht so wie ich das will. <BR> <BR>main: <BR>acall LCD_clear <BR>mov 0A1H,#49;1 ausgeben <BR>mov 0A2H,#50;2 ausgeben <BR>mov 0A3H,#48;0 soll Stringende definieren <BR>mov DPTR,#0A1H; Satrtadresse für String <BR>call lcd_prints; ausgeben <BR> <BR> <BR>So sollte es doch stimmen oder? <BR>Es kommen trotzdem nur wilde Zeichen. <BR>Was hab ich denn da schon wieder falsch gemacht? <BR>Ich geb ja zu, daß ich nicht das große Programmiergenie bin! <BR> <BR>mfg <BR>hannes <BR>
Import-Script
09.09.2003, 23:29
@Johann, <BR> <BR>so gehts aus vielen Gründen nicht. <BR> <BR>Die Adressen 080h ... 0FFh sind ja SFRs, die kannst Du nicht als RAM nehmen. Du must schon unter 80h bleiben bzw. einen 8052 nehmen und dann aber mit "mov @R0, xxx" drauf zugreifen. <BR> <BR>Also so gehts: <BR> <BR>mov 30h, '1' <BR>mov 31h, '2' <BR>mov 32h, '0' <BR>mov r0, #30h <BR>call lcd_print_ram <BR> <BR>Und Deine Printroutine muß in diesem Fall per "mov a,@r0" die Bytes abholen und ausgeben. <BR> <BR> <BR>Peter <BR>
Import-Script
09.09.2003, 23:31
Muß natürlich heißen: <BR> <BR>mov 30h, #'1' <BR>mov 31h, #'2' <BR>mov 32h, #'0' <BR>mov r0, #30h <BR>call lcd_print_ram <BR> <BR> <BR>Peter <BR>
Import-Script
10.09.2003, 16:12
@Peter <BR> <BR>Danke mal, aber wie immer will das Ding noch immer nicht. <BR>Laut Progstudio und Elmar(falls ich ihn richtig verstanden habe) sollte es aber schon möglich sein auf 0A0H-0FFH als RAM zuzugreifen. <BR>Na egal, das hab ich auch unter 080H probiert und es schreibt immer noch nichts sinnvolles raus. <BR> <BR>lcd_msg: db "Text",0 <BR>start: <BR> <BR>; die SFR's initialisieren <BR> mov SP, #20h <BR>; LC-Display initialisieren <BR> call LCD_init <BR> mov DPTR,#lcd_msg <BR> call LCD_prints <BR> <BR> <BR>Diese Routine funktioniert <BR> <BR> <BR> <BR>; Hauptprogramm <BR>;--------------------------------------------------------------- <BR>main: <BR> <BR>mov 050H,#100 ;d <BR>mov 051H,#101 ;e <BR>mov 052H,#102 ;f <BR>mov 052H,#0 <BR>mov DPTR,#050H <BR>call LCD_prints <BR> <BR> <BR>Nur diese Routine funktioniert nicht mehr, <BR>obwohl ich habe ja unter 080H die Werte reingeschrieben und mit 0 beendet. <BR>Ich seh da beim besten Willen keinen UNterschied mehr zu der vorhergehenden Routine. <BR> <BR>Naja. <BR> <BR>mfg <BR>hannes <BR> <BR>
Import-Script
10.09.2003, 16:55
Doch nicht mit DPTR !!!!!!!!!!!!!!!!!!!!! <BR> <BR>Und Deine Printroutine muß in diesem Fall per "mov a,@r0" die Bytes abholen und ausgeben ! <BR> <BR>Mit DPTR geht doch nur Code (MOVC) oder externer Speicher (MOVX). <BR> <BR> <BR>Peter <BR>
Import-Script
10.09.2003, 17:20
Hi, <BR> <BR>ich hatte da Ram mit Rom verwechselt. Der DPTR dient dazu, Daten aus dem 16-Bit adressiertem Rom zu holen. Die Ausgaberoutine scheint daher nur für Statische Texte geeignet zu sein. Du schreibst ins RAM und holst die Daten aus dem ROM. <BR> <BR>Abhilfe brächte, neben den statischen Texten auch noch jede Ziffer im ROM als Tabelle abzulegen. Dann kannst Du die Ziffern einzelnd ausgeben, indem Du den DPTR-Zeiger dann auf die richtige Ziffer zeigen lässt. <BR> <BR>Gruß <BR>Elmar
Import-Script
10.09.2003, 17:44
@Elmar, <BR> <BR>mit dem ASCII-Code auf eine Tabelle im Flash zu zeigen, in der dann der gleiche ASCII-Code steht, wer macht den sowas ? <BR> <BR>Das macht also nur Sinn, wenn z.B. in der Tabelle das Bitmuster für eine Punktmatrix ist. <BR>Ansonsten kannst Du doch gleich den ASCII-Code ausgeben. <BR> <BR> <BR>@Hannes, <BR> <BR>sieh Dir nochmal in aller Ruhe die verschiedenen Speicherbereiche des 8051 an und mit welchen Befehlen darauf zugegriffen werden kann. <BR> <BR>Und Du kommst nicht umhin, Deine Ausgaberoutine zu verstehen und dann entsprechend zu modifizieren. <BR> <BR> <BR>Peter <BR>
Import-Script
10.09.2003, 22:30
Danke für die große Mühe die Ihr euch da macht mir das zu erklären. <BR> <BR>Eigtentlich sollte man ja wohl mit etwas leichterem anfangen zu programmieren, und nicht gleich ein LCD. <BR>Aber es ist doch so schön! <BR>Also paßt die Ausgaberoutine nicht, und Elmar hat sich da auch vertan, also werd ich mich noch ein bischen spielen. <BR>Wenns geklappt hat werd ich Euch benachrichtigen. <BR> <BR>Danke nochmals <BR> <BR>mfg <BR>hannes
Import-Script
12.09.2003, 19:09
Tag <BR> <BR>Endlich funktioniert das so wie ich mir das vorstelle mit dem Display. <BR> <BR>Aber eine kleine Frage hätt ich da noch bitte. <BR> <BR>Ich hab einen einfachen Aufwärtszähler programmiert, der auch funktioniert. <BR>Nur wenn der 45 hinaufgezählt hat, fängt der Controller komplett von vorne an. <BR>Auch wenn man den Startwert nicht auf 0 setzt sondern zB 30, tritt das Problem auf, also mit dem absoluten Zählerstand dürfte das nichts zu tun haben. <BR> <BR>Gibts da irgendeine Begrenzung, wie weit der eine Schleife (Zähler) ausführen kann? <BR> <BR>bei den 45 wird auch noch die Ausgaberoutine aufgerufen, also es sind wesentlich mehr Operationen als 45. <BR> <BR>mfg <BR>hannes <BR>
Import-Script
12.09.2003, 20:02
Hi, <BR> <BR>da kann man ohne Programmcode nur raten (Poste mal den Teil mit der Schleife) <BR> <BR>Mögliche Ursachen: <BR>- Stack läuft über (bei Stackoperationen in der Schleife) <BR>- Der Programmcounter wird geändert (Aufpassen, welche Speicherzellen verwendet wurden (über 128dez ist gefährlich) <BR>- Bei relativen Sprüngen ist die Sprungweite zu hoch <BR>- Eine Interruptroutine im Hintergrund verändert etwas oder wird durch Zugriffe vom Hauptprogramm gestört <BR>- ... <BR> <BR>Gruß <BR>Elmar
Import-Script
12.09.2003, 23:07
Hallo <BR> <BR>Hier ist mal der Programmcode. <BR>Ich weiß, er ist sicherlich überhaupt nicht optimal geschrieben, aber funktionieren sollt es ja trotzdem. <BR> <BR>Sobald er bei 45 angelangt ist, beginnt das Programm komplett von vorne. <BR> <BR> <BR> <BR>main: <BR> <BR>call ws2;wartet 1000ms <BR> <BR>Einer data 010H;Speicherplatz definieren <BR>Zehner data 011H <BR>hunderter data 012H <BR>Tausender data 013H <BR>Zehntausender data 014H <BR> <BR>mov einer,#48;Alle Stellen auf 0 setzen <BR>mov zehner,#48 <BR>mov hunderter,#48 <BR>mov tausender,#48 <BR>mov zehntausender,#48 <BR> <BR>Ein:;1 Stelle raufzählen <BR>inc Einer <BR>mov A,Einer;Wenn größer als 10 dann zehner aufrufen <BR>clr c <BR>subb A,#58 <BR>jc Ausgabe <BR> <BR>Zehn:;wie 1 Stelle für 10er <BR>mov Einer,#48 <BR>inc Zehner <BR>mov A,Zehner <BR>clr c <BR>subb A,#58 <BR>jc Ausgabe <BR> <BR>Hundert: <BR>mov Einer,#48 <BR>mov Zehner,#48 <BR>inc Hunderter <BR>mov A,Hunderter <BR>clr c <BR>subb A,#58 <BR>jc Ausgabe <BR> <BR>Tausend: <BR>mov Einer,#48 <BR>mov Zehner,#48 <BR>mov Hunderter,#48 <BR>inc Tausender <BR>mov A,Tausender <BR>clr c <BR>subb A,#58 <BR>jc Ausgabe <BR> <BR>Zehntausend: <BR>mov Einer,#48 <BR>mov Zehner,#48 <BR>mov Hunderter,#48 <BR>mov Tausender,#48 <BR>inc zehntausender <BR>mov A,zehntausender <BR>clr c <BR>subb A,#58 <BR>jc Ausgabe <BR> <BR>Ueberlauf: <BR>mov Einer,#48 <BR>mov Zehner,#48 <BR>mov Hunderter,#48 <BR>mov Tausender,#48 <BR>mov zehntausender,#48 <BR>jmp ein <BR> <BR>;mov 052H,#0 <BR>;mov DPTR,#050H <BR>;call LCD_prints <BR> <BR>;jmp main <BR> <BR> <BR>Ausgabe:;Werte auf LCD schreiben <BR>call lcd_clear <BR>mov DPTR,#Kapazitaet <BR>call LCD_prints <BR>mov A,Zehntausender <BR>call lcd_printc <BR>mov A,tausender <BR>call lcd_printc <BR>mov A,hunderter <BR>call lcd_printc <BR>mov A,Zehner <BR>call lcd_printc <BR>mov A,Einer <BR>call lcd_printc <BR>mov DPTR,#mah <BR>call lcd_prints <BR>cpl p3.0 <BR>call ws1 <BR>call Ein <BR> <BR> <BR>Prinzip ist hoffentlich ersichtlich. <BR>Sobald Eine Stelle größer als 9 ist, wird diese auf 0 gesetzt und nächste um 1 erhöht, um dann ausgegeben zu werden. <BR> <BR>mfg <BR>hannes
Import-Script
13.09.2003, 02:12
wie wärs mit sowas ? <BR> <BR> MOV R5, #0 ' 1er und 10er <BR> MOV R6, #0 ' 100er und 1000er <BR> MOV R7, #0 ' 10000er und 100000er <BR> <BR>loop: INC R5 <BR> CJNE R5, #100, loop2 <BR> MOV R5, #0 <BR> INC R6 <BR> CJNE R6, #100, loop2 <BR> MOV R6, #0 <BR> INC R7 <BR> <BR>loop2: MOV A, R7 <BR> MOV B, #10 <BR> DIV AB <BR> ORL A, #30H ' 100000er <BR> call lcd_printc <BR> MOV A, B <BR> ORL A, #30H ' 10000er <BR> call lcd_printc <BR> <BR> MOV A, R6 <BR> MOV B, #10 <BR> DIV AB <BR> ORL A, #30H ' 1000er <BR> call lcd_printc <BR> MOV A, B <BR> ORL A, #30H ' 100er <BR> call lcd_printc <BR> <BR> MOV A, R5 <BR> MOV B, #10 <BR> DIV AB <BR> ORL A, #30H ' 10er <BR> call lcd_printc <BR> MOV A, B <BR> ORL A, #30H ' 1er <BR> call lcd_printc <BR> <BR> SJMP loop <BR> <BR>Grüessli <BR>Thedy <BR>
Import-Script
13.09.2003, 08:24
hi Johann, <BR> <BR>setze deinen stackpointer etwas hoeher.. <BR>zb: mov sp,#50h <BR> <BR>...und warum steckst du dein programm nicht in einen simulator? <BR>da siehst du sofort wo es klemmt <BR>du moechtest ja schliesslich etwas dabei lernen.. <BR>..nicht raten <BR>gruss <BR>edgar
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.