Frequenzmesser stimmt nicht

Gast #2261738
Lesenswert?

Hallo,
ich bin hier mit einem Kollegen seit Stunden am überlegen wieso unser 
kleiner Frequenzmesser nicht das anzeigt was er soll.

Wir wollen 100Hz messen, haben dafür ein AtMega168 mit internen 8MHz 
genommen, der per Timer1 die Zeit messen soll.

Wir prüfen das Signal einfach in der Main-Schleifen, wollten kein 
INT0-Interrupt, sollte eig. auch so gehen.

Mit einem Prescaler von 1024 kommen wir dann auf 7812,5Hz, mit der sich 
der TCNT0 um eins erhöht. Ein Overflow sollte es nicht geben, da erst ab 
einer gemessenen Frequenz von ca 30Hz der TCNT0 bei 256 ist.

Jetzt sollte uns unser LCD irgendwas um die 70 ausgeben (1/100Hz / 
1/7812.5Hz = 78,125)

Nur unser Display zeigt jetzt dauerhaft "24" an. Das können wir uns 
nicht erklären. Jemand eine Idee?

MfG
Angehängte Dateien:
Gast #2261891
Lesenswert?

Hallo,

bin zwar net der C-progger.....

>> der per Timer1 die Zeit messen soll.

jo timer starten ist ok also TIMER 1


>> Wir prüfen das Signal einfach in der Main-Schleifen, wollten kein
>> INT0-Interrupt, sollte eig. auch so gehen.

ob nun pollen oder über Int ist egal aber ich bin der Meinung, mal was 
gelesen zu haben das der jeweilige Pin nur eine Frequenz von 1/4 des 
Taktes sein sollte... aber mit 100Hz ist das eigentlich auch weit unter 
1/4 des Taktes.


>> Mit einem Prescaler von 1024 kommen wir dann auf 7812,5Hz, mit der sich

wie kommt man auf 7812,5Hz????? ausser eure Taktfrequenz ist
z.B. 8Mhz/1024= 7812,5Hz????? stimmt das denn??????? und wenn ihr das so 
berechnet solltet ihr noch mal das DB studieren denn so wird das nichts


>> der TCNT0 um eins erhöht.
warum denn nun der TCNT0 ?????? vorher wars der TIMER 1 = TCNT1x

??????
Gast #2261908
Lesenswert?

Ähm, natürlich ist es Timer0. Wenn du ein Blick in den Quellcode 
geworfen hättest, wär es dir aufgefallen.

Zu deinem vorletzten (fragezeichenbehafteten) Absatz: Hättest du 
außerdem meinen Post gelesen, hättest du gesehen dass wir wirklich mit 
8MHz arbeiten. Wieso sollte das nicht funktionieren?

Irgendwer anders eine -sinvolle- Anregung?
Gast #2261924
Lesenswert?

>> Hättest du außerdem meinen Post gelesen....
dann wüsstest du
>>>> bin zwar net der C-progger.....

oh 8Mhz habe doch glad überlesen den kommentar sry

aber vielleicht hilft das

>> ISR (TIMER0_OVF_vect)
>> {
>>  lcd_setcursor( 0, 1 );
>>  lcd_string("--- OVERFLOW");
>> }

ooooohh no warum denn sowas nur soviel wie nötig in der ISR bearbeiten
siehe **** könnte man hier neu laden wenn

um die Zeit zu berechnen gehts wie folgt

BITS= 8bit/ 16bittimer??????

z.B.:

t=  1/Taktfrequenz  Teiler  BITS = 1/8Mhz  1024  256 = 0,065536s

****die 256 bits müssen in das entsprechende TCNTX vorgeladen werden und

d.h. alle 65,536ms wird ein Overflow generiert
Gast #2261944
Lesenswert?

Ist ja nett dass du uns helfen willst, aber wenn du nicht anfängst 
Satzzeichen und Grammatik zu beachten wird dich auch weiterhin keiner 
verstehen.
Außerdem ich will gar kein Overflow Interrupt haben, wie ich in meinem 
Post bereits erwähnt habe.
TCNT0 dient einzig und allein der Zeitmessung, der Overflow ist eine 
provisorische Exception-Ausgabe, sollte aber niemals 255 erreichen, 
außer ich messe eine Frequenz unter 30,5Hz (7812,5Hz / 256 = ~30,5Hz).
Messe ich aber nun erwünschte 100Hz ist TCNT0 ca bei 78 (siehe oben).
Gast #2261948
Lesenswert?

Und 1 / 8000000Hz  1024  256 ergibt bei meinem Taschenrechner 
0,032768. Aber der Wert ist nur der Grenzwert meines Messbereiches. 
Länger Takte als die ~0,033 kann ich nicht Messen, da dann mein TCNT0 
überläuft. Aber meine 100Hz entsprechen einer Taktdauer von 0,01s.

Die kleinste Taktdauer ist 1 / 8MHz * 1024 = 0,000128s.

So long...
Gast #2261953
Lesenswert?

Woher kommen denn die 100 Hz? Sinus oder Rechteck? Schon mal versucht in 
dem Teil der Schleife, wo ihr den Counter auslest, einen Pin zu toggeln 
und die Frequenz zu messen? Und ganz wichtig: Funktioniert denn die 
Ausgabe der Zahl auf dem Display so wie gedacht?
Gast #2261959
Lesenswert?

Die 100Hz kommen aus einem "Frequenzgenerator", einem Atmega8, dessen 
Frequenz berechnet ist und per Messgerät bestätigt ist. Also ist es ein 
schönes Rechtecksignal.

De Displayausgabe funktioniert einwandfrei. Wir hatten vorher andere 
Test, z.B. Sekunden seit Start anzeigen etc., ging einwandfrei.

Was genau meinst du mit "einen Pin zu toggeln"?
Gast #2261962
Lesenswert?

ich versteh dein Problem schon... vielleicht probier ich es mal 
einfacher

  ein Register X löschen
  T-Flag löschen (clt)
  Timer 0 initialsieren = starten nur für 1s oder 100ms oder 1ms usw....

count
    X wird incrementiert
;irgendwann hat Timer 0 den OVFL also wird die ISR angesprungen

    T-Flag = 1 ja springe zur Ausgabe
    T-Flag = 0 nein springe zu count

Ausgabe
    print X Ausgabe auf LCD

da nach mach irgentwas anderes


ISR
   T-Flag = 1 wird gesetzt
   ISR Ende mach in der countschleife weiter
Gast #2261977
Lesenswert?

graul schrieb:
> Was genau meinst du mit "einen Pin zu toggeln"?

Einen Pin als Ausgang setzten, abwechselnd ein- und ausschalten (im 
ersten Durchlauf einschalten, im zweiten ausschalten usw.) und die Zeit 
messen, die der Pin im gleichen Zustand ist. Dann könnte man die Zeiten 
mit denen vergleichen, die zu erwarten sind.
Gast #2261989
Lesenswert?

Ah, danke, aber ich hab den Fehler gefunden.
1
temp = TCNT0;
2
TCNT0 = 0;
3
up = 1;
4
//content
5
lcd_setcursor(0,2);
6
convRPM(temp);

...behebt das Problem. Meine LCD Routine hat Zeit gekostet, das hab ich 
vergessen zu berücksichtigen.

Schönen Abend noch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren