PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dezimal in Hexadizimal umrechnen für I2C UHR DS1307



Mistery386
08.02.2007, 21:34
Ich möchte in Bascom die daten der TWI UHR DS1307 von Dezimal in Hexadezimal umrechnen.
Es existiert auch bereits ein programm, nur das ist sicherlich auch einfacher zu lösen mit zb nem "sub" oder so.
Momentan werden alle daten einzeln umgewandelt.
Habe auch bereits mehrere versuche gemacht aber außer der aktuellen version läuft einfach nix.


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

Declare Sub I2cfach()
Dim Uhrsec As Byte
Dim Uhrmin As Byte
Dim Uhrstu As Byte
Dim Wotag As Byte
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Byte

Dim Erg1 As Byte ' Stunden zuweißen
Dim Erg1a As Byte
Dim Erg2 As Byte
Dim Erg2a As Byte
Dim Rst1 As Byte
Dim Rst2 As Byte

Dim Erg3 As Byte ' Minuten zuweißen
Dim Erg3a As Byte
Dim Erg4 As Byte
Dim Erg4a As Byte
Dim Rst3 As Byte
Dim Rst4 As Byte

Dim Erg5 As Byte ' Secunden zuweißen
Dim Erg5a As Byte
Dim Erg6 As Byte
Dim Erg6a As Byte
Dim Rst5 As Byte
Dim Rst6 As Byte

Dim Erg7 As Byte ' Wochentag zuweißen
Dim Erg7a As Byte
Dim Erg8 As Byte
Dim Erg8a As Byte
Dim Rst7 As Byte
Dim Rst8 As Byte

Dim Erg9 As Byte ' Tag zuweißen
Dim Erg9a As Byte
Dim Erg10 As Byte
Dim Erg10a As Byte
Dim Rst9 As Byte
Dim Rst10 As Byte

Dim Erg11 As Byte ' Monat zuweißen
Dim Erg11a As Byte
Dim Erg12 As Byte
Dim Erg12a As Byte
Dim Rst11 As Byte
Dim Rst12 As Byte

Dim Erg13 As Byte ' Jahr zuweißen
Dim Erg13a As Byte
Dim Erg14 As Byte
Dim Erg14a As Byte
Dim Rst13 As Byte
Dim Rst14 As Byte

Config Sda = Portc.4
Config Scl = Portc.5
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32

Cls
Cursor Off
I2cinit
Do
I2cfach

Locate 1 , 1
Lcd Rst2 ; Rst1 ; ":"
Locate 1 , 4
Lcd Rst4 ; Rst3 ; ":"
Locate 1 , 7
Lcd Rst6 ; Rst5 ; " "
Locate 2 , 1
If Rst7 = 1 Then
Lcd "Mo"
End If
If Rst7 = 2 Then
Lcd "Di"
End If
If Rst7 = 3 Then
Lcd "Mi"
End If
If Rst7 = 4 Then
Lcd "Do"
End If
If Rst7 = 5 Then
Lcd "Fr"
End If
If Rst7 = 6 Then
Lcd "Sa"
End If
If Rst7 = 7 Then
Lcd "So"
End If
Lcd " "
Locate 2 , 3
Lcd "," ; Rst10 ; Rst9 ; "."
Locate 2 , 7
Lcd Rst12 ; Rst11 ; "."
Locate 2 , 10
Lcd "20" ; Rst14 ; Rst13 ; " "

Waitms 150
Loop

Sub I2cfach()

I2cstart
I2cwbyte &B11010000 ' <-- Schreibe Adresse des DS1307 (UHR)
I2cwbyte &B00000000 ' <-- Ab Anfang lesen
I2cstart
I2cwbyte &B11010001 ' <-- Lese Adresse des DS1307 (UHR)
I2crbyte Uhrsec , Ack
I2crbyte Uhrmin , Ack
I2crbyte Uhrstu , Ack
I2crbyte Wotag , Ack
I2crbyte Tag , Ack
I2crbyte Monat , Ack
I2crbyte Jahr , Nack
I2cstop

Erg1 = Uhrstu / 16 ' Stunden umwnadeln
Erg1a = Erg1 * 16
Rst1 = Uhrstu - Erg1a
Erg2 = Erg1 / 16
Erg2a = Erg2 * 16
Rst2 = Erg1 - Erg2a

Erg3 = Uhrmin / 16 ' Minuten umwnadeln
Erg3a = Erg3 * 16
Rst3 = Uhrmin - Erg3a
Erg4 = Erg3 / 16
Erg4a = Erg4 * 16
Rst4 = Erg3 - Erg4a

Erg5 = Uhrsec / 16 ' Secunden umwnadeln
Erg5a = Erg5 * 16
Rst5 = Uhrsec - Erg5a
Erg6 = Erg5 / 16
Erg6a = Erg6 * 16
Rst6 = Erg5 - Erg6a

Erg7 = Wotag / 16 ' Wochentag umwnadeln
Erg7a = Erg7 * 16
Rst7 = Wotag - Erg7a
Erg8 = Erg7 / 16
Erg8a = Erg8 * 16
Rst8 = Erg7 - Erg8a

Erg9 = Tag / 16 ' Tag umwnadeln
Erg9a = Erg8 * 16
Rst9 = Tag - Erg9a
Erg10 = Erg8 / 16
Erg10a = Erg10 * 16
Rst10 = Erg9 - Erg10a

Erg11 = Monat / 16 ' Monat umwnadeln
Erg11a = Erg11 * 16
Rst11 = Monat - Erg11a
Erg12 = Erg11 / 16
Erg12a = Erg12 * 16
Rst12 = Erg11 - Erg12a

Erg13 = Jahr / 16 ' Jahr umwnadeln
Erg13a = Erg13 * 16
Rst13 = Jahr - Erg13a
Erg14 = Erg13 / 16
Erg14a = Erg14 * 16
Rst14 = Erg13 - Erg14a

End Sub


Schonmal danke im vorraus

darwin.nuernberg
08.02.2007, 21:54
Soooooo einfach ? :


Dim X As Byte
X = &B10101010

Print "Dezimal : ";
Print X
Print "Hexadezimal : ";
Print Hex(x)
Print "Binaer : ";
Print Bin(x)
end

Dezimal : 170
Hexadezimal : AA
Binaer : 10101010

Natürlich gehen auch andere Variablen (int, long usw)

Klar daß Bin und Hex als String zu behandeln sind.

Vitis
08.02.2007, 21:55
also du möchtest die dezimalzahlen als hexzahlen auf das
Display schreiben? dann nimm doch einfach die Funktion
hex(). Das geht dann so:

String=hex(dezimalzahl)

Mistery386
08.02.2007, 22:07
Wow, vielen dank für die flotten antworten.
Das es so extrem einfach zu machen ist hätte ich jetzt nicht gedacht.
Dafür ist mir mal wieder aufgefallen das ich noch viel zu lernen habe ;)
Danke!

darwin.nuernberg
08.02.2007, 23:43
Ja es gibt auch viel in der Hilfe und in den Beispiel-CodeSamples.
Außerdem hat MCSELEC auch noch ein gutes Forum (leider nur engl.)

Da findet man auch viel, wenn man richtig sucht.