Hallo,
hast du schon in der Bacom-Hilfe nach den Befehlen BCD(), MakeBCD() und MakeDEC() geschaut, da ist auch ein Beispiel, wie man hin und her wandelt.
Hallo Leute,
ich stehe auf dem Schlauch.
Als Anfänger habe ich mir das Buch "AVR" von Roland Walter geholt und die dazugehörige Experimentierplatine mit einem Atmega8.
Jetzt möchte ich einfach ein Byte als Zahl in einen BCD (8-4-2-1) Code wandeln und den BCD code parallel an 4 Pins ausgeben. Die Ausgabe des BCD codes von den 4 Pins soll dann einem 4511 (BCD to 7-Segment Anzeige converter) zu geführt werden.
Kann mir da bitte mal jemand helfen wie ich das mit den Basic Befehlen realisiere? Ich komme nicht drauf.
vielen Dank
André
Hallo,
hast du schon in der Bacom-Hilfe nach den Befehlen BCD(), MakeBCD() und MakeDEC() geschaut, da ist auch ein Beispiel, wie man hin und her wandelt.
ja sicher doch damit komme ich nicht weiter. und auch werden damit ja keine Pins gesetzt.Zitat von linux_80
Wenn in dem Byte eine Zahl 0-9 steht, kannst du die unteren 4-Bits direkt an den 4511 schicken, da brauchst du gar nix.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Also ich habe es jetzt mal so gemacht:Zitat von PicNick
Zm testen war es gedacht über ein Terminal Programm einen Zahl ein zu tippen die mir dann auf einer 7-segment anzeige ersichtlich wird.Code:'0405.BAS: UART-Empfänger mit Interrupt 'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC, ' Speaker an PD5 '---------------------------------------------------------- $regfile = "m8def.dat" 'ATmega8-Deklarationen $crystal = 3686400 'Quarz: 3,6864 MHz $baud = 9600 'UART-Baudrate: 9600 Baud Dim I As Byte 'Byte: 0...255 Dim A As Byte 'Setup A Variable Dim B As Byte 'Setup B Variable Dim C As Byte 'Setup C Variable Ddrd = &B00100000 'Pin PD5 ist Ausgang, Rest Eingang Ddrb = &B00001111 Ddrc = &B00001111 A = &H23 'zahl nur Hexadecimal On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen '---------------------------------------------------------- Main: B = A And &B0000_1111 'Mask To Get Only Low Nibble Of Byte , Store As C Portb = B C = A And &B1111_0000 'Mask To Get Only High Nibble Of Byte Shift C , Right , 4 'Shift High Nibble To Low Nibble Position , Store As C Portc = C Goto Main Onrxd: I = Udr 'B = Bcd(i) 'A = Makebcd(i) A = I 'Byte aus der UART auslesen 'Byte als Echo zurückgeben Udr = A Return
Leider klappte das nur mit einer Ziffer - bei der 2. Ziffer kam nur mist raus.
Wenn ich jetzt die Variable A mit einer HEX zahl versehe dann wird auch diese Hex-Zahl aus gegeben wie in diesem beispiel 23.
Gebe ich im Terminalprog z.B. "a" ein was hexadecimal 61 entspricht dann wird auch 61 auf meiner 2 Stelligen 7-Segmentanzeige angezeigt.
Alles super soweit.
Doch ich will ja nicht den hexadecimalwert angezeigt bekommen sondern eine eine Zahl von 0-99 eingeben und auch genau diese angezeigt bekommen.
Also muss ich irgenwie und wo noch wandeln. doch ich raff es nicht. wer kann mir helfen bitte
Hallo dremeier,
du hast die Umwandlung doch als Kommentar schon drin:
'A = Makebcd(i)
Dann schickst du die unteren 4 Bits an Portb und die oberen 4 Bits (um 4 nach rechts geschoben) an Portc.
Gruß Dirk
das mit dem umwandel klappt nicht.
habe hier mal ein LCD angeschlossen um die Ausgabe verschiedener umwandlungen und derer Ergebnisse anzuzeigen:
also die ziffer Z (5) ergibt als:Code:'---------------------------------------------------------- $regfile = "m8def.dat" 'ATmega8-Deklarationen $crystal = 3686400 'Taktfrequenz: 3,6864 MHz ' Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Cls 'Locate 1 , 1 'Lcd "Hallo Welt" Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim E As Byte Dim Z As Byte Z = 5 A = Bcd(z) B = Makebcd(z) C = Binval(z) D = Hexval(z) Locate 1 , 1 Lcd A Locate 1 , 8 Lcd B Locate 2 , 1 Lcd C Locate 2 , 8 Lcd D
A = 48
B = 5
C = 213
D = 213213
mit dem Ergebnis kann ich nichts Anfangen.
hat jemand eine Erklärung?
Bist Du sicher das Du in die Bascom-Hilfe geschaut hast ?
Als Entschuldigung lass ich nur gelten wenn Du der engl. Sprache nicht mächtig bist !
Zu jedem dieser Befehle ist ein Beispiel in der Hilfe, und nur bei einem ist es vorgesehen, das man ein Byte in ein Byte umwandelt, beim Rest brauchts immer einen String auf einer Seite.
Bei diesem einen, bei Dir Beispiel B, kommt genau das raus was rauskommen soll.
Vor allem darf man einen nach BCD gewandelten Wert nicht direkt mit Print/Lcd ausgeben, denn das ergibt käse, wenn der Wert grösser als 9 war !
Dafür ist dann der Befehl BCD() vorgesehen, der wandelt es wieder in was lesbares.
Zum Test kannst Du folgendes machen, eine Dezimalzahl >9, damit sie zwei Stellen hat, mit Makebcd() umwandlen, und mit LCD Hex() ausgeben, dann kommt genau diese Zahl raus
Der Unterschied von Bcd und Hex ist, das es bei Bcd nur die Werte 0-9 gibt.Code:Dim Z as Byte Z = 42 Dim B as Byte B = Makebcd(z) Print Hex(b); " " ; z Print Bcd(b); " " ; z
Hallo linux_80
danke das hat mir sehr geholfen.
zugegeben mit dem Englischen habe ich so meine Mühe. Aber viel schlimmer ist das ich mit den unterschiedlichen Formaten wie Hex, Byte, String usw. noch nicht so Sattelfest bin.
Die letzen geh versuche einen PIC bzw mit einem BasicStamp zu programmieren liegen nun schon mehr 10 Jahre zurück.
habe mir dank eurer Hilfe mal was zum testen gebastelt um aus einer 2 Stelligen numeric nach 2 x BCD aufzulösen und auf dem LCD anzuzeigen.
Mir hat es für das Verständnis weiter geholfen.
Code:'Demonstration zur Wandlung von 2 Stelligen Zahlen nach BCD '---------------------------------------------------------- $regfile = "m8def.dat" 'ATmega8-Deklarationen $crystal = 3686400 'Taktfrequenz: 3,6864 MHz $baud = 9600 On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen Config Lcd = 20 * 4 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Cls Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim E As Byte Dim F As Byte Dim G As Byte Dim H As Byte Dim I As Byte Dim L As Byte Dim Z As Byte Dim Y As Byte Dim U As Byte 'Dim V As String * 4 Z = 96 '---------------------------------------------------------- Main: Cls Y = Makebcd(z) L = Y And &B0000_1111 'Mask To Get Only Low Nibble Of Byte , Store As C H = Y And &B1111_0000 'Mask To Get Only High Nibble Of Byte Shift H , Right , 4 'Shift High Nibble To Low Nibble Position , Store As H A = L And &B0000_0001 'Low Byte zerlegen in BCD Code If A >= 1 Then A = 1 'abfrage B = L And &B0000_0010 If B >= 1 Then B = 1 C = L And &B0000_0100 If C >= 1 Then C = 1 D = L And &B0000_1000 If D >= 1 Then D = 1 E = H And &B0000_0001 If E >= 1 Then E = 1 F = H And &B0000_0010 If F >= 1 Then F = 1 G = H And &B0000_0100 If G >= 1 Then G = 1 I = H And &B0000_1000 If I >= 1 Then I = 1 Locate 1 , 1 Lcd Bcd(h) ; " High" 'Ausgabe des high Byte Locate 1 , 10 Lcd I ; " " ; G ; " " ; F ; " " ; E 'Ausgabe des BCD codes Locate 3 , 1 Lcd Bcd(l) ; " Low " Locate 3 , 10 Lcd D ; " " ; C ; " " ; B ; " " ; A 'BCD High = 8 4 2 1 'variable = I G F E 'BCD Low = 8 4 2 1 'variable = D C B A Wait 1 Goto Main Onrxd: U = Udr 'Byte aus der UART auslesen Udr = U 'Byte als Echo zurückgeben Z = U Return
Lesezeichen