PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie 4 Stellige zahl hex konvertieren?



Accenter
05.06.2010, 20:09
Wie kann ich mit Bascom eine 4 stellige zahl z.B. "1234" auf hexadezimal konvertieren?

for_ro
05.06.2010, 21:55
Hallo,
meinst du für die Ausgabe in einen String umwandeln oder aus einem String in eine Zahl wandeln? Dafür gibt es die Funktionen Hex() und Hexval().

Accenter
05.06.2010, 23:24
1234 entspricht in meinem programm dem hexwert &H1B. variable a=1234 und nach der umwandlung soll variable b dann &h1B sein.

for_ro
06.06.2010, 00:16
Sorry, ich bin da vielleicht etwas begriffsstutzig.
Aber was hat a = 1234 mit b = &H1B zu tun?
Welche Logik steckt dahinter?

Accenter
06.06.2010, 00:22
garnichts. ich brauch einen code der mir 1234 auf hexadezimal umrechnet und das in diesem beispiel der variable b zuweist.

for_ro
06.06.2010, 00:51
Die Dezimalzahl 1234 ist nur eine andere Form der Darstellung des Hexadezimalen Wertes &H4D2 und des binären Wertes 10011010010.
Intern ist alles im Binärformat. Wenn du also eine Variable auf den Wert 1234 setzt, dann ist das der Dezimalwert. Intern wird die Variable auf 10011010010 gesetzt. Wenn du die Variable auf $H4D2 setzt wird sie intern ebenfalls auf 10011010010 gesetzt.
Interessant wird die Darstellung erst, wenn du sie ausgeben willst.
Ich bin mir nicht sicher, ob ich dich richtig verstanden habe.

Gento
06.06.2010, 01:51
Im Grunde rechnet so ein Chip immer Hex.
Nur weil ein Mensch zehn Finger hat wird es 'Menschentauglich' umgerechnet.
Eine Variable ab Byte ist immer Hex.
Dummerweise muß man den dem Chip sagen , rechne mal bitte Hex ins einen Hex String um , statt in zehn Fingersystemstring :^o

Gento

Accenter
06.06.2010, 02:07
Ich steuere mit meinem Code einen 868,35Mhz Sender um ELV FS-20 Empfänger anzusteuern. Hierfür muss ich z.B. den Hauscode (im Programm unten als HC1 bezeichnet) "1234" hexadezimal umrechnen. Nachdem ich viele verschiedene Codes schicke und ich auch die Quersumme berechnen muss hätte ich das gerne in eine Formel gepackt die mir das abnimmt.

Mir wurde gesagt, dass ich "1234" für mein programm so umrechnen muss:

Umrechnung: jede Ziffer -1, dann den binären Wert (2 bit) aller 4 Ziffern zusammensetzen, HC 1234 ergibt binär: 00 01 10 11 = hex: 1B


$regfile = "m8def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 12000000
$baud = 19200
Baud = 19200

Config Portb.1 = Input
Taster Alias Pinb.1

Config Pind.2 = Input
Nirq Alias Pind.2

Config Pind.7 = Output
Fsk Alias Portd.7

Led Alias Portd.5
Config Portd.5 = Output 'LED zur Kontrolle

Dim Count As Byte
Dim Temp As Byte
Dim Cmd(2) As Byte
Dim Par As Byte
Dim Hc1 As Byte
Dim Hc2 As Byte
Dim Ag As Byte
Dim Befehl As Byte
Dim Quersumme As Byte


Hc1 = &H1B
Hc2 = &H1B
Ag = &H50
Befehl = &H12
Quersumme = &HFE



Declare Sub Rf_cmd(byval Tmp As Word) As Word
Declare Sub Parity(byval Par_byte As Byte) As Byte
Declare Sub Send(byval Sendbyte As Byte) As Byte

'config SPI
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 64 , Noss = 0
'Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = Portb.2 , Clock = Portb.5

'init the spi
Spiinit

Waitms 100

Toggle Led


Call Rf_cmd(&Hcc00)
Call Rf_cmd(&H9072) '868MHzband, 12pf, fsk90kHz, 1MHz clock
Call Rf_cmd(&Ha686) '868,35 MHz
'Call Rf_cmd(&Hc811) '19,2 kbit
Call Rf_cmd(&Hc220) 'tx bit sync
Call Rf_cmd(&Hc001) 'TX off
Call Rf_cmd(&Hd240) 'PLL 25%
Call Rf_cmd(&Hbb00) 'OOK on, -9 db
Call Rf_cmd(&He000) 'disable wakeup timer

Do

Bitwait Taster , Set


Toggle Led

Call Rf_cmd(&Hcc00)
Call Rf_cmd(&Hc038) 'TX on

Waitms 1

For Count = 1 To 12
Gosub Send_0
Next
Gosub Send_1

Call Send(hc1)
Call Send(hc2)
Call Send(ag)
Call Send(befehl)
Call Send(quersumme)
Gosub Send_0

