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
.. 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, 11: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
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, 12:49
nim die mcsbyte.lbx raus! dann klapts auch mit den words... für RC5 brauchst du die nicht...
gruss Bluesmash
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.