Frage zu R2R, DDS, Interrupts und Timing

OP #2396259
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
Gast #2396336
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.