mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega8 Timer1 ISR


Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade eine ISR für einen ATMega8 zu schreiben.

Clock bei 8MHz, CTC für Timer 1A.


void signal (TIMER1_COMPA_vect)
{
/*  static  uint16_t  ITime = 0;

  ITime ++;

  if (ITime > 500)
  {
    PORTD &= ~(1<<PD4);
  } else PORTD |= (1<<PD4);

  if (ITime >= 1000) ITime =0;
*/
   PORTD |= (1<<PD4);

  return;
}

int main (void)
{
  PORTC  =  255;
  DDRC  =  0;

  PORTD  =  255 & ~(1<<PD4);
  DDRD  =  (1<<PD4);


  TCCR1B  =  (1<<WGM12) | (1<<CS11);  
  TIMSK  =  (1<<OCIE1A);
  OCR1A  =  10;

        sei();

        while (1) {}
}


Leider wird der Pin nicht einmal eingeschaltet.
(kein Sprung in die ISR)

WGM für den CTCModus von T1A
CS11 Prescaler auf 8
OCIE1A Interrupt einschalten

OCR1A vergelichsregister.

Finde meinen FEhler nicht, kann mir einer einen Schubs in die richtige 
Richtung geben ?

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werfe ein fröhliches volatile in die Runde.

Michael

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber Register sind doch Volatile...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was erwartest du für ein Ergebnis und was beobachtest du?

Ich erwarte, dass die die CTC-Routine etwa alle 10 Mikrosekunden 
angesprungen wird und PD4 von PORTD auf HIGH gesetzt wird. Den 
HIGH-Pegel müsste man mit einem Multmeter einfach nachweisen können.

OK ich habe im AVR Simulator gecheatet :)

// Clock bei 8MHz, CTC für Timer 1A.

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect)
{
  PORTD |= (1<<PD4); 
}

int main(void)
{
  PORTC =  255;
  DDRC  =  0;

  PORTD =  ~(1<<PD4);
  DDRD  =  (1<<PD4);

  TCCR1B =  (1<<WGM12) | (1<<CS11);  
  TIMSK  =  (1<<OCIE1A);
  OCR1A  =  10;

  sei();

  while(1) 
  {
  }
}


Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interrupt war falsch deklariert.

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wollte den Pin schalten zum Nachweis das die Routine angesprungen 
wird.

Jetzt klappt alles...

Vielen Dank !

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.