- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: Byte Variable als Word umwandeln

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.03.2007
    Beiträge
    27

    Byte Variable als Word umwandeln

    Anzeige

    Powerstation Test
    Hallo Jungs,

    ich habe da ein Problem und komme nicht mehr weiter.

    Mein Programm läuft so weit, jedoch habe ich die Variablen als Byte definiert.

    Das reicht mir aber nicht da ich in der Variable Werte bis 999 unterbringen muss. Als Byte geht es ja nur bis 255.

    Wenn ich die Variablen z1 ; z2 ; z3 ändere, so bekomme ich eine Fehlermeldung welche ich nicht deuten kann.

    Könnt Ihr mir da bitte weiter helfen??

    Ich hänge mal das ganze Programm hier an.

    Vielen Dank und herzliche Grüße

    Richard
    Angehängte Dateien Angehängte Dateien

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    .. eine Fehlermeldung welche ich nicht deuten kann.
    Wenn du sie auch anhängst, können wir es ja mal versuchen, zu deuten.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    41
    Beiträge
    982
    Hallo!

    folgende lib solltest du nicht einbinden:
    $lib "mcsbyte.lbx"

    soweit ich weiss bringt das nur etwas wenn man im code nur bytes definiert, dann mancht Bascom irgendeine byte optimierung...

    gruss bluesmash

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    16.03.2007
    Beiträge
    27
    Sorry,

    hier der Code.

    Code:
    $regfile = "m32def.dat"
     $framesize = 40
     $swstack = 10
     $hwstack = 32
     $crystal = 8000000
     $baud = 4800
    
    
    
    
    
    
    '--------------------------------------------------------------Timer deffinieren
    
    
    'Hier wird der Timer und der Teiler festgelegt
    Config Timer1 = Timer , Prescale = 256
    
    
    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall (1 Sekunde) aufgerufen wird
    On Timer1 Timer_irq
    
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 34286
    
    
    'Hier werden die Timer aktiviert
    Enable Timer1
    Enable Interrupts
    
    
    Dim Sekunde As Byte                                         'Sekunde
    
     Dim Minute As Byte                                         'Minute
     Dim Stunde As Byte                                         'Stunde
     Dim Tag As Byte                                            'Tag
    
    
    
    '--------------------------------------------------------- Variablen deffinieren
    
    
    Const Dekaden = 9                                           ' Anzahl der Anzeigen (dekaden)
    
    
    'Variablen Sieben Segment Decoder
    Declare Function Segmentdecoder(byval C As String) As Byte
    
    Declare Sub Showtime()
    
    
    
    
    Dim Anzeigetext As String * 9
    
    
    
    '------------------------------------------------Variablen 7 Segment Dekodierung
    
    Dim Segment(dekaden) As Byte
    Dim Zahl(dekaden) As Byte                                   ' Array für die fertig berecheten Segmente
    Dim Zahldpp As Byte                                         ' Zahl mit Doppltpunkt für Uhrzeit
    Dim Zahlpkt As Byte                                         ' Zahl mit Punkt für Datum
    Dim Digit As Byte
    Dim Adress As Integer
    Dim D As Byte
    Dim L As Byte                                               ' Variable für Länge des Strings
    Dim X As Byte                                               ' Zählervariable
    Dim Pos As Byte                                             ' Variable für MID Funktion
    Dim Z As String * 1
    Dim Segcode As Byte
    
    
    ' Variablen für die einzelnen Digits  ------------------------------------------
    
    Dim Z1 As Byte                                              'Zeile 1
    Dim Z2 As Byte                                              'Zeile 2
    Dim Z3 As Byte                                              'Zeile 3
    
    'Dim Z1 As Word                                              'Zeile 1
    'Dim Z2 As Word                                              'Zeile 2
    'Dim Z3 As Word                                              'Zeile 3
    
    
    Z1 = 1
    Z2 = 2
    Z3 = 3
    
    
    
    ' String Werte zwecks Anzeige
    
    Dim Str_z1 As String * 3
    Dim Str_z2 As String * 3
    Dim Str_z3 As String * 3
    
    Dim L_str_z1 As Byte                                        ' Länge des Strings
    Dim L_str_z2 As Byte
    Dim L_str_z3 As Byte
    
    
    
    Dim Anzeigezahl As String * 9                               'Wird an Display angezeigt
    
    
    Dim Zeile As Byte                                           'Die ausgewählte Zeile
    Zeile = 1
    
    
    
    
    'Variable für Fernbedienung
    
    ' Lib für die Fernbedienung RC5 laden
    $lib "mcsbyte.lbx"
    
    Config Rc5 = Pinb.2                                         ' Eingabgspin des RC5 Empfängers
    Enable Interrupts
    Dim Address As Byte , Command As Byte
    Dim S As Byte
    
    Enable Interrupts
    
    
    '-------------------------------- I2C Konfigurieren ----------------------------
    
    Config Scl = Portc.0                                        ' Ports fuer I2C-Bus
    Config Sda = Portc.1
    Config I2cdelay = 5
    I2cinit
    
    
    
    'Slave adressen des PCF 8574 I/O IC
    'Für die ersten 6 digits werden PCF8574AP verwendet. Für die letzten 3 Digits PCF8574P
    
    Const Adr_digit1 = &B01110000                               ' Adresse Stelle 1
    Const Adr_digit2 = &B01111000                               ' &B1001110
    Const Adr_digit3 = &B01110100                               '      |||
    Const Adr_digit4 = &B01111100                               '      |||
    Const Adr_digit5 = &B01110010                               '      |||
    Const Adr_digit6 = &B01111010                               '      |||
    Const Adr_digit7 = &B01001100                               '      |||
    Const Adr_digit8 = &B01000010                               '      ||A0
    Const Adr_digit9 = &B01001010                               '      |A1
                                                                 '      A2
    
    
    
    '---------------------------- Hauptprogram -------------------------------------
    
    Do
    
    'Waitms 500
    
    'Print "Warte auf RC5 Signal..."
    
    
    Enable Interrupts
    'reserve space for variables
    
    
    'now check if a key on the remote is pressed
    'Note that at startup all pins are set for INPUT
    'so we dont set the direction here
    'If the pins is used for other input just unremark the next line
    'Config Pind.2 = Input
    Getrc5(address , Command)
    'we check for the TV address and that is 0
    
    
     If Address = 0 Then
    '   Print "Es wurde ein Signal von der Fernbedienung empfangen"
    
       Command = Command And &B01111111
    
       Print "Adresse =" ; Address ; "      Command = " ; Command
    
    
      ' Verzweigung zu den verschiedenen Arbeitsmoduse
    
      Select Case Command
    
        'Case 17 : Gosub Taste1                                      'Taste 1
    
        'Case 18 : Gosub Taste2                                      'Taste 2
    
        'Case 19 : Gosub Taste3                                      'Taste 3
    
         Case 28 : Gosub Line_down                              'Zeile auf
    
         Case 27 : Gosub Line_up                                'Zeile ab
    
         Case 36 : Gosub Wert_up                                'Erhöhen
    
         Case 37 : Gosub Wert_down                              'Reduzieren
    
    '     Case 40 : Gosub Ok                                     'Taste OK
    
        'Case 42 : Gosub Ausgang                                     'Taste exit
    
        'Case 32 : Gosub Aus_einschalten                             'Taste power
    
    
       End Select
    
    
     End If
    
    
    If Sekunde = 61 Then
       Sekunde = 1
       Incr Z1
         Gosub Umwandeln
    
         Gosub Uebertragen
       Incr Minute
    End If
    
    
    If Minute = 61 Then
       Minute = 1
       Incr Stunde
    End If
    
    
    If Stunde = 25 Then
       Stunde = 1
       Incr Tag
    End If
    
    
    
    Loop
    
    
    Wert_up:
    '-------------------------------------------------------------------Wert erhöhen
    
     Select Case Zeile
    
       Case 1 : Incr Z1
       Case 2 : Incr Z2
       Case 3 : Incr Z3
    
     Case Else : Print "------Überlauf Zahl + " ; "Position-" ; Zeile ; "Zahl-" ; Z1 ; "---" ; Z2 ; "---" ; Z3;
    
     End Select
    
    
    
        If Z1 = 255 Then
       Z1 = 0
      End If
    
        If Z2 = 255 Then
       Z2 = 0
      End If
    
        If Z3 = 255 Then
       Z3 = 0
      End If
    
    Gosub Umwandeln
    
    Gosub Uebertragen
    
    Return
    
    
    
    Wert_down:
    '----------------------------------------------------------------Wert reduzieren
    
     Select Case Zeile
    
       Case 1 : Decr Z1
       Case 2 : Decr Z2
       Case 3 : Decr Z3
    
     Case Else : Print "------Überlauf Zahl + " ; "Position-" ; Zeile ; "Zahl-" ; Z1 ; "---" ; Z2 ; "---" ; Z3;
    
     End Select
    
    
    
        If Z1 = 0 Then
       Z1 = 255
      End If
    
        If Z2 = 0 Then
       Z2 = 255
      End If
    
        If Z3 = 0 Then
       Z3 = 255
      End If
    
    Gosub Umwandeln
    
    Gosub Uebertragen
    
    Return
    
    
    
    '------------------------------------------------------------Einstellmenü Zeiger
    
    '------------------------------------------------Zeiger eine POsition nach unten
    
    Line_up:
    Print "------------------------------------------Line UP------------------------"
    
    Incr Zeile
    
    Posit_up:
    
    Select Case Zeile
    
            Case 1 : Gosub Blinken_z1
            Case 2 : Gosub Blinken_z2
            Case 3 : Gosub Blinken_z3
    
    End Select
    
    
    
      If Zeile > 3 Then
    
        Zeile = 3
        Goto Posit_up
      End If
    
    Gosub Umwandeln
    
    Gosub Uebertragen
    
    Return
    
    
    
    Line_down:
    
    Print "------------------------------------------Line Down------------------------"
    
    Decr Zeile
    
    
    '------------------------------------------------Zeiger eine POsition nach unten
    
    Posit_down:
    
    Select Case Zeile
    
            Case 1 : Gosub Blinken_z1
            Case 2 : Gosub Blinken_z2
            Case 3 : Gosub Blinken_z3
    
    End Select
    
    
    
      If Zeile < 1 Then
    
        Zeile = 1
        Goto Posit_down
      End If
    
    Gosub Umwandeln
    
    Gosub Uebertragen
    
    Return
    
    
    '----------------------------------------------------Bin Daten in asc umwandeln
    Umwandeln:
    
    
    
    
    Str_z1 = Str(z1)
    Str_z2 = Str(z2)
    Str_z3 = Str(z3)
    
    '-----------------------------------------------------Länge der Zahlen ermitteln
    
    L_str_z1 = Len(str_z1)
    L_str_z2 = Len(str_z2)
    L_str_z3 = Len(str_z3)
    
    '------------------------------------------------------mit Leerzeichen auffüllen
    
    Select Case L_str_z1
    
     Case 1 : Str_z1 = " " + " " + Str_z1
     Case 2 : Str_z1 = " " + Str_z1
    
    End Select
    
    
    Select Case L_str_z2
    
     Case 1 : Str_z2 = " " + " " + Str_z2
     Case 2 : Str_z2 = " " + Str_z2
    
    End Select
    
    
    Select Case L_str_z3
    
     Case 1 : Str_z3 = " " + " " + Str_z3
     Case 2 : Str_z3 = " " + Str_z3
    
    End Select
    
    'Str_z1 = Format(str_z1 , "000")
    'Str_z2 = Format(str_z2 , "000")
    'Str_z3 = Format(str_z3 , "000")
    
    
    
    
    Anzeigezahl = Str_z1 + Str_z2 + Str_z3
    
    Print " Anzeigezahl -----------------------------------= " ; Anzeigezahl
    
    Return
    
    
    
    '------------------------------------------------Daten an die Anzeige übertragen
    Uebertragen:
    
        L = Len(anzeigezahl)                                    ' ermittle Länge des Strings
        If L > Dekaden Then L = Dekaden                         ' Verhindern dass mehr Anzeigen berechent werden
                                                                ' als definiert und vorhanden sind.
        For X = 1 To L
          Pos = L - X
          Pos = Pos + 1                                         ' Beginne mit den Einer Stellen (rechts)
          Z = Mid(anzeigezahl , Pos , 1)                        ' Picke eine einzelnes Zeichen het_aussen
    
          Segcode = Segmentdecoder(z)                           ' Ermittle den 7 Segment Code für die Segmente
    
          Segment(x) = Segcode
    
    'Print "L= " ; L
    'Print "Pos= " ; Pos
    'Print "segcode= " ; Segcode
    
        Next X
    
    
    ' Berechnet die Segmente der einzelnen Dekaden
    ' und legt diese im Array Segment() ab.
    
       For Digit = 1 To Dekaden
          Zahl(digit) = Segment(digit)
       Next Digit
    
    
    
    
    
    '-------------- Daten  über I2C an die Anzeigen senden ----------
    
    
       I2csend Adr_digit9 , Zahl(1)                             'Daten zu Digit 1
       I2csend Adr_digit8 , Zahl(2)                             'Daten zu Digit 2
       I2csend Adr_digit7 , Zahl(3)                             'Daten zu Digit 3
       I2csend Adr_digit6 , Zahl(4)                             'Daten zu Digit 4
       I2csend Adr_digit5 , Zahl(5)                             'Daten zu Digit 5
       I2csend Adr_digit4 , Zahl(6)                             'Daten zu Digit 6
       I2csend Adr_digit3 , Zahl(7)                             'Daten zu Digit 7
       I2csend Adr_digit2 , Zahl(8)                             'Daten zu Digit 8
       I2csend Adr_digit1 , Zahl(9)                             'Daten zu Digit 9
    
    
    
    
    Return
    
    
    '-------------------- Blinken bei Positionswechsel -----------------------------
    Blinken_z1:
      I2csend Adr_digit1 , &B00000000
      I2csend Adr_digit2 , &B00000000
      I2csend Adr_digit3 , &B00000000
      Waitms 200
      I2csend Adr_digit1 , &B11111111
      I2csend Adr_digit1 , &B11111111
      I2csend Adr_digit1 , &B11111111
    Return
    
    
    Blinken_z2:
      I2csend Adr_digit4 , &B00000000
      I2csend Adr_digit5 , &B00000000
      I2csend Adr_digit6 , &B00000000
      Waitms 200
      I2csend Adr_digit4 , &B11111111
      I2csend Adr_digit5 , &B11111111
      I2csend Adr_digit6 , &B11111111
    Return
    
    
    Blinken_z3:
      I2csend Adr_digit7 , &B00000000
      I2csend Adr_digit8 , &B00000000
      I2csend Adr_digit9 , &B00000000
      Waitms 200
      I2csend Adr_digit7 , &B11111111
      I2csend Adr_digit8 , &B11111111
      I2csend Adr_digit9 , &B11111111
    Return
    
    
    
    '-------------------------------------------------Der Timer wird hier aufgerufen
    Timer_irq:
      Timer1 = Timervorgabe
    
       Incr Sekunde
    
    
    Return
    
    
    
    
    
    '----------------- Decodierung für die 7 Segment Anzeige -----------------------
    
    Function Segmentdecoder(byval C As String) As Byte
       Select Case C
          Case "0" : Segmentdecoder = &B00111111                ' Bit 0 = Segment A
          Case "1" : Segmentdecoder = &B00000110                ' Bit 1 = Segment B
          Case "2" : Segmentdecoder = &B01011011                ' Bit 2 = Segment C
          Case "3" : Segmentdecoder = &B01001111                ' Bit 3 = Segment D
          Case "4" : Segmentdecoder = &B01100110                ' Bit 4 = Segment E
          Case "5" : Segmentdecoder = &B01101101                ' Bit 5 = Segment F
          Case "6" : Segmentdecoder = &B01111101                ' Bit 6 = Segment G
          Case "7" : Segmentdecoder = &B00000111                ' Bit 7 = Segment dp
          Case "8" : Segmentdecoder = &B01111111
          Case "9" : Segmentdecoder = &B01101111
          Case "." : Segmentdecoder = &B10000000
          Case "C" : Segmentdecoder = &B00111001                'C Buchstabe
          Case "-" : Segmentdecoder = &B01000000                'Minus Zeichen
          Case "°" : Segmentdecoder = &B01100011                'Grad Zeichen Alt 248
          Case " " : Segmentdecoder = &B00000000                'Leerzeichen
    
          Case Else : Segmentdecoder = &B00000000               ' unerwartes Zeichen keine Ausgabe
    End Select
    
                                                 'Bit   Segmente
    
                                                 '   || G | F | E | D | C | B | A |
                                                 ' --||---+---+---+---+---+---+---|
                                                 ' 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
                                                 ' 1 || 0 | 0 | 0 | 0 | 1 | 1 | 0 |
                                                 ' 2 || 1 | 0 | 1 | 1 | 0 | 1 | 1 |
                                                 ' 3 || 1 | 0 | 0 | 1 | 1 | 1 | 1 |
                                                 ' 4 || 1 | 1 | 0 | 0 | 1 | 1 | 0 |
                                                 ' 5 || 1 | 1 | 0 | 1 | 1 | 0 | 1 |
                                                 ' 6 || 1 | 1 | 1 | 1 | 1 | 0 | 1 |
                                                 ' 7 || 0 | 0 | 0 | 0 | 1 | 1 | 1 |
                                                 ' 8 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
                                                 ' 9 || 1 | 1 | 0 | 1 | 1 | 1 | 1 |
                                                 ' C || 0 | 1 | 1 | 1 | 0 | 0 | 1 |
                                                 ' - || 1 | 0 | 0 | 0 | 0 | 0 | 0 |
                                                 ' ° || 1 | 1 | 0 | 0 | 0 | 1 | 1 |
    
    
    End


    Zitat Zitat von PicNick
    .. eine Fehlermeldung welche ich nicht deuten kann.
    Wenn du sie auch anhängst, können wir es ja mal versuchen, zu deuten.
    [/code]

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    41
    Beiträge
    982
    nim die mcsbyte.lbx raus! dann klapts auch mit den words... für RC5 brauchst du die nicht...

    gruss Bluesmash

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    16.03.2007
    Beiträge
    27
    Vielen Dank Bluesmash,

    genau da lag der Fehler. Da wäre ich nie drauf gekommen. Vielen Herzlichen Dank für Deine Hilfe.

    Grüße aus Nürnberg

    Richard


    Zitat Zitat von Bluesmash
    Hallo!

    folgende lib solltest du nicht einbinden:
    $lib "mcsbyte.lbx"

    soweit ich weiss bringt das nur etwas wenn man im code nur bytes definiert, dann mancht Bascom irgendeine byte optimierung...

    gruss bluesmash

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad