Forum: Compiler & IDEs Sinus via PWM und Timer2 Mega8 will nicht :(


von Kopfkratzer (Gast)


Lesenswert?

Hallo,
ich wollte via PWM einen 1bit DAC realisieren, der einen Sinus aus einer 
Sinustabelle ausgibt.
Tabelle spar ich mir jetzt ;)
Timer wie folgt initialisiert:
1
void initTimer2(void)
2
{
3
 // Timer2 Fast PWM, toggle OCR2 on match
4
 TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
5
 OCR2 = 0;
6
}
Und im Capture IRQ lade ich jeweils den nächsten Sinus Wert:
1
// Globale Variable
2
volatile unsigned char uOffset;
3
4
ISR(TIMER2_COMP_vect)
5
{
6
  OCR2 = sinetable[uOffset++];
7
}
Der Mega8 läuft mit internen 1MHz und an PB3 ist einen LED angebracht.
Statt nun periodisch heller und dunkler zu werden, geht die LED einfach 
aus :(
Wo liegt mein Fehler ?
Falscher PWM Modus oder ist 1MHz einfach zu schnell ?
Danke ;)

von Rolf Magnus (Gast)


Lesenswert?

Schaltest du den Interrupt denn auch ein?

von johnny.m (Gast)


Lesenswert?

"Compare" != "Capture"! Das sind zwei völlig unterschiedliche Dinge. 
Abgesehen davon kann ich Rolf nur zustimmen: Das Codeschnipselchen von 
Dir enthält weder die lokale Freigabe des Compare-Interrupts noch die 
globale Interrupt-Freigabe. Ein bisschen ausführlicher darf es schon 
sein...

von Kopfkratzer (Gast)


Lesenswert?

Sorry,
mein Fehler :?
1
void initIRQ(void)
2
{
3
    // Timer IRQs enabled
4
    // Timer2 CompareMatch2
5
       TIMSK = (1 << OCIE2);
6
    // Timer0 OverFlow
7
       TIMSK = (1 << TOIE0); 
8
       sei ();
9
}
10
11
void initPorts(void)
12
{
13
  // PortB PWM outs 
14
  DDRB = (1 << PB1) | (1 << PB2) | (1 << PB3);
15
}

Timer0 wird später dann zu key-debouncing benutzt werden.
Nur habe ich gerade mal folgendes probiert und festgestellt das die IRQ 
Routine gar nicht angesprungen wird :(
1
ISR(TIMER2_COMP_vect)
2
{
3
  OCR2 = sinetable[uOffset++];
4
5
    // Debugging LED on when IRQ
6
    PORTB |= (1<<PB2);
7
8
}

Also Timer2 im Fast PWM Mode mit vollem takt und Compare-Match = setzen 
Pin und löschen bei TOP.
Compare-Match IRQ enabled.
Wird aber nicht angesprungen :(
Wo ist mein Fehler ?
Danke ;)

von Michael Wilhelm (Gast)


Lesenswert?

>>TIMSK = (1 << OCIE2);
>>// Timer0 OverFlow
>>TIMSK = (1 << TOIE0); hier überschreibst du die erste Zuweisung

TIMSK = TIMSK | (1 << TOIE0);

MW

von Kopfkratzer (Gast)


Lesenswert?

@Michael:
Danke das war der Fehler ;)
Sonst schreibe ich immer:
1
TIMSK |= (1<<TOIE0);
Und kaum erledigt, schon flackert die LED fleißig vor sich hin ;)

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.