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
Keiner eine Idee? Oder sieht alles richtig aus und wir müssen wo anders nach dem Problem suchen?
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 ??????
Ä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?
>> 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
sry für die komische Gleichung t= 1/Taktfrequenz mal Teiler mal BITS = 1/8Mhz mal 1024 mal 256 = 0,065536s
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).
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...
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?
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"?
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.