Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem Timer


von Sascha (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

@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

von Sascha (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

Keiner mal einen Tip für mich? So langsam verzweifel ich......

Mfg Sascha

von Jürgen Broß (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

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.