mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega 8 16Bit-Timer CTC-Mode Interrupts


Autor: REX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mich gerade an einer eigenen Software-PWM, komme aber nicht 
weiter, da "Timer/Counter1 Compare Match B interrupt" nicht 
funktioniert.
Kann jemand einen Tipp diesbezüglich geben ?
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>

void init_timer_1(void);

int main(void)
{
  sei();        // global Interupt enable
  init_timer_1();

  DDRC=255;
  
  while(1)
  {
  }
}

void init_timer_1(void)
{
  TCCR1B |= (1<<WGM12);  // CTC-Mode, Top-Value OCR1A
  TCCR1B |= (1<<CS10);  // no Prescaler

  OCR1AL = 255;
  OCR1AH = 15;      // 12 Bit resoluttion (Top Value of CTC Mode: 4095)

  TIMSK |= (1<<OCIE1A);  // Output Compare A Match Interrupt Enable, OCR1A (TOP VALUE OF TIMER)
  TIMSK |= (1<<OCIE1B);  // Output Compare B Match Interrupt Enable, OCR1B

  OCR1BL = 0;
  OCR1BH = 1;

}

ISR (TIMER1_COMPA_vect)    // Timer/Counter1 Compare Match A interrupt
{
  PORTC=1;
}

ISR (TIMER1_COMPB_vect)    // Timer/Counter1 Compare Match B interrupt
{
  PORTC=0;  
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Quellcode funktioniert im Simulator. Das sei() vor und das DDRC=... 
nach der Initialisierung ist ungewöhnlich bzw. widersinnig. Bei der 
Simulation (4 MHz) treten die ISRs innerhalb paar Hundert Mikrosekunden 
auf. Möglicherweise siehst du aufgrund der kurzen Zeiten nichts... 
versuche mal einen grösseren Vorteiler.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  OCR1AL = 255;
  OCR1AH = 15;      // 12 Bit resoluttion (Top Value of CTC Mode: 4095)
...
  OCR1BL = 0;
  OCR1BH = 1;
Es muss zuerst das High-Byte geschrieben werden, dann das Low-Byte. 
Warum überlässt du es nicht dem Compiler, die beiden Bytes in der 
richtigen Reihenfolge zu schreiben?
OCR1A = 4095;
OCR1B = 256;

Autor: REX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das war´s.

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.