PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Zähler



moin
07.01.2007, 07:12
Hallo,
Mein Programm soll später mal ein Frequenzzähler werden.
Mit Timer0 wird ein Zeitfenster vorgegeben in dem die Impulse gezält werden.
Wenn ich TTL-Impulse von einem Tongenerator einspeise (ATMEGA8 PD5 T1) erhalte ich keine Reaktion.
Wo liegt mein Fehler?


'Dieses Programm soll mal ein Frequenzzähler werden, wenn es groß ist ;-)
'Mit Timer0 wird später ein Zählfenster von einer Sek eingestellt.

'Mein Problem ist, dass ich imPulse die ich an T1 (PD5) anlege
'nicht zählen kann. Ich erhalte immer 0 ??????
'Wo ist mein Fehler?




$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400

Dim Var1 As Byte
Dim Freq As Long
Dim W As Long

Print "hallo" 'zum Überprüfen der Verbindung

Config Portb = Output
Config Portd = Input

Config Timer1 = Counter , Edge = Rising , Prescale = 1
Enable Timer1 'Counter1 Einstellungen
On Timer1 Pulses
Enable Interrupts
Timer1 = 0


Config Timer0 = Timer , Prescale = 1024 'Konfiguriere Timer0
Enable Timer0 'Torzeit für Messung
On Timer0 Sek
Enable Interrupts
Timer0 = 9



Do
'....Hauptprogramm
Loop
End


'Interruptroutinen Von Timer0 Und Counter1

Sek:
Incr Var1
If Var1 = 2 Then
Freq = W + Timer1
Var1 = 0
Timer0 = 0
Toggle Portb.1

Print Freq
Print W

End If
Return


Pulses:
W = W + 65536
Print "W"
Print W
Return

moin
07.01.2007, 10:00
Ich habe nun einen meiner Fehler gefunden, auch wenn das Programm noch nicht richtig funktioniert:
Der Fehler war bei der Counter-Initialisierung der Zusatz "Prescaler".
Jetzt habe ich ihn entfernt und das Zhälen funktioniert bis auf folgendes Problem:
Alle 7 Messungen erhalte ich eine Fehlmessung
Wenn ich z.B. eine Frequenz um 1Mhz anlege wird folgendes ausgegeben
hallo
hallo
988549 983040
998130 983040
1007712 983040
1017545 983040
1027379 983040
1037212 983040
1047048 983040
1056887 1048576
1001440 983040
1011281 983040
1021125 983040
1030970 983040
1040818 983040
1050667 1048576
995230 983040
1004832 983040
1014685 983040
1024539 983040
1034396 983040
1044254 983040
1054116 1048576

Könnt ihr den Fehler finden?

Gruß
moin




'Dieses Programm soll mal ein Frequenzzähler werden, wenn es groß ist ;-)
'Mit Timer0 wird ein Zählfenster von ca. einer Sek eingestellt.

'Mein Problem ist, dass ich imPulse die ich an T1 (PD5) anlege
'zwar zählen kann, aber nicht richtig

'Alle 7 Messungen erhalte ich eine Fehlmessung

'Wo ist mein Fehler?




$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400

Dim Var1 As Byte
Dim Freq As Long
Dim W As Long

Print "hallo" 'zum Überprüfen der Verbindung

Config Portb = Output
Config Portd = Input

Config Timer1 = Counter , Edge = Rising
Enable Timer1 'Counter1 Einstellungen
On Timer1 Pulses
Enable Interrupts
Timer1 = 0


Config Timer0 = Timer , Prescale = 1024 'Konfiguriere Timer0
Enable Timer0 'Torzeit für Messung
On Timer0 Sek
Enable Interrupts
Timer0 = 9



Do
'....Hauptprogramm
Loop
End


'Interruptroutinen Von Timer0 Und Counter1

Sek:
Incr Var1
If Var1 = 62 Then
Freq = W + Timer1
Var1 = 0

Toggle Portb.1

Print Freq ; " " ; W
'Print W
Timer0 = 0
W = 0

End If
Return


Pulses:
W = W + 65536
'Print "W"
'Print W
Return[/code]

moin
07.01.2007, 10:18
Ich war entwas undeutlich in meiner Fehlerbeschreibung:
Die gemessene Frequenz (1. Wert) steigt immer. Das kann ein Fehler im Programm sein oder ein "Fehler" im Frequenzgenerator. Ich vermute eher einen Fehler im Programm, kann ihn aber nicht finden.

HansHans
07.01.2007, 13:32
Hallo,
Da fehlt ein
Timer 1 = 0 oder ?

Teste mal das:




.
.
.
Sek:
Incr Var1
If Var1 = 62 Then
Disable Interrupts
Freq = W + Timer1
Var1 = 0

Toggle Portb.1

Print Freq ; " " ; W
'Print W
Timer0 = 0
W = 0
Timer1 = 0

Enable Interrupts
End If
Return
.
.