Recht komfartabel und eigentlich nicht zu gross mit komma steuerung mit 0 Stellenunterdrückung und 8bis32 BIT fähig have a lot of fun!
Die LCD Steuerung die ich weiter oben beschreibe pass übrigens zu dem Programm
Hallo, ich habe dein Programm ausprobiert uns es funktioniert wunderbar. Nur gibt er mir, wenn ich eine 0 ausgeben moechte (NKS=2, Stellen =5, kein Vorzeichen) nichts richtiges aus und haengt sich auf. Ist das bei dir auch - oder nur bei mir. Ich habe die Programme noch einmal abgeglichen und habe keinen Unterschied gefunden. Danke und ciao, Thomas H.
Anbei ein Beispiel für 32 Bit und auf Geschwindigkeit optimiert. Peter
Sorry, da hat sich beim Erweitern von 16 auf 32 Bit doch noch ein Fehler eingeschlichen. Jetzt sollte es hinhauen. Peter
Genau so etwas bräuchte ich für eines meiner Projekte, jedoch nicht so gross. Wie kann ich diesen Code auf 16 bit "stutzen"? Was muss ich beachten?
Also das ist die getunte Subtrahiermethode. Die langsame Subtrahiermethode geht so: Ich prüfe, ob ich z.B. 1000000000 abziehen kann, wenn ja dann mache ich es und zähle mit wie oft ich das gemacht habe. Wenn nein, dann mache ich das gleiche mit 100000000 usw. bis nur noch die Einer übrig sind. Die getunte Methode zieht einfach ab und merkt aber erst danach, ups, das war einer zuviel. Wenn ich z.B. von 80 die 100 abziehe, dann kommt -20 raus. Im nächsten Durchlauf addiere ich also einfach, bis es wieder zuviel war usw. immer im Wechsel. Damit ich dabei aber auf die 8 komme zähle ich bei der Addition von 10 runter. Der Trick dabei ist der, daß das Carry-bit gesetzt wird, wenn man zuviel subtrahiert oder addiert hat, d.h. man spart sich den extra Vergleich. Da der AVR aber keine Konstanten addieren kann, subtrahiert man dafür den negativen Wert (X + Y = X - -Y). Dabei dreht sich jedoch die Bedeutung des Carry-Bits um, d.h. es ist dann nicht gesetzt, wenn ein Überlauf stattfindet. Wenn das jetzt zu unverständlich war, frag einfach nochmal konkret. Ansonsten sollte es einfach sein, die nötigen Änderungen für 24 oder 16 Bit zu machen. Peter
Hallo! Habe es nun mal versucht, es scheint einigermassen zu klappen, jedoch kommt bei der letzten Ziffer anstatt einer Zahl ein Zeichen raus. Und ich erhalte vom ADC immer den Wert 128? (?=komisches Zeichen). Ist mein ADC kaputt oder liegts am Code, könntest du iohn mal kurz unter die Lupe nehmen? Ich wäre echt froh!
Hallo Peter! Ich deine Routine ausprobiert und funktioniert fast. Anbei noch mal Korrekturen ab Marke _bcd7 und ne angepasste Routine für BCD16b. Andreas
@Andreas, ich gestehe, ich hab die 32-Bit Routine selber noch nicht benutzt. Aber wenn man das Prinzip verstanden hat, findet man schließlich alle Schusselfehler. Peter
Hallo, was gibt es denn noch für Möglichkeiten eine binäre Zahl umzuwandeln (um sie dann z.B. per LCD Modul auszugeben)? Man könnte ja auch die Zahl jeweils durch 10 dividieren und jeweils den Rest betrachten. Zum Beisliel 251. 251 / 10 = 25 Rest 1 25 / 10 = 2 Rest 5 2 / 10 = 0 Rest 2 Danke Daniel
ich habe hier 2 Versionen: 16bit nach ascii, diese enthält eine kleine Rechenungenauigkeit, wobei ich hoffe, daß das ausreicht. mul16 ist ein Macro in der Codesammlung. 8 bit nach ascii, diese müßte noch auf 16 oder 32 bit erweitert werden. Fehler bitte nicht erst in einigen Jahren melden, sondern etwas früher. ;x * 6553 = y (16bit * 16bit) ; y/65536= y (vordere 16 bit, hinten abschneiden) y=ergebnis ; y * 10=z ; x-z= Rest bin16toascii1: ; y = x:10 Rest push r20 ldi r23,0x19 ldi r22,0x99 ; r23:r22=6553 mul16 r21,r20,r23,r22 ; r23:r22= ergebnis y ldi r20,10 mul r23,r20 mov r16,r1 mul r22,r20 add r16,r0 ;r16=y*10 pop r20 sub r20,r16 ;r22=rest add r20,'0' ;rest>>Ascii st z+,r20 ;Ascii speichern ret bin16toascii: ; bin=r21:r20 ldi zl,low (ascii) ldi zh,high(ascii) rcall bin16toascii1 rcall bin16toascii1 rcall bin16toascii1 rcall bin16toascii1 rcall bin16toascii1 ret ; ascii=RAM (ascii) bin8toascii1: ; bin=r20 mov r16,r20 lsr r16 lsr r16 mov r17,r16 lsr r16 lsr r16 sub r17,r16 lsr r17 ; r17=r20:10 ldi r16,10 mul r16,r17 sub r20,r0 ; r20=rest add r20,'0' ;rest>>Ascii st z+,r20 ;Ascii speichern mov r20,r17 ret bin8toascii: ; bin=r21:r20 ldi zl,low (ascii) ldi zh,high(ascii) rcall bin8toascii1 rcall bin8toascii1 rcall bin8toascii1 ret ; ascii=RAM (ascii)
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.