www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bug im Atmega2560 Timer0 im CTC-Mode?


Autor: Test2560 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze einen 2560, 16AU 16MHz (AVRStudio 4.13 mit GCC).
Mit Timer0 soll ein genauer 1s Takt generiert werden. Der folgende Code 
zeigt das Problem: der Befehl clearbit(TIFR0, OCF0A) sollte das Bit 
OCF0A löschen, tut er aber nicht. Der Zähler "timer" läuft dann viel zu 
schnell. Wenn ich dagegen das Bit setze, wird es gelöscht 
(auskommentierte Zeilen), und der Zähler läuft schön im 1s Takt.

Der Simulator zeigt genau das gleiche Verhalten. Deshalb: Verstehe ich 
etwas falsch?

include <avr\io.h>
//vereinfachtes Setzen eines Bits
#define setbit(ADRESSE,BIT) (ADRESSE |= (1<<BIT))
//vereinfachtes Loeschen eines Bits
#define clearbit(ADRESSE,BIT) (ADRESSE &= ~(1<<BIT))
//vereinfachtes Testen eines Bits
#define checkbit(ADRESSE,BIT) (ADRESSE & (1<<BIT))


// 1 second timer on PortC
// -------------------------------------------------------------------

int main(void)
{
  uint32_t timer = 0;
  uint16_t r = 0, o = 0;

  DDRC = 0xFF; // PORTC is output
  PORTC = 0x00;

  OCR0A = 250;          // 16000000Hz / (250*256) = 250Hz
  setbit(TCCR0B, CS02); //prescaler 256
  setbit(TCCR0A, WGM01); // set bit WGM01: CTC mode (2)

  while(1)
  {
    if(checkbit(TIFR0, OCF0A)) // returns a TRUE once every 4 ms
    {
      //setbit(TIFR0, OCF0A);
      clearbit(TIFR0, OCF0A);
      //setbit(TIFR0, OCF0A);
      timer += 4; // count milliseconds
    }

    // calculate the time in seconds...
    r = timer / 1000L;

    // ...and write this value to the LED strip
    if(r != o)  // new value in r?
    {
      o = r;     // memorize old value
      PORTC = 0x0FF & r;
    }
  }

  return 0; // never reached !!
}

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So soll es sein. AVR-Interrupt-Flags werden gelöscht indem man eine 1 
reinschreibt. clearbit tut genau das Gegenteil: es löscht alle gesetzten 
Flags mit Ausnahme des gewünschten Bits. Doku lesen, genauer.

Autor: Test2560 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tatsächlich. Ich hatte glatt übersehen dass ich es hier eigentlich mit 
einem Interruptflag zu tun habe. Vielen Dank.

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.