- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Problem mit Variable

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.08.2009
    Ort
    SFB
    Beiträge
    60

    Problem mit Variable

    Anzeige

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

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.08.2009
    Ort
    SFB
    Beiträge
    60
    Danke für eure schnellen Antworten ich probiere es mal..
    Zitat Zitat von Vitis
    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: "

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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.
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: Problem mit Variable

    Zitat Zitat von Cybererror
    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.


    Zitat Zitat von Cybererror
    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?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    03.08.2009
    Ort
    SFB
    Beiträge
    60

    Re: Problem mit Variable

    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/im...eusa_think.gif

    Zitat Zitat von Cybererror
    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]

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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).
    #ifndef MfG
    #define MfG

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    03.08.2009
    Ort
    SFB
    Beiträge
    60
    Ja genau..

    Und wie zerlege ich die Zahl?

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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;
    #ifndef MfG
    #define MfG

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress