www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Erhöhte Frequenz der T0-Compare-Ints durch T2-Int-Flag?


Autor: Kai Hasenklever (jabba80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

ich bastel grade an meinem ATMEGA16 and habe mit einem sehr seltsamen 
Phänomen zu kämfen:

Timer0 läuft im CTC-Mode
Timer1 auf beidem Kanälem im PWM-Mode
Timer2 ebenfalls PWM-Mode

Code:
-----
#include "cpu.h"
#define DefaultWerte(p)    (((EEPromRead(p*2))*256)+(EEPromRead((p*2)+1)))

void Init_CPU( void ) 
{
    /*--- Initialise Pins ---*/
  DDRA=0xff;
  DDRB=0xBB;
  DDRC=0xff;
  DDRD=0xf3;
}

void initTimers(void){
    //-Timer 0 für Timer-Nutzung initialisieren-------------------------------//
  OCR0=0xb4;          // OCR0 als Komparator
  setbit(TIMSK,OCIE0);    // Interrupt bei Komperator-Match (jede 1/20 sek)
    clearbit(TCCR0,WGM00);  // CTC-mode
      setbit(TCCR0,WGM01);   // top=OCR0
      setbit(TCCR0,CS02);   // clock select clk/1024
    clearbit(TCCR0,CS01);  
      setbit(TCCR0,CS00);  
  clearbit(TCCR0,COM01);  //Normal port operation, OC0 disconnected.
    clearbit(TCCR0,COM00);
  //------------------------------------------------------------------------//
 
  //-Timer 1 für PWM-Nutzung initialisieren---------------------------------//
      setbit(TCCR1B,WGM13); // mode 15, Fast-PWM
      setbit(TCCR1B,WGM12); // update at bottom, tov1 flag set on bottom
      setbit(TCCR1A,WGM11); // top = ICR1
  clearbit(TCCR1A,WGM10);
    clearbit(TCCR1B,CS12);  // Prescaler auf 64
      setbit(TCCR1B,CS11);
    clearbit(TCCR1B,CS10);
    ICR1 = 0x017F;      // TOP = 383 entspr. ~1200Hz
  //----------------------------------//
    // OC1A als PWM-Port setzen (LCD-KONTRAST)
      setbit(TCCR1A,COM1A1); //non-inverting PWM-Mode
    clearbit(TCCR1A,COM1A0);  
    OCR1A = 383 - (DefaultWerte(8)*(383/100));  //Vergleichswert steuert Spannung am Ausgang
    //----------------------------------//
    // OC1B als PWM-Port setzen (LCD-Illum)
      setbit(TCCR1A,COM1B1);  // non-inverting PWM-Mode
    clearbit(TCCR1A,COM1B0);  
    OCR1B = (DefaultWerte(8)*(383/100));  //Vergleichswert steuert Spannung am Ausgang
  //------------------------------------------------------------------------//
    
    
    //-Timer 2 für PWM-Nutzung initialisieren---------------------------------//
      setbit(TCCR2,WGM20);   // fast pwm
      setbit(TCCR2,WGM21);   // top=0xff
    clearbit(TCCR2,CS22);   // clock select clk/8
      setbit(TCCR2,CS21);    // clock select clk/8
    clearbit(TCCR2,CS20);    // clock select clk/8
    //----------------------------------//
  // OC2 als PWM-Port setzen (PWM-Output-Mode)
    setbit(TCCR2,COM21);
    clearbit(TCCR2,COM20);
    OCR2   = ((DefaultWerte(8)*255)/100); //Vergleichswert steuert Spannung am Ausgang
                      //Initial aus EEprom!
  //------------------------------------------------------------------------//  
}

/* Timer2 zwischen PWM-Mode für analogen Ausgang und Toggle-Mode für 
 * DSI-Signal umschalten*/
void switchTimer2(unsigned char mode){
  switch (mode){
    case 0:          // ------PWM-Mode------
      clearbit(TCCR2,CS22);   // Clock=0
      clearbit(TCCR2,CS21);    // -> Timer off
        clearbit(TCCR2,CS20);    // 
        setbit(TCCR2,WGM20);   // fast pwm
        setbit(TCCR2,WGM21);   // top=0xff -> ~1900Hz
        setbit(TCCR2,COM21);  // non-inverting-mode
      clearbit(TCCR2,COM20);
      OCR2 = ((DefaultWerte(8)*255)/100); //Vergleichswert steuert Spannung am Ausgang
      clearbit(TIMSK,OCIE2);
      clearbit(TCCR2,CS22);   // clock select clk/8
        setbit(TCCR2,CS21);    // clock select clk/8
        clearbit(TCCR2,CS20);    // clock select clk/8
    break;

    case 1:          //-------DSI-Mode------
      clearbit(TCCR2,CS22);   // Clock=0
      clearbit(TCCR2,CS21);    // -> Timer off
        clearbit(TCCR2,CS20);    // 
      clearbit(TCCR2,WGM20);   // CTC-timer-mode
        setbit(TCCR2,WGM21);   // top=OCR2 -> 833us
      clearbit(TCCR2,COM21);  // OC2 disconnected, normal Port-Operation
      clearbit(TCCR2,COM20);
      clearbit(PORTD,PD7);
      OCR2 = 0x30;
        setbit(TIMSK,OCIE2);
        setbit(TCCR2,CS22);   // clock select clk/64
      clearbit(TCCR2,CS21);    // clock select clk/64
        clearbit(TCCR2,CS20);    // clock select clk/64

    default:
      break;
  }
}

Das läuft soweit ganz gut, jedoch will ich jetzt zur laufzeit Timer2 
umkonfigurieren und in den CTC-Mode schalten (siehe 'switchTimer2()' im 
Code). Wenn das passiert, dann bekomme ich auch Compare-Ints vom T2, 
jedoch erhöht sich die Frequenz der Compare-Ints von T0 erheblich, so 
dass sie von dort ausgeführten Entprell-Anweisungen für meine 3 Taster 
am Gerät ihren Effekt verlieren.

Wie kommt das? Weiß jemand rat??
Komme echt nichtmehr weiter..... würde mich über jeden Rat freuen!

Gruß
Kai

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nur Register von Timer 2 änderst, gibt es keinen Grund, warum 
sich bei Timer 0 irgendwas ändern sollte. Da das nur ein Teil des Codes 
ist, kann man dazu nicht mehr sagen.

Und bitte gewöhne Dir schnellstens die Schreibweise mit setbit / 
clearbit wieder ab! Die Makros kann man benutzen, wenn man mal ein 
einzelnes Bit in einem Register setzen oder löschen will, aber bei der 
Initialisierung ist das Murks hoch 10! Zumal der µC dann auch jedes Bit 
einzeln setzt, was erstens den Code aufbläht und außerdem zu lustigen 
Nebeneffekten führen kann.

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.