Hallo,
ich habe 4 7-Segmentanzeigen programmiert. zum testen wollte ich mit Timer1 die Variable Test hochzählen. Nur leider zählt der Timer nur bis 8 auf der 7-Segmentanzeige. Zur Kontrolle sende ich mit Print auf den PC mit dem Selben Ergebnis!?
Woran liegt das?
Tobias
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 'Config Int0 = Rising 'Falling 'wechsel von High auf Low 'Config Int1 = Rising 'Falling 'wechsel von High auf Low 'Enable Int0 'Enable Int1 'On Int0 Irq0 'On Int1 Irq1 '_______________________________________________________________________________ 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 Zeit As Word 'Dim Zeitfake As Word 'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!! 'gemessene Zeit von Timer1 'Dim Zeit1 As Single 'Dim Zeit2 As Single 'Dim Zeit3 As Single Dim Test As Integer 'Dim Int0_merker As Byte 'als verriegelung für den int0 Eingang 'Dim Int1_merker As Byte 'als verriegelung für den int1 Eingang 'Dim Timer0merker As Word 'um intMerker zurück zu setzen '_______________________________________________________________________________ '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 '_______________________________________________________________________________ 'Int0_merker = 0 'als verriegelung für den int0 Eingang 'Int1_merker = 0 'als verriegelung für den int1 Eingang I = 1 'Zeit = 0 'gemessene Zeit auf 0 setzen Test = 1 Do ' Dauerschleife als Hauptprogramm Anzeige_akt = Test 'Zeit3 'Wert zum anzeigen 'If Zeit =< 500 Or Zeit => 18615 Then 'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!! 'Zeitfake = 18616 'Else 'Zeitfake = Zeit 'End If 'Zeit1 = Zeit * 0.0058579 'Zeit2 = 109.05442 - Zeit1 'Zeit3 = Zeit2 * 10 'damit ich eine nachkommastelle habe!!! 'If Timer0merker => 1000 Then 'Timer0merker = 0 'Int0_merker = 0 'als verriegelung für den int0 Eingang 'Int1_merker = 0 'als verriegelung für den int1 Eingang 'End If Print Test Gosub Anzeige Loop '_______________________________________________________________________________ Timer_irq_led: 'Gosub Anzeige 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