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
Lesezeichen