mikrocontroller.net

Forum: Compiler & IDEs Software-Timer beim ATmega168


Autor: Sven Köhler (skoehler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Anfänger hätte ich gern etwas Nachhilfe: Ich möchte beim ATmega168 
in C einen Software-Timer implementieren. Wer ist bereit, mir dazu 
kompetente Hinweise zu geben? Ich erwarte nicht, dass mir jemand den 
kompletten Code liefert!

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau meinst Du mit Software-Timer?

Wenn das mehrere Timer sein sollen, die aber nur mit einem Hw-Timer 
laufen, dann kann ich Dir das im Anhang geben.
Mit System_Init() initialisiert man Timer0. Mit SetTimer setzt man einen 
Sw-Timer. Der erste Parameter dabei ist die Dauer zwischen 2 
Software-IRQs in ms, der zweite ein Zeiger auf eine void-Funktion ohne 
Parameter. Die Funktion selbst liefert ein Handle vom Typ int auf den 
Softwaretimer, welches gebraucht wird, um den Timer zu löschen. Die 
Funktion KillTimer(int) löscht den entsprechenden Timer bei Übergabe des 
Handles.
z.b.:
int h;

void mach()
{
  static int count;
        count++;
  printf("1 sek um!/n");
  if(count>10) KillTimer(h); 
}

int main()
{
  System_Init();
  h=SetTimer(1000,&mach);
  while(1);
  return 0;
};


MfG Mark

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

Bewertung
0 lesenswert
nicht lesenswert
Was verstehst du unter einem 'Software Timer'.

Ein Timer ist ganz einfach eine Variable, die
regelmässig hochgezählt wird. Bei erreichen von
bestimmten Zählerständen kann eine Funktionalität
ausgelöst werden.

Ergo; Im einfachsten Fall
ist ein 'Software Timer'

int main()
{
  unsigned char Timer;

  while(1)
    Timer++;
}

Ich denke aber nicht, dass du das im Sinn hattest :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie klappt bei mir das Anhängen von Dateien nicht, also schick ich 
den oben erwähnten Code so:
#define Used_Timers 8
typedef void (*function) (void);
unsigned int SwTimer[Used_Timers],OCR[Used_Timers];
function TimerISR[Used_Timers];


void System_Init()
{
  TCCR0=3|(1<<WGM01);      //Prescale=64
  OCR0=(F_CPU/64)/1000;    //jede ms ein Interrupt
  TIMSK|=(1<<OCIE0);
  int i;
  for(i=0;i<Used_Timers;i++)
  {
    OCR[i]=0;
    SwTimer[i]=0;
  };
  sei();
}

ISR(TIMER0_COMP_vect)
{

  int i;
  for(i=0;i<Used_Timers;i++)
  {
    if(OCR[i]!=0)
    {
      if(SwTimer[i]>=OCR[i])
      {
        SwTimer[i]=0;
        TimerISR[i]();
      }
      else
      SwTimer[i]++;
    }
  }
}

int SetTimer(unsigned int OCRtmp,function to_exe)
{
  //suchen nach freiem Timer
  int handle;
  for(handle=0;handle<Used_Timers;handle++)
  {
    if((OCR[handle])==0)
    {
      OCR[handle]=OCRtmp;
      TimerISR[handle]=to_exe;
      return handle;
    };
  };
  return -1;
}

void KillTimer(int TimerID)
{
  SwTimer[TimerID]=0;
  OCR[TimerID]=0;
}


MfG Mark

Autor: Sven Köhler (skoehler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank für den Code! Genau das hatte ich gemeint.

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

Bewertung
0 lesenswert
nicht lesenswert
Mach aber anstelle der 3 einzelnen Arrays
eine Struktur und erst davon dann ein Array.

struct Timer {
  unsigned int Timer;
  unsigned int OCR;
  function TimerISR;
};

struct Timer SWTimers[Used_Timers];

Autor: Werner A. (homebrew)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal das ganze für den Mega168 zusammengefasst.
Generell funktioniert das ganze, nur stimmt die Zeit von 1 Sekunde nicht 
richtig. Ich komme irgendwie auf 10 Sekunden.
Ich benutze den internen Oszillator mit 8 MHz und der Teiler 8 ist 
eingeschaltet.
Kann da vielleicht mal jemand drüber schauen?

Danke
  Werner

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.