PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Variable



Cybererror
25.02.2010, 09:50
Hallo.

Habe folgendes Problem

Ich bin am Probieren
Habe eine Echtzeituhr per I2C angeschlossen. Die Daten kommen als Hex Zahl.
Meine Frage wie kann ich eine Dez Zahl 12 in eine Hex Zahl 12 umrechnen?
Oder gibt es eine Befehl.

Wollte auch eine Zahl vergleichen

'Abfrage Erschütterungssensor
If Erschütterung = 0 Then
Led = 1
Wertzeitbe = 0
Wertzeitbe = Hex(wert1)
Wertzeitbe = Wertzeitbe + 30
If Wertzeitbe >= 60 Then
Print "ok"
Wertzeitbe = Wertzeitbe - 60
End If
Else
If Hex(wert1) = Hex(wertzeitbe) Then
Led = 0
End If
End If

'abfrage led (erschütterungssensor für hintergrundbeleuchtung
If Led = 1 Then
Beleuchtung = Ein
Else
Beleuchtung = 25
End If

Warum selbst wenn ich mir die Zahlen anzeige lasse und beide gleich sind macht er es nicht.
Kann mir da jemand helfen..


$regfile "m8def.dat"
$crystal = 3686400
$baud = 19200
$framesize = 60
$swstack = 20
$hwstack = 64


'Config LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Cursor Off
'PWM

Config Portb.1 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
Enable Timer1

'Eingabe Steuerung
Config Pinc.1 = Input
Taster1 Alias Pinc.1
Config Pinc.2 = Input
Taster2 Alias Pinc.2
Config Pinb.2 = Input
Erschütterung Alias Pinb.2


'Pullup taster 1- 2
Portc.2 = 1
Portc.1 = 1
Portb.2 = 1


'Eingabe Licht
Config Pinc.0 = Input
Licht Alias Pinc.0


'Ausgang
Config Portb.5 = Output
Rot Alias Portb.5
Config Portb.4 = Output
Gelb Alias Portb.4
Config Portb.3 = Output
Grün Alias Portb.3

'Inizalisierung I2C Bus
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

'variable Bus

Dim Wert1 As Byte
Dim Wert2 As Byte
Dim Wert3 As Byte
Dim Wert4 As Byte
Dim Wert5 As Byte
Dim Wert6 As Byte
Dim Wert7 As Byte
Dim Temp As Byte
Dim Temp1 As Byte
Dim Led As Bit
Dim Wertzeit As Byte
Dim Wertzeitbe As Byte

'Variablen Beleuchtung
Beleuchtung Alias Compare1a
Const Ein = 0
Const Aus = 255
Const 50 = 125
Const 75 = 200
Const 25 = 75

'Inizalisieren Echtzeituhr per I2C Bus
Const Uhrschreiben = &B11010000
Const Uhrlesen = &B11010001

I2cstart
I2cwbyte Uhrschreiben
I2cwbyte &H7 , &B00010011
I2cstop
Waitms 25


'Display Löschen
Cls


'Bus Fehler abfragen und anzeigen ( Echtzeituhr)

Beleuchtung = 25
If Err = 1 Then
Locate 1 , 1
Lcd "Bus fehler"
Locate 2 , 1
Lcd "Echtzeituhr"
Wait 5
Else
Locate 1 , 1
Lcd "kein Fehler"
Locate 2 , 1
Lcd "Echtzeituhr"
Wait 2
End If
Cls
'testen des Temperatursensors
Err = 0
I2cstart
I2cwbyte &H9F
I2cstop
Waitms 25

'Bus Fehler abfragen und anzeigen (Temperatursensor)
If Err = 1 Then
Locate 1 , 1
Lcd "Bus fehler"
Locate 2 , 1
Lcd "Temp.sensor"
Wait 5
Else
Locate 1 , 1
Lcd "kein Fehler"
Locate 2 , 1
Lcd "Temp.sensor"
Wait 2
End If
Cls



'Uhr stellen
Locate 1 , 1
Lcd "Uhreinstellen"
Locate 2 , 1
Lcd "Taste1 drücken"
If Taster1 = 0 Then
Goto Uhreinstellen
End If
Wait 1
'Start Programm
Starte:

'Begrüßung
Beleuchtung = Ein
Cls
Locate 1 , 1
Lcd "Datumsanzeige"
Locate 2 , 1
Lcd "mit Temp.und LED"
Wait 2
Cls


'Haubtprogramm
Beleuchtung = 50

Do

