www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfache Uhr/Timer


Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie will mein Timer einfach nicht funktionieren (16Bit Timer an 
ATMega16). Ich dachte eigentlich das wäre ganz einfach, aber es tut sich 
rein garnichts (eigentlich sollte alle 1000ms eine LED blinken).

Da ich das ganze zum ersten mal mache (Timer + Interrupts) habe ich 
wahrscheinlich einen ganz blöden Fehler gemacht. Sieht vielleicht jemand 
was?
Danke!


//-------------- INCLUDES 
------------------------------------------------

#include <avr\io.h>      // Input/output an den Pins
#include <avr\interrupt.h>  // Interrupts
#include "Structs.h"


//-------------- GLOBALS 
------------------------------------------------

struct strTime    curTime;
char      msFlag    = 1;


//---------------------------------------------------------------------- 
--------------------
//---------------------------------------------------------------------- 
--------------------
//
//---------------------------------------------------------------------- 
--------------------


int main(void)
{
  // Timer initialisieren
  OCR1A = 0x002B;        // Wert im compare register (sollte bei 
11,0592MHZ Quarz eine MS bedeuten??)
  TIMSK |= (1<<OCIE1A);    // Bitte Interrupt auslösen
  TCCR1B = (1<<CS12);      // Prescaler (256?)

  // Init time
  curTime.ms   = 0;
  curTime.s   = 0;
  curTime.m   = 0;
  curTime.h   = 0;

  // Interrupts AN
  sei();


  // MainLoop
  while(1)
  {

    if( msFlag == 1 )
    {
      msFlag = 0;
      doAction();
    }//end if

  }//end while


  return 1;

}//end main





/* 
====================================================================== 
*/
/* Interrupt Service Routine 
*/
/* 
====================================================================== 
*/

// Uhrzeit-Timer-Interrupt
ISR(TIMER1_COMPA_vect)
{
  // Zählregister resetten
  TCNT1 = 0;

  // Um 1 ms weiterlaufen
    curTime.ms++;
  if( curTime.ms > 1000 )
  {
    curTime.ms = 0;

    msFlag = 1;

    curTime.s++;
    if( curTime.s > 59 )
    {
      curTime.s = 0;

      curTime.m++;
      if( curTime.m > 59 )
      {
        curTime.m = 0;

        curTime.h++;
        if( curTime.h > 23 )
        {
          curTime.h = 0;
        }//end if
      }//end if
    }//end if
  }//end if
}

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner eine Idee? Ist bestimmt ein ganz einfacher 
Anfängerfehler ;-)

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Stichwort zu deinem Problem heißt "volatile"

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Kommentar!
Mit volatile hats prima geklappt.  Danke :-D

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.