PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ämfänger braucht hilfe "Byte nach BCD auf Portx"



dremeier
06.09.2008, 16:21
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é

linux_80
06.09.2008, 16:53
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.

dremeier
06.09.2008, 17:08
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.

PicNick
06.09.2008, 17:51
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.

dremeier
06.09.2008, 21:19
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.

Also ich habe es jetzt mal so gemacht:

'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

Zm testen war es gedacht über ein Terminal Programm einen Zahl ein zu tippen die mir dann auf einer 7-segment anzeige ersichtlich wird.

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

Dirk
06.09.2008, 22:11
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

dremeier
06.09.2008, 23:09
das mit dem umwandel klappt nicht.

habe hier mal ein LCD angeschlossen um die Ausgabe verschiedener umwandlungen und derer Ergebnisse anzuzeigen:


'----------------------------------------------------------
$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


also die ziffer Z (5) ergibt als:

A = 48
B = 5
C = 213
D = 213213

mit dem Ergebnis kann ich nichts Anfangen.

hat jemand eine Erklärung?

linux_80
07.09.2008, 00:33
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 :-)


Dim Z as Byte
Z = 42

Dim B as Byte

B = Makebcd(z)

Print Hex(b); " " ; z
Print Bcd(b); " " ; z

Der Unterschied von Bcd und Hex ist, das es bei Bcd nur die Werte 0-9 gibt.

dremeier
07.09.2008, 10:56
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.

dremeier
07.09.2008, 13:36
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.


'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

linux_80
07.09.2008, 16:03
Halo,

fürs verständis gut, fürs Ergebnis schneller mit

Lcd Bin(y)

gibt alles binär aus.