'abfrage Datum
I2cstart
I2cwbyte Uhrschreiben
I2cwbyte &H00
I2cstart
I2cwbyte Uhrlesen
I2crbyte Wert1 , Ack
I2crbyte Wert2 , Ack
I2crbyte Wert3 , Ack
I2crbyte Wert4 , Ack
I2crbyte Wert5 , Ack
I2crbyte Wert6 , Ack
I2crbyte Wert7 , Nack
I2cstop

Waitms 100
'Uhr anzeige Display
Locate 1 , 9
Lcd Hex(wert3) ; ":" ; Hex(wert2) ; ":" ; Hex(wert1)

' Datum Anzeige
Locate 2 , 9
Lcd Hex(wert5) ; "/" ; Hex(wert6) ; "/" ; Hex(wert7)


' temperatur anzeigen
'abfrage temperatur
I2cstart
I2cwbyte &H9F
I2crbyte Temp , Ack
I2crbyte Temp1 , Nack
I2cstop
Waitms 30
Locate 2 , 1
Lcd Temp ; "`C"
Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32

'Abfrage Zeit und Temp
If Temp >= 23 Then
Rot = 1
Else
Rot = 0
End If

If Temp <= 20 Then
Gelb = 1
Else
Gelb = 0
End If

If Wert1 >= 88 Then
Toggle Grün
Else
Grün = 0
End If

Print Wert1 ; " " ; Wertzeitbe ; " " ; Hex(wertzeitbe) ; " = " ; Hex(wert1)
Print Bin(wert1) ; " = " ; Bin(wertzeitbe)

'Abfrage Erschütterungssensor
If Erschütterung = 0 Then
Led = 1
Wertzeitbe = 0
Wertzeitbe = Hex(wert1)
Wertzeitbe = Wertzeitbe + 30
If Wertzeitbe >= 60 Then
Print "ok"
Wertzeitbe = Wertzeitbe - 60
End If
Else
If Hex(wert1) = Hex(wertzeitbe) Then
Led = 0
End If
End If

'abfrage led (erschütterungssensor für hintergrundbeleuchtung
If Led = 1 Then
Beleuchtung = Ein
Else
Beleuchtung = 25
End If

Print "Es ist Uhr " ; Hex(wert3) ; ":" ; Hex(wert2) ; ":" ; Hex(wert1) ; " Temperatur " ; Temp ; "°C"

Loop




Uhreinstellen:
Beleuchtung = Ein
'Variable zum Uhr, Datum einstellen
Dim Hexstu As Byte
Dim Mi As Byte
Dim Stu As Byte

Cls
Stu = 0
Locate 1 , 1
Lcd "Uhr einstellen"
Wait 1

Einstellen:

Waitms 500
Locate 2 , 1
Lcd "Stunde"
Locate 2 , 8
Lcd Stu

If Taster2 = 0 Then
Waitms 250
Stu = Stu + 1
Stu = Hex(stu)
If Stu <= 24 Then
Stu = 0
End If

End If


Waitms 500
Print Hex(stu) ; " " ; Stu

Goto Einstellen







'I2cstart
'I2cwbyte Uhrschreiben
'I2cwbyte &H00 'Adresen anfang
'I2cwbyte &H2 'Secunde
'I2cwbyte &H47 'Minute
'I2cwbyte &H17 'Stunde
'I2cwbyte &H1 'Wochentag Tag (1-7)
'I2cwbyte &H21 'Tag
'I2cwbyte &H2 ' Monat
'I2cwbyte &H10 'Jahr
'I2cstop
'Waitms 24
Cls
Locate 1 , 1
Lcd "Uhr eingestellt"
Wait 5

Jaecko
25.02.2010, 10:04
Zum Umwandeln von dec nach hex gibts einen Befehl. Den verwendest du ja auch schon. Nur muss die Zielvariable ein String sein, kein Byte.

Ist das Ziel dann ein String, funktioniert sowas dann natürlich auch nicht mehr:
Wertzeitbe = Hex(wert1)
Wertzeitbe = Wertzeitbe + 30

Vitis
25.02.2010, 10:17
Welche RTC ist das denn die so doofe Darstellung verwendet?
AAlso, Hex beinhaltet die Zeichen A,B,C,D,E und F. Das sind
Zeichen, bzw. Buchstaben, ein Bytewert kann aber nur ganze Zahlen
von 0-255 sein, Was in einem String wiederum einem Zeichen entspricht.
Schau DIr mal ASCII an, Strings, Byte und Bit.

Und noch nebenbei, vermeide Goto,
schau Dir mal Gosub und Call an.

Cybererror
25.02.2010, 13:14
Danke für eure schnellen Antworten ich probiere es mal..


Und noch nebenbei, vermeide Goto,
schau Dir mal Gosub und Call an.

