PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Byte Variable als Word umwandeln



rici35
06.07.2008, 07:45
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

PicNick
06.07.2008, 10:16
.. eine Fehlermeldung welche ich nicht deuten kann.
Wenn du sie auch anhängst, können wir es ja mal versuchen, zu deuten.

Bluesmash
06.07.2008, 10:56
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

rici35
06.07.2008, 11:18
Sorry,

hier der 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





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

Bluesmash
06.07.2008, 11:49
nim die mcsbyte.lbx raus! dann klapts auch mit den words... für RC5 brauchst du die nicht...

gruss Bluesmash

rici35
07.07.2008, 05:29
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



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