Hallo, Hab schon Wochen probiert, nun muß ich doch mal hier fragen. Ich möchte ein Register (was mal später ein Timer werden soll) dreistellig auf einem LCD-Display ausgeben. Ich habe mir aus anderen Veröffentlichungen Anregungen geholt und versucht, das für meinen Zweck umzuschreiben. Zu Testzwecken ist mein Register im Beispielprogramm nur 0. Mein Gedankengang: Ich ziehe vom Inhalt des Registers 100(dez) ab und prüfe, ob das Ergebnis negativ wurde (C-Flag). Wenn nicht, hochzählen der Hunderterstelle um 1. Wenn es negativ war, wieder 100 zum Register addieren, um den alten, richtigen Wert zu haben. Das gleiche mit der Zehnerstelle. Der verbleibende Rest im Register sollte dann die Einerstelle sein. Zu den Hunderter, Zehner und Einerstellen jeweils 030hex addieren, um den ASCII-Wert zu erhalten. Diese Stellen dann auf dem Display ausgeben. Bin für Hinweise sehr dankbar! Tschööö Sven
Hab´s jetzt nicht alles so genau durchgesehen aber addlw D'100' addiert 100 zu w und schreibt nicht 100 in w. Bei den Zehnern ist es das Gleiche. Steffen
Hallo Steffen, stimmt.. aber ich hatte vorher die Register ausdrücklich gelöscht, daher passt es ;-) Sven
ist zwar c un avr aber vieleicht hilfte meine function void USART_sendhex(u08 data){ u08 data2; data2 = (data & 0xf0) >>4; if(data2 > 9) data2 += '7'; else data2 += '0'; USART_send(data2); data2 = (data & 0xf); if(data2 > 9) data2 += '7'; else data2 += '0'; USART_send(data2); }; john
Hallo John, So richtig kann ich damit leider nix anfangen, da ich mich noch nicht mit C beschäftigt habe. Aber trotzdem vielen Dank!! Sven
"Bin für Hinweise sehr dankbar!" Du hast ja garnicht geschrieben, ob es läuft und wenn nicht, welchen Fehler Du siehst. Wenn es aber nur ums optimieren geht, da kann man noch einiges machen. Anbei mal ein optimierter Code für den 8051 (beim PIC kenne ich mich nicht so aus). Peter
Steffen hatte doch was wahres gesagt :-) Ich habe das addlw durch movlw ersetzt, das war auf jeden Fall EIN Fehler, aber wohl leider nicht der einzige. Mit meinem Testregister "Timer" gleich 0 sollte auf dem LCD eigentlich "000" angezeigt werden. Es erscheint aber 10x (statt x ein kryptisches Zeichen). Zur Übersichtlichkeit habe ich das geänderte File nochmal angehangen. Sven
Hallo Sven Dein Problem sollte doch sehr gut im Simulator lösbar sein. Schritt für Schritt durchgehen und die Register beobachten, was abgeht. Timer = 0 ist zum debuggen erstmal ein schlechter Wert, meiner Meinung nach. Teste das im Simulator doch mal mit Timer = 125 oder so. MFG Dieter
Hallo Sven ändere doch mal in der Subroutine HexDec die beiden Befehle btfss Status,C in btfsc Status,C mfg HG
Hab ich gerade mal schnell probiert, nun kommen 3 Nullen wie gewünscht, sieht ja spitze aus!!! Ich probier das später mal noch, indem ich das Register hochzählen lasse um andere Zahlen anzuzeigen. Vielen Dank erstmal ;-) Sven
So, ich hab das mal probiert, indem ich das Register habe hochzählen lassen. Umrechnung und Anzeige klappt. Ich bin davon ausgegangen, daß bei negativem Ergebnis das C-Flag gesetzt wird, das war der Aufhänger. Warum gibts das Datenblatt auch nicht in Deutsch g Vielen Dank allen für die Hilfen!! Sven
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.