Forum: Mikrocontroller und Digitale Elektronik Frage zu R2R, DDS, Interrupts und Timing


von Matthias P. (matthias_p65)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

Die ISR braucht deutlich mehr als 1 Zyklus. Grob geschätzt muss man eher 
mit 50 Zyklen rechnen. Entsprechend wird die Geschwindigkeit duch die 
Laufzeit für die ISR bestimmt, nicht mehr durch den Timer. Die Frequenz 
sollte entsprechend etwa um den Faktor 50 kleiner sein, also eher so bei 
1 kHz, ja nachdem was bei interval drin steht.

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.