PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer zählt nicht weiter?



TobiasBlome
27.02.2008, 21: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

TobiasBlome
28.02.2008, 16:31
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...



'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