Hallo! Manchmal möchte man eine 10bittige Zahl ins BCD format umwandeln (z.B. vom AD Wandler). hier mein code (musste leider ins statement, weil upload nicht geht). Ich hab in Englisch kommentiert... aber das is ja kein problem. .include "../avr/includes/4433def.inc" .DEVICE at90s4433 .def mpr = r16 .def numberL = XL ;number stores the hex value .def numberH = XH .def bcd1000 = r1 ;these registers will contain .def bcd100 = r2 ;the binary coded decimals. .def bcd10 = r3 .def bcd1 = r4 .org 0x000; reset: ;set up stack ldi r16,RAMEND out SPL, r16 ;SPL=Stack Pointer Low ; we don't need to set SPH, ; because 4433 only has 128bytes of sram ldi mpr,0x00 mov r1,mpr mov r2,mpr mov r3,mpr mov r4,mpr ldi numberL, LOW(1012) ldi numberH, HIGH(1012) rcall c10bit2bcd end: rjmp end ;********************************** ;Convert 8bit number in mpr to bcd ;bcd is stored in 3 registers ;this will destroy the number in mpr ;*********************************** c8bit2bcd: gt100: cpi mpr,100 brlo gt10 ;jump if less than 100 subi mpr,100 inc bcd100 rjmp gt100; gt10: cpi mpr,10 brlo lt10 ;jump if less than 10 subi mpr,10 inc bcd10 rjmp gt10 lt10: mov bcd1,mpr ;the number is now less than 10 ret ; Add a number to BCDn, with carry ; this macro could be made a routine ; if we use indirect register adressing (0x00-0x1f) .MACRO addtobcd ldi mpr,@1 add bcd@0,mpr mov mpr,bcd@0 ;if bcd<10 then break cpi mpr,10 brlo lt10_m mov mpr,bcd@0 ;bcd -= 10 subi mpr,10 mov bcd@0,mpr inc bcd@00 lt10_m: .ENDMACRO c10bit2bcd: mov mpr,numberL ;convert the lower byte to bcd rcall c8bit2bcd; clc ;clear the carry lsr numberH ;LSB to carry ;if Carry set, add 256 to the number brcc dont_add_256 addtobcd 1,6 addtobcd 10,5 addtobcd 100,2 dont_add_256: clc ;clear the carry lsr numberH ;LSB to carry ;if Carry set, add 512 to the number brcc dont_add_512 addtobcd 1,2 addtobcd 10,1 addtobcd 100,5 dont_add_512: ret
achja: wenn das jemand einfacher hat, immer her damit! :-) hab vergessen zu erwähnen, dass die BCDs dann noch ungepackt sind (d.h. eine Ziffer pro byte).
Hallo! Ich versuche eine 8 Bit binär Zahl vom ADU in ein ASCII Zeichen umzuwandeln. Ich verwende diesen Teil des Code's: ;********************************** ;Convert 8bit number in mpr to bcd ;bcd is stored in 3 registers ;this will destroy the number in mpr ;*********************************** c8bit2bcd: gt100: cpi mpr,100 brlo gt10 ;jump if less than 100 subi mpr,100 inc bcd100 rjmp gt100; gt10: cpi mpr,10 brlo lt10 ;jump if less than 10 subi mpr,10 inc bcd10 rjmp gt10 lt10: mov bcd1,mpr ;the number is now less than 10 ret und addiere danach zu bcd100, bcd10 und bcd1 48. es funktioniert aber nur die Einerstelle. Bei der 10 u.100 Stelle werden nur Sonderzeichen dargestellt. Woran könnte das liegen? Danke im voraus Grüsse Karl
Ich finds schon mal gut, dass da einige Leute sind, die sich anscheinend mit ASM für Atmels auskennen. Ich bin der Anfänger schlechthin und möchte folgendes machen: Eine 10 bit Zahl vom ADC (liegt ja auf ADCH und ADCL) durch eine Konstante dividieren und dann auf 4 Register in BCD-From aufteilen. (Also ungepackt; ein Register pro Digit). Das 10Bit --> 4xBCD schafft ja das anfangs gezeigte Programm vermutlich. Aber wie führe ich eine 10 Bit-Division im Assembler aus ? also Pauschal: ERGEBNIS=ADCWERT/KONSTANTE ??
@Andreas, hier findest Du z.B. eine Division / 60: http://www.mikrocontroller.net/forum/read-4-23408.html Peter
@peter, Okay, da müsste ich mich mal durchfinden, das krieg ich schon hin. Danke. @jonas Mir ist aufgefallen, dass dein ASM-Programm, welches du gepostet hast, bei mir (AVR Studio 4) nicht läuft. Eine Angabe "r@0" nimmt der Compiler nicht mit; es werden also keine Registernummern als Parameter akzeptiert. Schade. Ich habe ein ähnliches Programm gefunden. Dort läuft alles ganz gut (16 bit bin2bcd). Problem: die BCD- Digits sind gepackt. Kann mir jemand sagen, wie ich BCD-Digits entpacke ? Ich brauche die Darstellung: [ein Byte pro digit]. Danke im Voraus...
Hallo , kann mir einer helfen ich versuche mich schon einige Zeit daran meinen Controller in asm zu programmieren. Habe auch einige Erfolge dabei errungen, aber mit dem ADU komme ich absolut nicht zurecht. AGND, AVcc, ARef, und Register sind korekt eingestellt nur ein Ergebniss ist nicht zu sehen.
Hi Michael, ich bin auch erst eingestiegen in die Mikrocontrollergeschichten. Im Anhang findest du meinen Code zum Auslesen des ADUs. Allerdings sind noch ein paar extra Elemente im Code enthalten. z.B LCD- Display etc. Die Performance in Sachen Geschwindigkeit kann noch sehr stark verbessert werden. Aber die Kiste läuft :-) Du mußt dir nur die entsprechenden Abschnitte raussuchen.... mfg bluemole
Hallo leute ich habe ein Problem und zwar ich muss eine präsentation halten über binär-BCDwandler das problem ist ich muss das im logic_2 programmieren und zwar auf maximale stellenanzahl der eingänge ich könnte zwar die tabelle machen aber irgendwie geht es leichter über die gleichung ich habe auf dem logic baustein 9 eingänge und 9 ausgänge ob mir da jemand weiterhelfen könnte?
Hallo , ich habe Ihre programierung mir mal angesehen und hab dazu eine frage kann mann das auch mit anderen simulations programmen realisieren (Z.B. Logic ) und wenn ja wie ??? ich würde mich freuen wenn sie mir da weiterhelfen könnten. vielen dank
Ich benutzte für solche einfachen Sachen kleine C-Makros: // Convert a nibble into an ASCII hex digit. # define mc_NIBBLE_TO_ASCII(n) ("0123456789ABCDEF"[ n ]) // Convert bytes from/to 4-bit BCD. # define BCD2B(bcd) (10*((bcd) >> 4) + ((bcd) & 0xf)) /* always succeds (fits in one byte) */ # define B2BCD(b) ((((b) / 10) << 4) + ((b) % 10)) /* b<=99 asserted */
//***********************Zahl in BCD umrechnen void Convert_Int_Bcd (int Zahl) { int Help; Help = Zahl /1000; put_char (Help +0x30) //an Uart Zahl = Zahl - (Help * 1000); Help = Zahl / 100; put_char (Help +0x30) Zahl = Zahl - (Help * 100); Help = Zahl / 10; put_char (Help +0x30) Zahl = Zahl - (Help * 10); Help = Zahl; put_char (Help +0x30) }
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.