Forum: Mikrocontroller und Digitale Elektronik Frequenzmesser stimmt nicht


von graul (Gast)


Angehängte Dateien:

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

von graul (Gast)


Lesenswert?

Keiner eine Idee? Oder sieht alles richtig aus und wir müssen wo anders 
nach dem Problem suchen?

von chris (Gast)


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

??????

von graul (Gast)


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?

von chris (Gast)


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

von chris (Gast)


Lesenswert?

sry für die komische Gleichung

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

von graul (Gast)


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).

von graul (Gast)


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...

von Marco (Gast)


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?

von graul (Gast)


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"?

von chris (Gast)


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

von Marco (Gast)


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.

von graul (Gast)


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.

von h2o (Gast)


Lesenswert?

Nur eine Vermutung ist das fuse divide by 8 gesetzt vielleicht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.