Forum: Mikrocontroller und Digitale Elektronik TIMER0_COMPA_vect


von HeyHey (Gast)


Lesenswert?

Hi Leute, ich hab vor kurzem mit dem Programmieren von AVR µC 
angefangen.
Im Augenblick habe ich einen mega644p und versuche einen einfachen Timer 
zum Laufen zu bringen. Dazu habe ich folgendes Script verwendet. 
Arbeiten tue ich mit dem AVR Studio 5


//*************************************************************

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

//Variablen für die Zeit
volatile unsigned int  millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

int main(void)
{
DDRB = 0xff;
  // Timer 0 konfigurieren
  TCCR0 = (1<<WGM01); // CTC Modus
  TCCR0 |= (1<<CS01); // Prescaler 8
  // ((1000000/8)/1000) = 125
  OCR0 = 125-1;

  // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE0);

  // Global Interrupts aktivieren
  sei();

  while(1)
  {
    /*Hier kann die aktuelle Zeit
      ausgeben werden*/
  }
}

/*
Der Compare Interrupt Handler
wird aufgerufen, wenn
TCNT0 = OCR0A = 125-1
ist (125 Schritte), d.h. genau alle 1 ms
*/

  ISR (TIMER0_COMP_vect)
  {

      millisekunden++;
      if(millisekunden == 16000)
      {
        sekunde++;
        millisekunden = 0;
        }

    sekunde++;
    if(sekunde == 60)
        {
         minute++;
          sekunde = 0;
        }

    stunde++;
        if(minute == 1)
        {
    PORTB |= (1<<PB0);
        }

    if(minute == 1)
        {
        PORTB &= ~(1<<PB0);
        }

    }
}


//************************************************


Die Zeile: // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE0);

habe ich durch: TIMER0_COMPA_vect |= (1<<OCIE0A);

ersetzt. Jetzt erhalte ich dauernd die Fehlermeldung:

Error  1  '__vector_16' undeclared (first use in this function) 
C:\Dokumente und Einstellungen\*******\timetest.c


Was mach ich blos falsch?

lg HeyHey

von Justus S. (jussa)


Lesenswert?

HeyHey schrieb:
> Was mach ich blos falsch?

das

HeyHey schrieb:
> Die Zeile: // Compare Interrupt erlauben
>   TIMSK |= (1<<OCIE0);
>
> habe ich durch: TIMER0_COMPA_vect |= (1<<OCIE0A);
>
> ersetzt.

warum machst du so einen Quark?

von Thomas E. (thomase)


Lesenswert?

Justus Skorps schrieb:
> warum machst du so einen Quark?

Gute Frage.

Das ist schon mal fast richtig.
>TIMSK |= (1<<OCIE0);

und so ganz richtig.
>TIMSK0 |= (1<<OCIE0);

Und das ist völliger Stuss:
> habe ich durch: TIMER0_COMPA_vect |= (1<<OCIE0A);

>OCR0 = 125-1;
Ein Register OCR0 gibt es nicht, sondern OCR0A und OCR0B

und entsprechend die ISR
>ISR (TIMER0_COMP_vect) so nicht!

sondern ISR(TIMER0_COMPA_vect) für Register OCR0A.


mfg.

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.