Call Rf_cmd(&Hc001) 'TX off

Reset Led

Wait 2

Loop

Sub Send(byval Sendbyte As Byte) As Byte
For Count = 0 To 7
Temp = Sendbyte And &H80
If Temp = &H80 Then
Gosub Send_1
Else
Gosub Send_0
End If
Rotate Sendbyte , Left , 1
Next
Call Parity(sendbyte)
End Sub



Sub Parity(byval Par_byte As Byte) As Byte
Par = 0
For Count = 0 To 7
Par = Par Xor Par_byte.count
Next
If Par = 1 Then
Gosub Send_1
Else
Gosub Send_0
End If
End Sub



Send_0:
Set Fsk
Waitus 400
Reset Fsk
Waitus 400
Return

Send_1:
Set Fsk
Waitus 600
Reset Fsk
Waitus 600
Return


Sub Rf_cmd(byval Tmp As Word) As Word
Cmd(2) = Tmp And 255
Shift Tmp , Right , 8
Cmd(1) = Tmp
Spiout Cmd(1) , 2
End Sub

Gento
06.06.2010, 02:13
Dummerweise ist aber Dezimal= 1234 im Hex=4D2
Und ehrlich gesagt drum was es mir nicht wert ,Deinen ganzen unformatierten Code durchzulesen.
Gento

Accenter
06.06.2010, 02:27
Hab hier eine Tabelle gegoogelt in der man sieht, dass Binär: 00 01 10 11 hex: 1B ist. Für mich ist das alles noch Neuland. Keine Ahnung wo da der Fehler liegt. http://home.snafu.de/sicpaul/midi/hexbin.htm

Gento
06.06.2010, 02:46
Windoof>Programme>Zubehör>Rechner>Ansicht>Wissenschaftlich.

Dort werden Dir geholfen Dez zu Hex
Gento

Accenter
06.06.2010, 03:18
Ich komm bei meiner Anforderung wohl um keine Formel herum. Hatte gehofft das geht einfacher.

Accenter
06.06.2010, 13:08
Hab mir das jetzt nochmal genau angesehen. "1234" darf nicht direkt hexadezimal konvertiert werden sondern das ganze muss so passieren:


Die Übersetzung von an Sendern eingegebenen Adresscodes und Hauscodes erfolgt durch Herabsetzen der
Tastennummer um 1 und Hintereinandersetzen der Halbnibbles vom ersten als höchstwertigen bis zum
letzten als niedrigstwertigen.

Der Hauscode wurde in einem Schalter als 1234 4433 eingegeben. Dies entspricht 0123 3322 zur Basis 4,
das ist 1BFA zur Basis 16. HC1 ist damit 0x1B, HC2 ist 0xFA

Ich muss jetzt also eine Formel schreiben die mir aus "1234" dann 1B macht.

for_ro
06.06.2010, 16:26
@accenter
Schau dir mal deine ersten Angaben an und was du jetzt für Infos lieferst. Du hast uns anfangs vollkommen fehlgeleitet. Alles was geschrieben und vorgeschlagen wurde, war sinnlos. Versuche das nächste mal, so viel relevante Infos zu geben wie möglich.
Zu deinem Problem:
Wie bekommst du den Hauscode? Ist der in Dip-Schaltern oder wie wird das 1234 4433 festgelegt? Und wie liest du den ein?

Accenter
06.06.2010, 17:31
ja war mein fehler, sorry. ich dachte ich muss es einfach hex konvertieren. den hauscode gebe ich einfach im programm ein. ich hätte den einfach gern umgerechnet um nicht alle meine benötigten codes immer manuell ausrechnen zu müssen. dieses vorhaben übersteigt nur etwas meine programmierkenntnisse. eine reine hex umrechnung hätte ich hinbekommen :-)

for_ro
06.06.2010, 17:57
Also schreibst du im Programm den String "1234" hin und möchtest den in &H1B umrechnen lassen, richtig?
Wenn der String immer 4 Stellen hat und nur Ziffern von 1 bis 4 enthält, dann kannst du es so machen:


Dim Schalter As String * 4
Dim Schalter_ovly(4) As Byte At Schalter Overlay 'Overlay Array enthält die ASCII Werte der Ziffern
Dim I As Byte
Dim Ziffer As Byte
Dim Ausgabe As Byte

Schalter = "1234"
Ausgabe = 0
For I = 1 To 4
Ziffer = Schalter_ovly(i) - 49 'vom Ascii Wert 49 abziehen, damit wird aus einer 1 eine 0, aus der 2 eine 1 usw.
Ausgabe = Ausgabe + Ziffer
If I < 4 Then Shift Ausgabe, Left, 2 'um 2 bit weiterschieben
Next I

Accenter
06.06.2010, 18:50
Super, genau sowas brauch ich! Werde den code dann gleich testen wenn ich wieder daheim bin. Danke für die hilfe!

Accenter
07.06.2010, 23:51
Hab den Code jetzt in mein programm eingebaut und es läuft wie es soll. Danke!