www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Timer 3 am 90CAN128


Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Ich versuche zwei Zeitscheiben aufzubauen, um unterschiedliche Aufgaben 
erledigen zu können.
Die erste Zeitscheibe (Timer0) soll im 0.1ms Takt die Bewegung eines 
Schrittmotors steuern. Dieser Timer funktionniert ohne Probleme.
Die zweite Zeitscheibe (Timer3) soll im 1ms Takt laufen. Dieser Timer 
soll zum Beispiel zum Lesen von CAN-Botschaften oder zur 
Displayansteuerung genutzt werden.
Leider funktioniert der Timer3 nicht, und ich weiß nicht warum! Die ISR 
wird einfach nicht angesprungen.
Als µC nutze ich einen AT90CAN128 auf 16MHz getaktet und die aktuelle 
WINAVR als Entwicklungsumgebung.
Am µC sind ist der Pin PE3 (OC3A) unbelegt, jedoch Pin PE4 & PE5 (OC3B, 
OC3C) sind beschaltet.

Was mache ich denn falsch?

Hier mein Code:

Timerinitialisierung:
void Timer_init(void)
{
// Timer 0
OCR0A = 0x19;   // Compare-Register auf 25(Dez) laden, damit eine Taktzeit von 0.1ms gewährleistet wird
TCCR0A = 0 | (0<<FOC0A)  | (0<<WGM00) | (1<<COM0A1) | (1<<COM0A0) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TIMSK0 = 0 | (1<<OCIE0A) | (0<<TOIE0);
TIFR0  = 0 | (1<<OCF0A)  | (0<<TOV0);

// Timer 3
OCR3AL = 0xFA;   // Compare-Register auf 250(Dez) laden, damit eine Taktzeit von 1ms gewährleistet wird
OCR3AH = 0x00;
TCCR3A = 0 | (1<<COM3A1) | (1<<COM3A0) | (0<<COM3B1) | (0<<COM3B0) | (0<<COM3C1) | (0<<COM3C0) | (0<<WGM31) | (0<<WGM30);
TCCR3B = 0 | (0<<ICNC3)  | (0<<ICES3)  | (0<<WGM33)  | (1<<WGM32)  | (0<<CS32)   | (1<<CS31)   | (1<<CS30);
TCCR3C = 0 | (1<<FOC3A)  | (0<<FOC3B)  | (0<<FOC3C);  
TIMSK3 = 0 | (0<<ICIE3)  | (0<<OCIE3C) | (0<<OCIE3B) | (1<<OCIE3A) | (0<<TOIE3);
TIFR3  = 0 | (0<<ICF3)   | (0<<OCF3C)  | (0<<OCF3B)  | (1<<OCF3A)  | (0<<TOV3);

return;
}

Hier die ISR:
ISR(TIMER0_COMP_vect)  // Interrupt im 0.1ms-Takt
{
interrupt_i0++;
if (Geschwindigkeit == 5)
  if (Freigabe)
    Bewegung(Freigabe, Richtung);
}

ISR(TIMER3_COMPA_vect)  // Interrupt im 1ms-Takt
{
interrupt_i2++;
if (interrupt_i2 %15 == 0)
  {
  CAN-Botschaft_lesen();
}

Wo ist mein Fehler?

Gruß,

Sven

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.