Warum goto vermeiden? mit gosub muss ich doch Return setzen und wenn ich aber in der schleife bleiben will bis ein wert oder ein Befehl kommt. dacht ich es geht so.
Call muss ich mir mal anschauen.


Zum Umwandeln von dec nach hex gibts einen Befehl. Den verwendest du ja auch schon. Nur muss die Zielvariable ein String sein, kein Byte.

Ist das Ziel dann ein String, funktioniert sowas dann natürlich auch nicht mehr:


Was meinst du denn mit ..
"ist das ziel dann ein String, funktioniert sowas dann natürlich auch nicht mehr: "

Jaecko
25.02.2010, 13:19
Naja dass man zu einem String keine Byte-Variable dazuzählen kann.

Das Ergebnis von "Text" + 30 ist ja auch nicht eindeutig; also was ist da gemeint. Soll es dann wie "Text30" aussehen? Oder ist 30 der ASCII-Code von einem Zeichen, das hinzugefügt werden soll.

Es müsste dann was sein wie "Text" + CHR(30) oder "Text" + STR(30)... je nach dem, was da gemeint ist bzw. gemacht werden soll.

for_ro
25.02.2010, 13:37
Meine Frage wie kann ich eine Dez Zahl 12 in eine Hex Zahl 12 umrechnen?
Ich bin mir nicht sicher, ob ich dich richtig verstehe. Aber wenn ich dein Programm sehe, dann glaube ich, dass du gar nichts umrechnen musst.
Hex, Dec und Bin sind nur unterschiedliche Darstellungsformen desselben Wertes.
Wenn du den Wert &H12, den du bekommst, mit Print ausgibst, wirst du sehen, dass tatsächlich der entsprechende Dezimalwert (1*16 + 2*1 = 18) ausgegeben wird.



Einstellen:

Waitms 500
Locate 2 , 1
Lcd "Stunde"
Locate 2 , 8
Lcd Stu

If Taster2 = 0 Then
Waitms 250
Stu = Stu + 1
Stu = Hex(stu)
If Stu <= 24 Then
Stu = 0
End If

End If


Waitms 500
Print Hex(stu) ; " " ; Stu

Goto Einstellen
Kommt er aus dieser Schleife eigentlich irgendwie wieder raus?

Cybererror
25.02.2010, 13:47
Bei Schleife wollte ich probieren einen Dez Wert eingeben (zb 12Uhr) ist aber Hex = C ich brauche aber HEX = 12???
Was ist eines meiner Probleme und das mit dem Vergleichen
Ich will wenn man Tischklopft, bekomme ich eine Segnal wamit ich die Hintergrundbeleuchtung für 30 s einschalten wollte.
Nun lese ich den Hexwert aus zB 15s ist ja Dez 21
will dann 30s warten also + 30 bekomme dann Dez 51 = Hex 33
Brauche aber den Hex wert 45 (Dez 69)
Wie kann ich das Realisieren...??? https://www.roboternetz.de/phpBB2/images/smiles/eusa_think.gif


Einstellen:

Waitms 500
Locate 2 , 1
Lcd "Stunde"
Locate 2 , 8
Lcd Stu

If Taster2 = 0 Then
Waitms 250
Stu = Stu + 1
Stu = Hex(stu)
If Stu <= 24 Then
Stu = 0
End If

End If


Waitms 500
Print Hex(stu) ; " " ; Stu

Goto Einstellen
Kommt er aus dieser Schleife eigentlich irgendwie wieder raus?[/quote] :-k :-k

Jaecko
25.02.2010, 14:00
Kann es sein, dass du nicht Hex(12) meinst, sondern dass die ersten 4 Bit für die 10er-Stelle und die letzten 4 Bit für die Einer-Stellen sind (Bei RTCs eigentlich üblich, z.B. DS1629). Ist etwas anderes. Da musst du dann die Zahl von Hand zerlegen. Einfach nach Hex umwandeln haut dir spätestens ab 10 nicht mehr hin. Die von Hex() erzeugte Bitfolge für 10 wäre 00001010 (ne 10 eben). Die RTC will hier aber 00010000, BCD-Darstellung für 10 (0001 = 1, 0000 = 0).

Cybererror
25.02.2010, 14:02
Ja genau..

Und wie zerlege ich die Zahl?

Jaecko
25.02.2010, 14:07
Wie das in Bascom genau geht, weiss ich jetzt nicht.
Allgemein gehts aber so:
Die 1er-Stelle der Zahl kriegt man mit dem Modulo 10 Befehl.
Die 10er-Stellen gibts mit ner Integer-Division durch 10.
Dann die 10er um 4 Bit nach links schieben (ging glaub ich mit Shift)
und die beiden zusammenzählen.

