www.mikrocontroller.net

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


Autor: Kopfkratzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void initTimer2(void)
{
 // Timer2 Fast PWM, toggle OCR2 on match
 TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
 OCR2 = 0;
}
Und im Capture IRQ lade ich jeweils den nächsten Sinus Wert:
// Globale Variable
volatile unsigned char uOffset;

ISR(TIMER2_COMP_vect)
{
  OCR2 = sinetable[uOffset++];
}

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 ;)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltest du den Interrupt denn auch ein?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Kopfkratzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,
mein Fehler :?
void initIRQ(void)
{
    // Timer IRQs enabled
    // Timer2 CompareMatch2
       TIMSK = (1 << OCIE2);
    // Timer0 OverFlow
       TIMSK = (1 << TOIE0); 
       sei ();
}

void initPorts(void)
{
  // PortB PWM outs 
  DDRB = (1 << PB1) | (1 << PB2) | (1 << PB3);
}

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 :(
ISR(TIMER2_COMP_vect)
{
  OCR2 = sinetable[uOffset++];

    // Debugging LED on when IRQ
    PORTB |= (1<<PB2);

}

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 ;)

Autor: Michael Wilhelm (Gast)
Datum:

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

TIMSK = TIMSK | (1 << TOIE0);

MW

Autor: Kopfkratzer (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.