www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt springt nicht mehr zurück


Autor: Michael S. (michi88)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuche gerade mit dem Timer1 vom atmega8 in C++ einen Takt von 
einer Sekunde zu erzeugen.
Mein Problem dabei ist, dass er nicht mehr aus den Interrupt 
rausspringt.

Außerdem haut meine Berechnung für den Compare-Wert nicht ganz hin.
Seht ihr da zufällig einen Fehler?


Hier mal der Code:
#ifndef F_CPU
#define F_CPU 8000000
#endif

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

volatile int t0overf;
volatile int t1_comp_counter;
volatile int time_sec;
volatile int time_min;
volatile int time_hour;
char bcd[4];

ISR(TIMER1_COMPB_vect) {
  t1_comp_counter++;
  
  if (t1_comp_counter == 200) {
    t1_comp_counter = 0;
    time_sec++;
    if (time_sec > 59) {
      time_sec = 0;
      time_min++;
    }
    
    if (time_min > 59) {
      time_min = 0;
      time_hour++;
    }
    
    if (time_hour > 23)
      time_hour = 0;
  }
}

void deztobcd(int dez)
{
  int i = 0;
  if (dez > 9)
    return;

  bcd[0] = 0;
  bcd[1] = 0;
  bcd[2] = 0;
  bcd[3] = 0;
  while (dez) {
    bcd[i++] = dez % 2;
    dez /= 2;
    }
}

int main (void) {
  init_move_out(&PORTD);
  int reset;
  int move_data[24];
    
  TCCR1B  |= (1 << CS10) | (1 << WGM12);
  OCR1B  |= 63999;
  TIMSK  |= (1 << OCIE1A);

  sei();
  
  while (1) {

    deztobcd(2);
    move_data[0] = bcd[0];
    move_data[1] = bcd[1];
    move_data[2] = bcd[2];
    move_data[3] = bcd[3];

    move_out(&PORTD,move_data);
  }
}

gruß michael

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fällt dir hier was auf?

ISR(TIMER1_COMPB_vect) {
               ^
               |

TIMSK  |= (1 << OCIE1A);
                     ^
                     |

Autor: Michael S. (michi88)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar danke!

Ich hab vorhin beim Vektor schon son Brett vorm Kopf gehabt.
Aber warum muss man denn das Register OCR1A und nicht OCR1B mit nem Wert 
befüllen, damit das funktioniert?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weil Atmel das für diesen CTC-Mode so eingebaut hat.
Datenblatt Seite 88 oder so.

Gruß aus Berlin
Michael

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.