www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem Timer


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner mal einen Tip für mich? So langsam verzweifel ich......

Mfg Sascha

Autor: Jürgen Broß (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

hab jetzt nochmals das Datenblatt durchforstet. Kann es sein, das der
vorgegebene Takt durch die PWM-Auflösung nochmals geteilt wird?
        TCCR1A=0xA3;     //Takt 16MHz
  TCCR1B=0x09;     //10Bit FAST-PWM
  TCNT1=0;        
  ICR1=0;
  OCR1A=0x1ff;     // Ausgänge auf 50& stellen
  OCR1B=0x1ff;
  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

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.