TobiasBlome
27.02.2008, 22:16
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
'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
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
'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