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






Zitieren

Lesezeichen