Hallo zusammen.
Ich bekomme grad was nicht in meinen Kopp, vielleicht könnt Ihr mir
helfen.
Folgendes "Problem":
Angenommen ich hätte einen ATMega32, mit dem ich Wellenformen aus einer
Wavetable ausgebe, wie z.B. in diesem Thread hier:
Beitrag "Probleme mit R2R Wandler an ATMega32"
Nun habe ich folgenden Code:
1 | void preloadTimer(void) {
|
2 | TCNT1 = 0xFFFF;
|
3 | }
|
4 |
|
5 |
|
6 | ISR(TIMER1_OVF_vect) {
|
7 |
|
8 | preloadTimer();
|
9 |
|
10 | if (waveform == SINE) {
|
11 | PORTA = pgm_read_byte(&sine_table[t]);
|
12 | }
|
13 | else if (waveform == SAW) {
|
14 | PORTA = pgm_read_byte(&saw_table[t]);
|
15 | }
|
16 | else if (waveform == TRIANGLE) {
|
17 | PORTA = pgm_read_byte(&triangle_table[t]);
|
18 | }
|
19 | else if (waveform == PULSE) {
|
20 | PORTA = pgm_read_byte(&pulse_table[t]);
|
21 | }
|
22 | else if (waveform == RANDOM) {
|
23 | PORTA = pgm_read_byte(&random_table[t]);
|
24 | }
|
25 |
|
26 | t+=interval;
|
27 |
|
28 | }
|
Der Timer1 ist eingeschaltet und läuft also jeden Takt über, da die
preloadTimer() Funktion ja mit jdem Takt aufgerufen wird(?).
Sollte ich nicht, wenn ich einen 16MHz Quarz angeschlossen habe, am
Ausgang des R2R Wandlers eine Frequenz von etwa 62,5 kHz messen?
Meiner Rechnung nach also:
16MHz/256 = 62500Hz
da es ja 256 Takte dauert, bis die diskreten Werte der Wellenform einmal
durchlaufen sind.
Was tatsächlich rauskommt ist etwa nur der 64. Teil, nämlich 976 Hz.
Die Timerkonfiguration sieht so aus:
1 | TCCR1A=0x00;
|
2 | // No prescale, we need full accuracy
|
3 | TCCR1B=0x01;
|
4 | preloadTimer();
|
5 | OCR1AH=0x00;
|
6 | OCR1AL=0x00;
|
7 | OCR1BH=0x00;
|
8 | OCR1BL=0x00;
|
9 | // Start timer
|
10 | TIMSK |= (1<<TOIE1);
|
Ich vermute das der Preload etwas mehr Zeit in Anspruch nimmt als
gedacht, oder wo liegt hier der Hase im Pfeffer?
Bitte um Aufklärung.
Gruß
Matthias