Hallo linux_80,
ich habe jetzt Version 1.11.9.2 installiert und habe NUR die Zeile: Case " " : Portb = 0
eingefügt und schon kommt der Fehler.
Kannst du bitte den Code mal bei die compilieren und mir sagen ob es geht?
Tobas
Code:
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 8000000 'Quarz: 8 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud
'-------------------------------------------------------------------------------
'Konfiguration Ein- / Ausgänge
Ddrb = &B11111111 '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang
Ddrc = &B1111110 '1 Ausgang, 0 Eingang => Pin PC6-1 als Ausgang; 0 als Eingang
Ddrd = &B11110001 '1 Ausgang, 0 Eingang => Pin PD7-4,0 als Ausgang; 1-3 als Eingang
'-------------------------------------------------------------------------------
'Konfiguration LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.0 , Rs = Portc.6
Cursor Off Noblink
'-------------------------------------------------------------------------------
'Konfiguration ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'-------------------------------------------------------------------------------
'Konfiguration Timer0
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer0_isr
Const Timervorgabe0 = 230 '312 mal / Sekunde!!!
Enable Timer0
Enable Interrupts
'-------------------------------------------------------------------------------
'Konfiguration Timer1
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_isr
Const Timervorgabe1 = 55118 '3 mal / Sekunde!!!
Enable Timer1
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen Anzeige:
Dim Wert As Long ' (-2147483648 bis 2147483647)
Dim Wert_pos As Word 'gewandelter wert
Dim Negativ As Bit 'Merker = 1 wnn Wert negativ!
' variablen für die display routine
Dim Wertstr As String * 5
Dim Y As Byte
Dim Tempbyte As Byte
' Variable für Digitansteuerung
Dim Digit As Byte
'Anzeige im Ganzen
Dim Fivedigitdisplay As String * 5
Dim Umdreh As Byte
'führende Nullen entfernen
Dim Digit_aus As Bit 'Merker =0 wenn Stelle =0
'ADC
Dim Analog_in0 As Long 'Word '=0-1023 vom Analogeingang
Dim Pro1 As Integer
Dim Pro2 As Single
Dim Pro3 As Integer
Dim Proz_anzeige As Byte
'Variablen LCD
Dim Ani_1 As Integer 'Zähler für Startannimation LCD
Dim Ende As Word 'zum Animation beenden
'Variablen Taster
Dim S1 As Bit 'Schalter 1
Dim S2 As Bit 'Schalter 2
Dim S2_m As Bit
Dim S3 As Bit 'Schalter 3
Dim S3_m As Bit 'Schalter 3 MERKER
Dim Taste_s1 As Word
'Programmverteilung über Timer0
Dim Zeit As Word 'wird 312 mal / Sekunde mit 1 addiert
'Variablen zum testen......
Dim Test2 As Integer 'zum hochzählen zum testen
Dim Test As Integer
'-------------------------------------------------------------------------------
'Annimation LCD
Goto Sprung
Do
Cls
For Ani_1 = 16 To 1 Step -1 'Von 1 bis 16 wird gezählt
Locate 1 , Ani_1 'Die entsprechende Position im Display anwählen.
Lcd "> TOBIAS BLOME <"
Waitms 250
Next
Locate 2 , 1
Lcd "BI - EMR 10/2008"
Waitms 500
Locate 2 , 1
Lcd " "
Waitms 500
Locate 2 , 1
Lcd "BI - EMR 10/2008"
Waitms 500
Locate 2 , 1
Lcd " "
Waitms 500
Locate 2 , 1
Lcd "BI - EMR 10/2008"
Wait 3
Loop Until Ende => 1
Sprung:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Setzen:
Digit_aus = 0
'alle Segmente aus
Portb = 0
Digit = 0
Test2 = 9900
Start Adc
Do
'---Programm aufteilen---
If Zeit => 150 Then 'also eine halbe Sekunde
Zeit = 0 'Zeit zurücksetzen
End If
'---ENDE Programmaufteilung---
'zum testen um etwas zu "sehen"
' Incr Test
' If Test = 10 Then
' Test = 0
' Incr Test2
' End If
' If Test2 > 99999 Then
' Test2 = 0
' End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Timer0_isr: 'Timer1-Interruptroutine (312 x pro Sekunde)
'-------------------------------------------------------------------------------
Timer0 = Timervorgabe0
Gosub 7seganzeige 'Routine für 7 Segmentanzeige
Incr Zeit 'Zeitgeber
If S1 = 1 Then 'soll nur hochgezählt werden, wenn Taste links gedrückt
Incr Taste_s1 'wenn taste lange gedrückt soll etwas passieren (LCD "e" wechsel)
Else
Taste_s1 = 0
End If
Return
'-------------------------------------------------------------------------------
Timer1_isr: 'Timer1-Interruptroutine (3 x pro Sekunde)
'-------------------------------------------------------------------------------
Timer1 = Timervorgabe1
Analog_in0 = Getadc(0) 'Analog in Variable schreiben
Wert = Analog_in0 - 500 'Wert für Anzeige
If Wert < 0 Then 'wenn wert negativ
Wert_pos = Wert * -1
Negativ = 1
Else
Wert_pos = Wert
Negativ = 0
End If
'Print "Digit0: " ; Digit0
'Print "Digit1: " ; Digit1
'Print "Digit2: " ; Digit2
'Print "Digit3: " ; Digit3
Return
'-------------------------------------------------------------------------------
Analog:
'Analogeingänge Auslesen:
'-------------------------------------------------------------------------------
'Analog_in0 = Getadc(0) 'Analog in Variable schreiben
' Wert = Analog_in0 'Wert für Anzeige
' Pro1 = Analog_in0 - 204 'Prozent1Wert analog 204-1005 also -204 = 0-801
' Pro2 = Pro1 * 0.12484 'Rechnen: 100% / max(801) = 0.12484
' Pro3 = Round(pro2)
' If Pro3 > 100 Then 'damit keine größenren Werte als 100% auf dem LCD stehen
' Pro3 = 100
' End If
'
' If Pro3 < 0 Or Pro3 > 110 Then 'wenn errechneter %Wert falsch (kleiner 0 oder größer 110 dann immer 0 (110 wegen 4-20mA Ungenauigkeit)
' Proz_anzeige = 0
' Else
' Proz_anzeige = Pro3
' End If
'-------------------------------------------------------------------------------
7seganzeige:
' Code 7 Segmentanzeige:
'-------------------------------------------------------------------------------
'Formatiere das Display
Wertstr = Str(wert_pos)
Fivedigitdisplay = Format(wertstr , "00000") 'Nullen geben die Anzahl der Stellen an, damit die Stellen richtig gesetzt werden
' jeder Lauf durch die Hauptschleife zeigt ein anderes Digit
Incr Digit
'Waitms 6 'Zeit für die Anzeige (je länger wait desto mehr flackert es)
Portb = 0 'Ghosting vermeiden
If Digit = 5 Then 'mache das , bis 5 erreicht ist
Digit = 0
End If
' addiere 1 zum Digitcounter, weil MID 1-basiert ist
Y = Digit + 1
' und hol das Digit, das wir brauchen
Wertstr = Mid(fivedigitdisplay , Y , 1)
'Anzeige auswählen
Tempbyte = 2 ^ Digit 'Tempbyte = 1,2,4,8,16
'Digitansteuerung auf portC: PC1-5
Umdreh = Tempbyte * 2 'Umdreh = 2,4,8,16,32
'Ansteuerung umdrehen für gemeinsame Anoden
Portc = Umdreh 'Port für die Stellen auswahl
'Führende Nullen entfernen:
'INFO:
'wertstr hat immer nur eine Ziffer und wechselt also nacheinander alle 5 Stellen durch!
'wenn wertstr = 0 ist dann wird nachgesehen, in welchem Digit (Stelle) wir uns befinden.
'wenn Digit = 0 -also die ganz linke Stelle- dann auf jeden Fall Portc.1 = 0 (Transistor der Stelle) abschalten
'Digit0 = 0 -> ist nur ein Merker für die folgenden Stellen d.h.
'wenn wertstr=0 dann fragen ob Digit=1 (also 2te Stelle von links) UND der Merker Digit0=0
'dann Transistor abschalten und weiteren Merker für diese Stelle setzen
'ZehnTausenderstelle
If Val(wertstr) = 0 Then 'Führende Null wegblenden
If Wert => 0 Then 'Wert muss = > 0 sein wegem negativen Vorzeichen
If Digit = 0 Then : Portc.1 = 0 : Digit_aus = 0 'C.1=Digit Transistor
End If
End If
Else
Digit_aus = 1
End If
'Tausenderstelle
If Val(wertstr) = 0 Then 'Führende Null wegblenden
If Digit = 1 And Digit_aus = 0 Then : Portc.2 = 0 : Digit_aus = 0 'C.2=Digit Transistor
End If
Else
Digit_aus = 1
End If
'Hunderterstelle
If Val(wertstr) = 0 Then 'Führende Null wegblenden
If Digit = 2 And Digit_aus = 0 Then : Portc.3 = 0 : Digit_aus = 0 'C.3=Digit Transistor
End If
Else
Digit_aus = 1
End If
''ENTFERNT WEIL MIT KOMMASTELLE UND DANN MUSS IN DER LETZTEN STELLE NE NULL STEHEN UND DARF NICHT AUSGEBLENDET WERDEN!!!
''Zehnerstelle
'If Val(wertstr) = 0 Then 'Führende Null wegblenden
' If Digit = 3 And Digit_aus = 0 Then : Portc.4 = 0 : Digit_aus = 0 'C.4=Digit Transistor
' End If
' Else
' Digit_aus = 1
'End If
'Dieser Teil erledigt die Wandlung in 7 Segment Code
'Für Anzeigen mit gemeinsamer Anode
Select Case Val(wertstr)
Case 0 : Portb = 126 'NULL
Case 1 : Portb = 12 'EINS
Case 2 : Portb = 182 'ZWEI
Case 3 : Portb = 158 'DREI
Case 4 : Portb = 204 'VIER
Case 5 : Portb = 218 'FÜNF
Case 6 : Portb = 250 'SECHS
Case 7 : Portb = 14 'SIEBEN
Case 8 : Portb = 254 'ACHT
Case 9 : Portb = 222 'NEUN
Case " " : Portb = 0
'Case Else : Portb = 128 'mittleres Segment
Case Else : Portb = 226 '"F"
End Select
'Minusvorzeichen
If Digit = 0 And Negativ = 1 Then
Portb = 128 'mittleres Segment
End If
'Komma setzen
'If Portc = 2 Then Portb.0 = 1 '4 Kommastellen
'If Portc = 4 Then Portb.0 = 1 '3 Kommastellen
'If Portc = 8 Then Portb.0 = 1 '2 Kommastellen
If Portc = 16 Then Portb.0 = 1 '1 Kommastelle
'negatives Vorzeichen setzen
If Portc = 2 Then 'wenn Pin gem. Anode ganz linke Stelle gesetzt
If Wert < 0 Then 'wenn Wert kleiner 0
Portb = 128 'Binär 1000 0000 -> Dezimal = 128 (nur Segment G)
End If
End If
'-------------------------------------------------------------------------------
Anzeige1:
'-------------------------------------------------------------------------------
Return
'-------------------------------------------------------------------------------
Anzeige2:
'-------------------------------------------------------------------------------
Return
'-------------------------------------------------------------------------------
Anzeige3:
'-------------------------------------------------------------------------------
Return
Lesezeichen