oberallgeier
17.07.2008, 23:51
Schönen Abend,
ich bin verunsichert. Es war die einfache Frage, wie ich zu meinem OCR2A-Wert (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=385584#385584) komme:
... @Joe:
hab mir mal deinen Code angeschaut. Wie kommst du auf deinen OCR2A Wert von 125? Laut Datenblatt ist die Formel doch (OCR2A=(fCLK/(2*N*fOCR))-1= 61.5 (bei deinen gewählten Werten) ...
Mein Code
/* ================================================== ============================ */
/* === Initialisierung fuer Timer2 mega168 ===================================== */
void TC2TMR_init(void) // Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs
{
TCCR2A |= (1<<WGM21); // Timer im CTC-Mode, Top=OCR2A doc S 157
TCCR2B |= (1<<CS21); // Prescaler 1/8 / Clock <- CP doc S 158
OCR2A = 125; // Preset 125 für 50µs bei 20Mhz
TIMSK2 |= (1<<OCIE2A); // Tmr/Cntr2 CompareA interrupt enabled
}
/* ================================================== ============================ */
/* ================================================== ============================ */
/* === Nicht unterbrechbare ISR für timer2 ===================================== */
/* Routine zählt hoch im Takt 20 kHz = 50 µs. */
ISR(TIMER2_COMPA_vect) // Vektor 7
{
if (Izeit_1 < 60000) //Timer bis 60 000 - 3 sec Datenerfassung möglich
Izeit_1 ++; // alle drei Sekunden wird 60000 erreichterreicht
// und Izeit_1 bleibt in der uint16-Grenze
else
{
Izeit_1 = 0; // ansonsten: Rückstellen auf Null
PORTC ^= (1<<PC5); // Zur Anzeige gLED am PC5/SCL toggeln
}
}
/* ================================================== ============================ */
erzeugt mit OCR2A=125 aus 20 MHz bei meinem mega168 einen 50-µs-Takt, obwohl beginner1101 die Formel im Datenblatt richtig anwendet und für meine Zielfrequenz mit 61,5 etwa den halben Wert berechnet - ich komme mit der Formel natürlich zum gleichen niedrigen Ergebnis.
Wie komme ich auf die 125? Beim Durchlesen der CTC-Funktionen hatte ich mir nach meinen Begleitnotizen ein Excelblatt gemacht (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=385727#385727), damit ich einfach herumprobieren kann, um schnell verschiedene Parameterpaarungen für Prescaler und Preset zu finden. Da die 50 µs mit dem vorgestellten Code wohl stimmen weil der Quarz mit der Aufschrift 20,000 MHz hoffentlich richtig läuft und sowohl meine Stoppuhr als auch mein Oszilloskop den 50µs-Takt bzw. die 20 kHz bestätigen, ist irgendwo ein Fehler. Dabei bestätigt mir auch meine Milchmädchenrechnung die "125":
20 MHz / 8 (prescaler) = 2,5 MHz und da der Timer von unten nach oben zählt, gilt :
2,5 MHz / 125 (preset) = 20 kHz.
Meine Frage: Habe ich den Timer falsch verstanden? Ist das kein CTC? Versteh ich das ATMEL-doc nicht? Habe ich noch immer null Ahnung von C? Oder ... ich trau mich nicht wirklich die nächste Frage zu stellen
ich bin verunsichert. Es war die einfache Frage, wie ich zu meinem OCR2A-Wert (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=385584#385584) komme:
... @Joe:
hab mir mal deinen Code angeschaut. Wie kommst du auf deinen OCR2A Wert von 125? Laut Datenblatt ist die Formel doch (OCR2A=(fCLK/(2*N*fOCR))-1= 61.5 (bei deinen gewählten Werten) ...
Mein Code
/* ================================================== ============================ */
/* === Initialisierung fuer Timer2 mega168 ===================================== */
void TC2TMR_init(void) // Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs
{
TCCR2A |= (1<<WGM21); // Timer im CTC-Mode, Top=OCR2A doc S 157
TCCR2B |= (1<<CS21); // Prescaler 1/8 / Clock <- CP doc S 158
OCR2A = 125; // Preset 125 für 50µs bei 20Mhz
TIMSK2 |= (1<<OCIE2A); // Tmr/Cntr2 CompareA interrupt enabled
}
/* ================================================== ============================ */
/* ================================================== ============================ */
/* === Nicht unterbrechbare ISR für timer2 ===================================== */
/* Routine zählt hoch im Takt 20 kHz = 50 µs. */
ISR(TIMER2_COMPA_vect) // Vektor 7
{
if (Izeit_1 < 60000) //Timer bis 60 000 - 3 sec Datenerfassung möglich
Izeit_1 ++; // alle drei Sekunden wird 60000 erreichterreicht
// und Izeit_1 bleibt in der uint16-Grenze
else
{
Izeit_1 = 0; // ansonsten: Rückstellen auf Null
PORTC ^= (1<<PC5); // Zur Anzeige gLED am PC5/SCL toggeln
}
}
/* ================================================== ============================ */
erzeugt mit OCR2A=125 aus 20 MHz bei meinem mega168 einen 50-µs-Takt, obwohl beginner1101 die Formel im Datenblatt richtig anwendet und für meine Zielfrequenz mit 61,5 etwa den halben Wert berechnet - ich komme mit der Formel natürlich zum gleichen niedrigen Ergebnis.
Wie komme ich auf die 125? Beim Durchlesen der CTC-Funktionen hatte ich mir nach meinen Begleitnotizen ein Excelblatt gemacht (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=385727#385727), damit ich einfach herumprobieren kann, um schnell verschiedene Parameterpaarungen für Prescaler und Preset zu finden. Da die 50 µs mit dem vorgestellten Code wohl stimmen weil der Quarz mit der Aufschrift 20,000 MHz hoffentlich richtig läuft und sowohl meine Stoppuhr als auch mein Oszilloskop den 50µs-Takt bzw. die 20 kHz bestätigen, ist irgendwo ein Fehler. Dabei bestätigt mir auch meine Milchmädchenrechnung die "125":
20 MHz / 8 (prescaler) = 2,5 MHz und da der Timer von unten nach oben zählt, gilt :
2,5 MHz / 125 (preset) = 20 kHz.
Meine Frage: Habe ich den Timer falsch verstanden? Ist das kein CTC? Versteh ich das ATMEL-doc nicht? Habe ich noch immer null Ahnung von C? Oder ... ich trau mich nicht wirklich die nächste Frage zu stellen