Guten Abend,
ich habe folgendes Problem...
Ein Timer "1ms" ruft mir eine Routine auf & soll prüfen wie lange der
Eingang auf einen gewissen Pegel ist. Leider klapppt das nicht ganz.
Wenn eine neue Minute anfängt, sollte die Low Phase ja ca 2000ms lang
sein.
Diese kann ich mit meinem AVR leider nicht zählen / empfangen.
1
/* >1500 ms low? */
2
if( dcf_cntL >= 1500 )
3
{
4
dcf_available = true;
5
dcf_value = DCF_START;
6
dcf_cntL = 0;
7
PORTB |= (1<<PB7);
8
}
wenn ich 1500 jedoch auf 800 setze, empfange ich den neubeginn der
Minute sauber. Was kann das blos sein? Habe ich evtl. doch den Timer
falsch konfiguriert?
Wahrscheinlich macht dein "1ms"-Timer nicht das, was er soll.
Hier haben schon 1000 Leute eine DCF-Uhr gebastelt.
Dein Ansatz ist etwas übertrieben: Mit einem 10 ms Raster
kann man ausreichend genau die Zeiten von 100 ms, 200 ms,
1000 ms und 2000 ms auseinanderhalten.
Hallo Jan,
die einzige konstante Zeit ist 2ms, nämlich immer dann wenn dein Pin auf
High geht. Falls du beide Flanken auswertest, fehlt dir immer 3ms in der
kein Flankenwechsel statt findet.
So habe ich zumindest deinen Screenshot gedeutet.
Gruß
Jochen
Sorry, bei Zeitablenkung von 2ms/div kommt die steigende Flanke
natürlich nur alle 4ms....
Jochen S. schrieb:> Hallo Jan,>> die einzige konstante Zeit ist 2ms, nämlich immer dann wenn dein Pin auf> High geht. Falls du beide Flanken auswertest, fehlt dir immer 3ms in der> kein Flankenwechsel statt findet.>> So habe ich zumindest deinen Screenshot gedeutet.>> Gruß> Jochen
Ich habe laut dem AVR Calculator genau die Werte errechnet :(
Hier ist meine Konfig vom Timer. Vill. seht ihr ja auf anhieb einen
Fehler? Es handelt sich hier um einen MEGA2560.
Jochen S. schrieb:> Sorry, bei Zeitablenkung von 2ms/div kommt die steigende Flanke> natürlich nur alle 4ms....
Ich zähle nur die Impuls der High / Low Phasen.
Mit Flankenerkennung mach ich nichts.
Jan schrieb:> Ich habe laut dem AVR Calculator genau die Werte errechnet :(> Hier ist meine Konfig vom Timer. Vill. seht ihr ja auf anhieb einen> Fehler? Es handelt sich hier um einen MEGA2560.>>
> OCR1AL |= 0x7C; // Low Register --> Value for 1ms ( 0x00F9Hex ) Page
8
> 159
9
>
Von welcher Taktfrequenz des µC ist auszugehen.
Machs doch nicht so kompliziert.
Es gibt keinen Grund warum du dir selbst die Mühe machen sollst, den
Wert in High und Low Byte aufzudröseln
1
OCR1A=0x007C;// oder doch 0x00F9?
weiters gibt es keinen Grund, den Wert in Hex anzugeben.
1
OCR1A=124;
und weiters gibt es keinen Grund, den Wert selber auszurechnen.
1
OCR1A=(F_CPU/64/1000)-1;
F_CPU, weil der Timer in 1 Sekunde genau soviele Takte zählen würde
Fast. Denn durch den Vorteiler von 64 macht er genau nur ein 64-tel
davon.
Jetzt willst du nicht wissen, wieviele Takte er in 1 Sekunde macht,
sondern in einem Tausendstel davon.
Und davon noch 1 weg, weil der CTC Übergang auf 0 ja auch ein Taktzyklus
ist.
ALso: wie gross ist F_CPU? Wie schnell wird der µC getaktet?
Jan schrieb:> Wieso gibt es dann ein "OCR1AL" & "OCR1AH" Register?
16 bit Timer (Achtung nicht alle haben 16 Bit!)
Karl Heinz schrieb:>> OCR1AH |= 0x00; // High Register>> OCR1AL |= 0x7C; // Low Register --> Value for 1ms ( 0x00F9Hex ) Page
und das OCR1AH zu verodern ist keine gute Idee
aber als OCR1A=
wie vorgeschlagen wäre eine gute Idee
Karl Heinz schrieb:
Jan schrieb:> Hallo Karl Heinz,>> Wieso gibt es dann ein "OCR1AL" & "OCR1AH" Register?
Weil es die Regiuster tatsächlich gibt.
Aber: Das weiß auch dein Compiler. Der macht die Aufteilung für dich.
>> Die CPU Arbeitet mit 8Mhz.
Dann stimmen die 124
Schreibs trotzdem als Formel hin. Ist auf lange Sicht einfacher, wenn du
den Compiler rechnen lässt.
Lass den Compiler für dich arbeiten! Der macht nämlich weniger Fehler.
Jan schrieb:> Joachim B. schrieb:>> und das OCR1AH zu verodern ist keine gute Idee>> Sorry, warum nicht?
weil du dort definitiv einen bestimmten Wert drinn stehen haben willst!
Und zwar unabhängig davon, was vorher drinn stand.
Wenn du i auf 5 haben willst, dann schreibst du ja auch
1
i=5;
und nicht
1
i|=5;
und machst dich damit angreifbar und abhängig davon, welchen Wert i
vorher hatte.
Jan schrieb:> Joachim B. schrieb:>> OCR1A = ( F_CPU 64 1000 ) - 1;>> Wird die Zeit immer in µs angegeben?
?
Dir scheint nicht klar zu sein, was hier eigentlich gerechnet wird!
Wenn dein µC mit 8Mhz betrieben wird und du einen Vorteiler von 1
hättest, wie weit würde der Timer dann in 1 Sekunde zählen?
Na bis 8000000, weil ja der Takt 8Mhz ist.
Jetzt hast du keinen Vorteiler von 1, sondern einen Vorteiler von 64.
D.h. der Timer zählt nur jeden 64ten Haupttakt.
Wie weit kommt er dann in 1 Sekunde?
Na logischereweise nur bis zu einem 64tel von 8000000.
Das wären 125000.
Wenn du also den Timer bis 125000 zählen lassen würdest, dann würde das
genau 1 Sekunde langh dauern
Jeztt bist du aber nicht an 1 Sekunde interessiert, sondern an 1
Millisekunde. Also einem Tausendstel einer Sekunde.
Wie weit muss man daher den Timer zählen lassen, damit dieses zählen
genau 1/1000 Sekunde dauert.
Na, ein Tausendtel von 125000. Das macht 125
Wenn der Timer also (mit der Takteinstellung) 125 mal zählt, dann dauert
das 1 Millisekunde.
FAQ: Timer
Ein bischen überlegen, etwas 3 Satz und man braucht keine derartigen
Timer-Rechner.
Danke Karl Heinz!
Hast du dir meinen Quellcode mal anschauen können? Bei anderen klappt
die Auswertung ja auch. Ich weiß echt nicht was ich falsch mache. Der
Empfang ist prima.
Jan schrieb:> Danke Karl Heinz!>> Hast du dir meinen Quellcode mal anschauen können?
Nur schnell überflogen ohne gross durchdenken.
> Bei anderen klappt> die Auswertung ja auch. Ich weiß echt nicht was ich falsch mache. Der> Empfang ist prima.
Lass dir mal die gemessenen Zeiten wo ausgeben. Auch die für die Low
bzw. Highs, die festgestellt werden.
Hallo Jan,
schau Dir doch mal die diversen F_CPU-Definitionen in Deinen
Code-Bausteinen angeschaut?
Das findet sich in clock.c
#ifndef F_CPU
#define F_CPU 16000000
#endif
das in DCF77_Encode.c
/* Setting for the Crystal */
#ifndef F_CPU
#define F_CPU 8000000
#endif
Wat denn nu? Und welche Definition wird denn wohl gezogen?
Dein Oszi Bild ist seltsam.
Der Abstand zwischen den steigenden Flanken beträgt 4ms. Das hätte ich
jetzt so nicht erwartet.
mach da mal
1
voiddcf_check(void)
2
{
3
4
PORTB^=(1<<PB7);
5
6
...
ganz am Anfang rein und miss noch mal (alle anderen Portzugriff auf PB7
still legen!).
Ich hab so den Verdacht, dass deine 8Mhz nicht stimmen und es in
Wirklichkeit nur 4Mhz sind.
Dieter Frohnapfel schrieb:> Hallo Jan,>> schau Dir doch mal die diversen F_CPU-Definitionen in Deinen> Code-Bausteinen angeschaut?>> Das findet sich in clock.c
Hallo Dieter,
Die "clock.c" habe ich nicht mit eingebunden.
Karl Heinz schrieb:> Dein Oszi Bild ist seltsam.>> Der Abstand zwischen den steigenden Flanken beträgt 4ms. Das hätte ich> jetzt so nicht erwartet.>> mach da malvoid dcf_check (void)> {>> PORTB ^= ( 1 << PB7 );>> ...> ganz am Anfang rein und miss noch mal (alle anderen Portzugriff auf PB7> still legen!).>> Ich hab so den Verdacht, dass deine 8Mhz nicht stimmen und es in> Wirklichkeit nur 4Mhz sind.
Ich werde heute abend mal ein Screenshot posten, von meinen Fuses.
Der Quarz ist aufjedenfall auf "INT8MHZRC" eingestellt.
Du hast nicht zufällig alles (FUSES) im Auslieferungszustand belassen?
The device is shipped with inte
rnal RC oscillator at 8.0MHz a
nd with the fuse CKDIV8 pro-
grammed, resulting in 1.0MHz system clock
Dieter Frohnapfel schrieb:> The device is shipped with inte> rnal RC oscillator at 8.0MHz a> nd with the fuse CKDIV8 pro-> grammed, resulting in 1.0MHz system clock
Das werde ich mir heute abend noch mal direkt anschauen. Soweit ich das
weiß, war die CKDIV8 Fuse nicht gesetzt. Nur die 8MHZ.
TCCR1A |= (1<<WGM11); // CTC (Mode 2) Page 184
Sollte das nicht Mode 4 und damit WGM12 sein?
Für Timer1 entnehme ich das so dem Datenblatt ... Mode 2 ist PWM bis
TOP-Wert 0x01FF - oder?
Dieter Frohnapfel schrieb:> TCCR1A |= (1<<WGM11); // CTC (Mode 2) Page 184>> Sollte das nicht Mode 4 und damit WGM12 sein?>> Für Timer1 entnehme ich das so dem Datenblatt ... Mode 2 ist PWM bis> TOP-Wert 0x01FF - oder?
Jep. Dieter hat hier einen Punkt. Das lese ich ebenfalls aus dem
Datenblatt.
Und Achtung: WGM12 ist nicht in TCCR1A sondern in TCCR1B!
Karl Heinz schrieb:> Jep. Dieter hat hier einen Punkt. Das lese ich ebenfalls aus dem> Datenblatt.>> Und Achtung: WGM12 ist nicht in TCCR1A sondern in TCCR1B!
Mode "2" ist doch ClearCompareMatch oder nicht ? Müsste ich Mode "4"
nehmen?
Jan schrieb:> Karl Heinz schrieb:>> Jep. Dieter hat hier einen Punkt. Das lese ich ebenfalls aus dem>> Datenblatt.>>>> Und Achtung: WGM12 ist nicht in TCCR1A sondern in TCCR1B!>> Mode "2" ist doch ClearCompareMatch oder nicht ?
Wo siehst du nach?
Datenblatt
http://www.atmel.com/images/doc2549.pdf
Seite 148. Die Tabelle 17.2
Karl Heinz schrieb:> Jan schrieb:>> Karl Heinz schrieb:>>> Jep. Dieter hat hier einen Punkt. Das lese ich ebenfalls aus dem>>> Datenblatt.>>>>>> Und Achtung: WGM12 ist nicht in TCCR1A sondern in TCCR1B!>>>> Mode "2" ist doch ClearCompareMatch oder nicht ?>> Wo siehst du nach?>> Datenblatt> http://www.atmel.com/images/doc2549.pdf>> Seite 148. Die Tabelle 17.2
Kann es sein, dass du die falsche Tabelle benutzt hast?
Seite 131, Tabelle 16.8
Die ist aber nur für den Timer 0 zuständig!
Du benutzt aber den Timer 1!
Jup. Damit erklärt sich dein Oszi Bild.
ein Top Wert von 511 ergibt
8000000/64 = 125000
125000/512 = 244
Kehrwert davon: 0.004...
da sind die 4ms, die am Oszi zu sehen sind.
Karl Heinz schrieb:> Jup. Damit erklärt sich dein Oszi Bild.>> ein Top Wert von 511 ergibt>> 8000000/64 = 125000> 125000/512 = 244>> Kehrwert davon: 0.004...>> da sind die 4ms, die am Oszi zu sehen sind.
Oh man,
ich könnte mich selbst schlagen schlag
Auf die Seite "184" habe ich mich die ganze Zeit konzentriert.
Vielen dank an euch!
Ich habe die Settings geändert, jetzt gibt er mir ein Sägezahn ähnlichen
Verlaus aus, dass ist doch auch nicht richtig...
/* Settings for the 1ms Base on TIMER1 */
TCCR1B |= ((1<<CS10) | (1<<CS11) | (1<<WGM12)); // Prescaler 64 & CTC
Mode
TIMSK1 |= (1<<OCIE1A); // Output Compare Interrupt Enable
OCR1A |= ((F_CPU 64 1000 ) - 1 ); // Counter Register
Jan schrieb:> Joachim B. schrieb:>> und das OCR1AH zu verodern ist keine gute Idee>> Sorry, warum nicht?
was ist denn wenn alter Schrott in OCR1AH steht?
sagen wir 120d und das oderst du mit 0, was kommt raus?
was gibt 120d ODER 0 ? (bitweise)
und was machst du wenn es einen Überlauf im Timer gibt während du an low
oder high rumoderst?
Jan schrieb:> jetzt gibt er mir ein Sägezahn ähnlichen> Verlaus aus
Fällt uns allen schwer, das zu Sehen ... Und wo kommt der
Sägezahn-ähnliche-Verlauf denn raus?
Jan schrieb:> OCR1A |= ((F_CPU 64 1000 ) - 1 ); // Counter Register
Hast Du keine / -Striche, dann wird auch nicht geteilt ...
(Kursiv-Schrift hilft da auch nicht :-) )
Oh, und guggst Du da:
Formatierung (mehr Informationen...)
Dieter Frohnapfel schrieb:> Jan schrieb:>> jetzt gibt er mir ein Sägezahn ähnlichen>> Verlaus aus>> Fällt uns allen schwer, das zu Sehen ... Und wo kommt der> Sägezahn-ähnliche-Verlauf denn raus?>> Jan schrieb:>> OCR1A |= ((F_CPU 64 1000 ) - 1 ); // Counter Register>> Hast Du keine / -Striche, dann wird auch nicht geteilt ...> (Kursiv-Schrift hilft da auch nicht :-) )>> Oh, und guggst Du da:>> Formatierung (mehr Informationen...)C-Code> dann ist das auch richtig lesbar :-)
Sorry war vom Handy aus...
Wie wo kommt der raus ? Aus meinem Digital Ausgang ?!
Jan schrieb:> Sorry war vom Handy aus...> Wie wo kommt der raus ? Aus meinem Digital Ausgang ?!
Wie, wo, was?
Da kann nirgends ein Sägezahn rauskommen. Noch nicht mal, wenn du
irrtümlich einen PWM Modus programmiert hättest. Schliessliche vergreift
sich nach der Initialisierungsphase niemand mehr am OCR1A
Jan schrieb:> Aus meinem Digital Ausgang ?!
Ich weiß es nicht, ich sehe es nicht, ich kann nur annehmen, dass es
Dein "Toggle-Pin" PORTB.7 ist.
Ein Sägezahn ist dort (an einem Digital-Ausgang) recht ungewöhnlich - da
würde mich die Timebase doch sehr interessieren (ein Bild nicht
weniger).
Jan schrieb:> das ist doch kein Sägezahn, dass ist irgend ein Mist was der macht :(
Na immerhin haben wir jetzt 1 mS.
10mV sind natürlich recht wenig, also WO MISST DU DAS? Sieht mir mehr
nach einem "Überschwinger" aus ... (aber ich bin ja auch Laie!)
Dieter Frohnapfel schrieb:> Jan schrieb:> das ist doch kein Sägezahn, dass ist irgend ein Mist was der macht :(>> Na immerhin haben wir jetzt 1 mS.>> 10mV sind natürlich recht wenig, also WO MISST DU DAS? Sieht mir mehr> nach einem "Überschwinger" aus ... (aber ich bin ja auch Laie!)
Ich habe einen anderen freien Pin genommen... Vorher als Ausgang
deklariert (PIND2)
Peter W. schrieb:> Ich habe einen anderen freien Pin genommen... Vorher als Ausgang> deklariert (PIND2)
Prima, toggelst Du den auch? Hänge doch bitte mal das aktuelle
Programm/Projekt an ...
Dieter Frohnapfel schrieb:> Peter W. schrieb:>> Ich habe einen anderen freien Pin genommen... Vorher als Ausgang>> deklariert (PIND2)>> Prima, toggelst Du den auch? Hänge doch bitte mal das aktuelle> Programm/Projekt an ...
holger schrieb:> #define DCF77_PON_ON PORTJ |= (1<<PJ1)> #define DCF77_PON_OFF PORTF &= ~(1<<PJ1)>> Interessant;) Auf PORTJ wird PON High gesetzt> und auf PORTF auf Low.
Copy & Paste... Danke, werde ich gleich mal ändern. Das Modul braucht
zum Glück kein PON
Dieter Frohnapfel schrieb:> Was hast Du denn jetzt noch alles geändert - außer WGM12 in TCCR1B> zu Setzen?
Nur die geniale Formel. Sonst weiter nichts.
Dieter Frohnapfel schrieb:> Peter W. schrieb:> Nur die geniale Formel. Sonst weiter nichts>> Veralbern kann ich mich auch selbst - viel Spaß noch ...
Was habe ich denn nun gemacht?
Who the fuck is Peter W schrieb:> Ich bin verwirrt... Ist Peter W. == Jan?
Sorry. Ein Freund von mir hat mal via. Meinem Handy hier was gepostet.
Habe es eben auch gesehen und direkt geändert. Entschuldigt bitte. Hier
ist der Jan und nicht der Peter.
Jan schrieb:> Habe den Fehler gefunden ^^ Jetzt habe ich ein perfektes Rechtecksignal
und warum nennst du ihn nicht?
manno so hasse ich zu helfen.
und Fragen beantwortest du nicht:
Joachim B. schrieb:> was ist denn wenn alter Schrott in OCR1AH steht?>> sagen wir 120d und das oderst du mit 0, was kommt raus?>> was gibt 120d ODER 0 ? (bitweise)
Guten Morgen,
Sorry, musste gestern noch weg. Also ihr werdet es nicht glauben. Es lag
an MIR !
Also, von meinem Oszi die Klemmspitze ist fürn Ars***... Wo mir diese
abgefallen ist vom CPU Board, dachte ich mir das ich die Spitze einfach
mal so an die Pin halte. Siehe da, ein sauberes Rechtecksignal.
Nochmal vielen lieben dank, an alle die mitgeholfen haben!