www.mikrocontroller.net

Forum: Compiler & IDEs Atmega8 Timer/Interrupt Schwierigkeiten


Autor: Arne(Anfänger) (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
also ich habe die ganze Zeit die Suchfunktion betätigt aber ich finde 
dabei nicht den Fehler in einem kleinem Programm.
Ich wollte mal gerne einen Timer0 mit dem setzen eines Interrupts 
ausprobieren. Jedoch verstehe ich nicht ganz ob ich den TCNT0 
vordefinieren muss oder nicht.
Also das Programm lässt sich im AVR Studio linken und auch zum Atmega8 
übertragen, aber ich befürchte ich habe da noch ein grundsätzliches 
Verständnisproblem.
Ich wäre sehr Dankbar wenn sich kurz einer die Zeit nehmen würde und mir 
den rechten Weg weisen würde ;)
Liebe Grüße Arne

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arne(Anfänger) schrieb:

> Ich wollte mal gerne einen Timer0 mit dem setzen eines Interrupts
> ausprobieren. Jedoch verstehe ich nicht ganz ob ich den TCNT0
> vordefinieren muss oder nicht.

Nein. musst du nicht.
TCNT0 ist das Register in dem die Hardware zählt.
Wenn du also dieses Register beobachten würdest, würde es ständig seinen 
Wert ändern - es zählt hoch.
Sobald der Timer einen Vorteiler eingestellt bekommt, zählt er in TCNT0.
That's it. Mehr gibt es (momentan) dazu eigentlich nicht zu sagen.

> Also das Programm lässt sich im AVR Studio linken und auch zum Atmega8
> übertragen, aber ich befürchte ich habe da noch ein grundsätzliches
> Verständnisproblem.

Woraus schliesst du das?

> Ich wäre sehr Dankbar wenn sich kurz einer die Zeit nehmen würde und mir
> den rechten Weg weisen würde ;)

Das ist schon ok so.


Zum Programm:
Gewöhn dir von Anfang an gleich an, nach Möglichkeit immer korrektes 
Standard-C zu benutzen. In C gibt es keine Möglichkeit in einer Funktion 
eine andere Funktion zu definieren. main() ist eine Funktion und die ISR 
ist auch eine Funktion. Daher kann die ISR nicht innerhalb von main() 
definiert werden, sondern ist eine eigenständige Funktion ausserhalb von 
main()
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned int  millisekunden=0;
volatile unsigned int  sekunde=0;

ISR (TIMER0_OVF_vect)       // Timer0 overflow Interrupt
{
  millisekunden++;

  if(millisekunden==1000)
  {
    sekunde++;
    millisekunden=0;
  }
}

int main()
{                  // IO konfigurieren
  DDRC=0x00;
  DDRD=0xff;

                     // Timer0 konfigurieren
  TCCR0 =(1<<CS02)|(1<<CS01);
  TIMSK |= (1<<TOIE0);      // Timer Overflow Interrupt freischalten

  sei();              // Interrupts freigeben
  while(1)             // Endlose Hauptschleife
  {
    if(sekunde==1)
    {
      PORTD|=(1<<PD5);
      PORTD|=(1<<PD6);
    }
  }

  return 0;
}

Und achte auch auf deine Codeformatierungen. Ich finde es immer wieder 
spannend, dass Neulinge gerne jede Zeile in einer Wurscht dahinschreiben 
aber anscheinend als Ausgleich dafür jede Menge Leerzeilen einfügen. Die 
Leerzeilen bringen nichts, ausser dass sie den Code in die Länge ziehen. 
Aber ein paar Leerzeichen zwischen den "Wörtern" würden den Lesefluss 
erheblich vereinfachen. Denn schliesslich sind wir alle von Kindesbeinen 
darauf trainiert worden, dass zumindest im Deutschen zwischen den 
Wörtern ein Leerraum steht und nicht einfach nur alle Buchstaben 
aneinandergefügt werden.
ISR (TIMER0_OVF_vect)       // Timer0 overflow Interrupt
{
  millisekunden++;

  if( millisekunden == 1000 )
  {
    sekunde++;
    millisekunden = 0;
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich ganz vergessen

> aber ich finde
> dabei nicht den Fehler in einem kleinem Programm.

Wie macht sich der Fehler bemerkbar?

"Geht nicht" ist so ziemlich die nichtssagenste Problembeschreibung, die 
du machen kannst.

Autor: Arne(Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich soviel überflüssige  Zeilen einfüge hoffe ich, dass es ein 
bisschen übersichtlicher ist. Aber ich werde mir das fix wieder 
abgewöhnen und dafür Leerzeichen einfügen ;)
Ich habe die ISR Funktion nun vor dir main() geschrieben.
Beim übertragen des Programmes habe ich mal einen Ausgang gesetzt und 
wieder gelöscht. Somit schließe ich einen Hardwarefehler aus, da die LED 
an und aus ging.

Die  Ausgänge PD5 und PD6  kommen leider nicht nach der gewünschten Zeit 
so wie ich es programmiert habe. Also schließe ich daraus, dass meine 
Programm einen oder mehrere Fehler hat.
Oder könnte das noch was anderes sein??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arne(Anfänger) schrieb:

> Die  Ausgänge PD5 und PD6  kommen leider nicht nach der gewünschten Zeit
> so wie ich es programmiert habe. Also schließe ich daraus, dass meine
> Programm einen oder mehrere Fehler hat.
> Oder könnte das noch was anderes sein??

Noch mal ins Datenblatt schauen, was die Einstellung

  (1<<CS02)|(1<<CS01);

beim Timer 0 bewirkt.
Das ist die Einstellung für externe Taktquelle. Solange du keinen 
externen Takt am Pin T0 an den Prozessor anlegst, fehlt dem Timer 
schlicht und ergreifend der Anreiz zu zählen :-)

> Wenn ich soviel überflüssige  Zeilen einfüge hoffe ich, dass es ein
> bisschen übersichtlicher ist.

Wenn du Übersicht willst, dann mach einen Blockkommentar anstatt unnötig 
vieler Leerzeilen :-) Im Blockkommentar beschreibt man, worum es im 
nächsten Abschnitt geht, welche Überlegungen dahinter stecken, etc. Auch 
das gliedert den Code in Blöcke
int main()
{
  //
  // IO konfigurieren
  //
  DDRC = 0x00;
  DDRD = 0xff;

  //
  // Timer0 konfigurieren:
  //    Vorteiler: 1024
  //    Overflow Interrupt ein
  // Das ergibt bei 1Mhz Taktfrequenz einen Overflow-Frequenz von
  // 1000000 / 1024 / 256 = 3.81 Hz
  // bzw.  einen Interrupt alle  1 / 3.81 = 0.26 Sekunden
  //
  TCCR0  = (1 << CS02) | (1 << CS00);  // Vorteiler 1024
  TIMSK |= (1 << TOIE0);               // Timer Overflow Interrupt freischalten

  sei();               // Interrupts freigeben

  //
  // Alles fertig konfiguriert ...
  // ... und los gehts!
  //
  while(1)

Autor: Arne(Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh hammer es funktioniert....mein Tag ist gerettet.
Vielen Danke für Ihre Hilfe.
Der Fehler lag wirklich in der falschen programmierung von CS1..dabei 
dachte ich die ganze Zeit das ich CS0 geschrieben habe.. Irgendwie 
fehlte mir der Blick-

vielen Danke
MFg Arne

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.