Verständnisproblem Timer

Gast #210220
Hallo,

möchte den Timer1 eines ATmega32 als 10Bit PWM nutzen. Als Takt habe
ich 16MHz/1024 = 15.625kHz. Gleichzeitig soll der Timer als Uhr benutzt
werden. Wenn ich den Timer mit 0xc2F7 lade, sollte ich normalerweise
jede Sekunde nen Interrupt haben. Ist die Rechnung richtig?

Mfg Sascha
Schreib das nächste mal statt 0xc2F7 einfach -15625, dann weiß jeder
gleich, was damit gemeint ist und für den Compiler ist beides
dasselbe.

Im Prinzip kann man im PWM-Modus auch den Overflowinterrupt benutzen,
um eine Zeitbasis zu zählen. Bloß der Endwert ist natürlich durch die
PWM (10Bit = 1024) fest vorgegeben.

Du hast also einen Interrupt von 16MHz/1024 und darin kannst Du nun
eine Variable bis auf eine Sekunde runterzählen.


Peter
Gast
@peter dannegger

Darin liegt das Problem.Hier mal der betreffende Ausschnitt des Codes

// Timer 1 overflow interrupt service routine
SIGNAL (SIG_OVERFLOW1)
  {
  TIMER0_COUNT++;
  if(TIMER0_COUNT==15625)
  {
  TIMER0_COUNT=0;
    if(CH_SEKUNDEN < 59)
        {
        CH_SEKUNDEN++;
        }
      else
        {
        CH_SEKUNDEN=0;
          if(CH_MINUTEN < 59)
          {
          CH_MINUTEN++;
          }
          else
          {
          CH_MINUTEN=0;
          if(CH_STUNDEN <= 99)
            {
            CH_STUNDEN++;
            }
            else
            {
            CH_STUNDEN=0;
            }
          }
      }
    }
  }

int main(void)
  {
  PORTD=0x00;                  //PD4 und PD5 als Ausgang (PWM)
  DDRD=0x30;
  TCCR1A=0xA3;    // FAST-PWM 10Bit 15.625kHz
  TCCR1B=0x0D;
  TCNT1=0x00;
  ICR1=0x00;
  OCR1A=0x00;
  OCR1B=0x00;
  TIMSK=0x04;     // T1 Overflow
  sei();

Nach der Rechnung 16MHz/1024 sollte ja 15.625kHz rauskommen und dem
entsprechend die Interruptfrequenz. Zähle ich die Variable TIMER0_COUNT
im Interrupt hoch, dauert es ewig bis der Zählstand 15625 erreicht ist.

Mfg Sascha
Gast
Hallo,

mit dem Timer0 als eigenständiger Zeitgeber gehts. Nur der obige Code
geht nicht. Hat jemand mal nen Tip? Wenn ich mir die Variable
TIMER0_COUNT auf einem LCD-Display anzeigen lasse, sieht man wie
langsam er zählen tut. Schätzungsweiße 10-15 mal pro sec.

Mfg Sascha
Gast
Hallo Sascha,

dein C-Compiler generiert doch bestimmt auch ein Assembler-File. Den
würde ich ins AVR Studio kopieren. Dort kannst du dir prima alle
Register nach jedem Prozessorzyklus anschauen. Dann siehst du bestimmt
woran was das Problem ist. Du kannst auch direkt in die Register
schreiben. Das hat mir mehr geholfen wie das ganze Datenblatt.

Grüße

Jürgen
Gast
Hallo

hab jetzt nochmals das Datenblatt durchforstet. Kann es sein, das der
vorgegebene Takt durch die PWM-Auflösung nochmals geteilt wird?
1
        TCCR1A=0xA3;     //Takt 16MHz
2
  TCCR1B=0x09;     //10Bit FAST-PWM
3
  TCNT1=0;        
4
  ICR1=0;
5
  OCR1A=0x1ff;     // Ausgänge auf 50& stellen
6
  OCR1B=0x1ff;
7
  TIMSK=0x04;

Mit diesen Einstellungen läuft die Uhr endlich und an PD4 und PD5 messe
ich jetzt auch 15.625kHz.

Mfg Sascha

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.