- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Ämfänger braucht hilfe "Byte nach BCD auf Portx"

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6

    Ämfänger braucht hilfe "Byte nach BCD auf Portx"

    Anzeige

    Powerstation Test
    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é

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6
    Zitat Zitat von linux_80
    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.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6
    Zitat Zitat von PicNick
    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:
    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
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6
    das mit dem umwandel klappt nicht.

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

    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
    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?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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

    Code:
    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.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6
    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.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    06.09.2008
    Beiträge
    6
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken numeric_to_bcd.jpg  

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen