hat denn keiner eine Idee?!
mir ist noch so durch den Kopf geschossen, was wäre wenn der µC überlastet ist? Also wenn der zulange in der Anzeigen Routine hängt (Gosub Anzeige)
mal etwas übersichtlicher...
Code:'7Segmentanzeige mit 4 Anzeigen $regfile = "m8def.dat" 'AT-Mega8 $crystal = 8000000 '18432000 '18,4320MHz Quarz $baud = 9600 '38400 '_______________________________________________________________________________ Ddrb = &B11111111 'PortB = Ausgang (PB0=A usw.) Ddrd = &B1110011 'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT '_______________________________________________________________________________ Dim Anzeige_akt As Word 'Aktuelle Zeitmessung Dim Anzeige_str As String * 5 'Zeit als String Dim Anzeige_str_len As Byte 'String-Länge Dim Anzeige_ziffer As String * 1 'Aktuelle Ziffer Dim Anzeige_pos As Byte 'Aktuelle Ziffer im String Dim I As Byte 'Allgem. Laufzahl Dim Test As Integer '_______________________________________________________________________________ 'TIMER0 Konfiguration für Ziffernwechsel: Config Timer0 = Timer , Prescale = 64 ' Timer0 für Anzeige Const T0_preload = 130 ' Startwert Timer0 für 500Hz 'Tcnt0 = T0_preload On Timer0 Timer_irq_led ' Timer0-Overflow-Interrupt Enable Timer0 ' Timer0 starten Enable Interrupts 'Sreg.7 = 1 'Globale Interruptfreigabe '_______________________________________________________________________________ 'TIMER1 Konfiguration für Messzeit Lichtschranke: Config Timer1 = Timer , Prescale = 1024 Const Timervorgabe = 62000 '29535 -> 0,5 Hz On Timer1 Timer_irq_kmh 'Unteprogramm aufrufen Enable Timer1 Enable Interrupts '_______________________________________________________________________________ I = 1 Test = 1 Do ' Dauerschleife als Hauptprogramm Anzeige_akt = Test 'Zeit3 'Wert zum anzeigen Print Test Gosub Anzeige Loop '_______________________________________________________________________________ Timer_irq_led: 'nix Return Anzeige: Tcnt0 = T0_preload 'Timer wieder laden Anzeige_str = Str(anzeige_akt) ' Wert in String umwandeln Anzeige_str_len = Len(anzeige_str) ' Stringlänge messen Anzeige_pos = Anzeige_str_len - I Anzeige_pos = Anzeige_pos + 1 Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1) Portc = 0 'Ghosting vermeiden (Ziffern nicht Segmente) Select Case Anzeige_ziffer 'Ziffer auf Port 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 Else : Portb = 0 'NICHTS ANZEIGEN!!! Wenn Stelle leer!!! End Select 'Segment wählen If I = 1 Then Portc.1 = 1 'EINER If I = 2 Then Portc.2 = 1 'ZEHNER 'Portb.0 = 1 'mti einer Nachkommastelle End If If I = 3 Then Portc.3 = 1 'HUNDERTER If I = 4 Then Portc.4 = 1 'TAUSENDER I = I + 1 'Nächste Ziffer If I => 5 Then I = 1 'max Anzeigen +1 angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden) 'Timer0merker = Timer0merker + 1 '+1 um intMerker zurück zu setzen Return Timer_irq_kmh: 'Aufruf jede oder jede halbe Sekunde Timer1 = Timervorgabe 'AUF TIMER EINSTELLUNG ACHTEN!!!!!!! Incr Test Return







Zitieren

Lesezeichen