Beispiel in C:
(zahl, einer, zehner und RTCzahl sind jeweils Byte)

zahl = 14;
einer = zahl % 10; // Ergebnis einer = 4
zehner = zahl / 10; // Ergebnis zehner = 1
RTCzahl = (zehner << 4) + einer;

Vitis
25.02.2010, 14:08
Dafür gibts die Funktionen AND und OR zum Maskieren.
Will man von einem Byte z.B. nur die oberen 4 Bits haben, man
spricht da oft von einem Nibble blendet man zunächst die unteren
4 Bits aus

Bytewert = bytewert AND &B11110000

dann shiftet man, also schiebt man die Bits an die richtige Stelle, in diesem Fall nach rechts

shift bytewert,right,4

also um 4 Stellen nach rechts.

Das Ergebnis sieht dann in etwa so aus:
originalbyte = &B10100101
originalbyte = originalbyte AND &B11110000
dann ist das Ergebnis:
originalbyte = &B10100000
shift 1mal:originalbyte = &B01010000
shift 2mal:originalbyte = &B00101000
shift 3mal:originalbyte = &B00010100
shift 4mal:originalbyte = &B00001010

Will man die unteren 4 Bits geht das einfacher, indem man einfach
die oberen 4 löscht über

bytewert = bytewert AND &B00001111

Cybererror
25.02.2010, 14:34
Und die beiden Zahlen kann ich dann einfach Addieren damit ich die an die Uhr senden kann.
Und dann noch was wenn ich die Zahl eingeben also zb 12 Uhr ( wenn ich die Uhr einstellen will)
Ist dies ja eine Dez Zahl 12 als Bit 00001100 Wie bekomme ich aus dieser 00010010 (Hex 12)
Oder kann ich die 12 auch zerlegen in 1sten 4Bit 0001 ; 2 2sten 4Bit 0010
Wenn ja wie das?

Vitis
25.02.2010, 19:33
Und die beiden Zahlen kann ich dann einfach Addieren damit ich die an die Uhr senden kann.
Nein, Du hast dann die Einer und die Zehner, also bei Überlauf der Einer den Zehner hoch zählen oder zusammensetzen über Zehner mal Zehn plus die EIner dann.

Das Schreiben ...

tja, dafür brauchts dann etwas mehr Rechenarbeit ...

die 2 bekommst du ganz einfach über MOD

Also

Byte1 = 12
Byte2 = Byte1 MOD 10

-> Byte 2 ist dann 2

Es wird da automatisch ein durch 10 teilbarer Betrag abgezogen und nur der
Rest (nicht durch 10 teilbar) bleibt übrig.

das ist dann dein low-nibble
Dann gehts weiter an den high-nibble

byte3= byte1 / 10 das währe dann 1,2, da aber bytes keine Kommastellen können ergo nur 1
oder binär dann &B00000001

das shiften wir dann einfach nach links um 4 Stellen, also

shift byte3,left,4

Und dann setzen wir die Nibbles zusammen

ausgabebyte = byte2 OR byte3

und fertig ist die Laube

Cybererror
26.02.2010, 08:36
Habe mal noch eine Frage

Warum geht das nicht so wie ich will...

Habe in Bascom eingegeben:
Dim wert1 as byte
dim wert2 as byte
....


Wert1 = 0
Wert2 = 48 <- ist Hex 30
wert1 = hex(wert2)
print hex(wert2) -> zeigt mit 33 an <- Warum

Wollte zum testen das die Hintergrundbeleuchtung bei 30s aus geht. Tut Sie auch aber erst bei 33s

Warum rechnet es den so komisch

Jaecko
26.02.2010, 08:52
Das Ergebnis einer Hex()-Funktion muss in einer String-Variable gespeichert werden. Nicht in einer Byte! Wert1 wird nie das korrekte Ergebnis erhalten, solangs ein Byte ist.

Vitis
26.02.2010, 09:29
Befass Dich mal mit den verschiedenen Typen, den Wertebereichen ...

liest Du auch was geantwortet wird?

Das Ding gibt Dir auch mitnichten Hexwerte aus, sondern
eine Bitfolge von der Länge 8, ergo ein Byte, dessen
Hexdarstellung der Zeichfolge &Hirgednwas entspricht

Zahlensysteme wären da mal ein Einstieg ...

Binär, Oktal, Dazimal, Hexadezimal


http://www.spschwyz.ch/freienbach/upload/bilder/ereignisse/sanduhr_dpa_300h.jpg