Forum: Mikrocontroller und Digitale Elektronik Universele Timer Headerdatei


von Alexander S. (alexander_s12)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe folgendes Problem. Bin noch ziemlich in den Anfängen mit der 
Programmierung der AVR's in c. Einfache Ein/Ausgaben, LCD, ADC und PWM 
habe ich zwar dank der Seite www.mikrocontroller.net und deren Forum 
hingekriegt (an dieser Stelle nochmal herzlichen Dank), aber bei fast 
allen meinen ernsthaften Projekten stosse ich an ein Problem! ich muss 
eine Zeit ein oder ausschaltverzögert starten oder einen Impuls 
verlängern.

Natürlich habe ich zu diesem Problem das Forum schon durchgesucht und 
auch in anderen Foren aber nichts wirklich brauchbares gefunden. Was ich 
gefunden habe war ein Scheduler der erlich gesagt für meinen Stand der c 
Kentnisse zu komliziert ist. Aber dasa was ich verstanden habe löst 
nicht wirklich mein Problem

Also meine Frage: ist es überhaupt möglich in c so etwas zu 
programmieren?

Im angehängtem Code habe ich versucht das Problem anzugehen.

Hoffe auf viele Anregungen und Vorschläge.

Schonmal vielen Dank!

von Thomas E. (thomase)


Lesenswert?

Alexander S. schrieb:
> Also meine Frage: ist es überhaupt möglich in c so etwas zu
> programmieren?
In C geht alles.

Alexander S. schrieb:
> Im angehängtem Code habe ich versucht das Problem anzugehen.
Funktionen gehören in ein *.c-File und haben in einer Headerdatei nichts 
verloren. Sowas ist kein Programm.

Daß in der Timer-ISR Variablen hochgezählt werden, um längere Zeiten zu 
erzeugen ist gut. Was nicht gut ist, ist der Timermodus. Ich denke mal 
du willst Millisekunden zählen. Dann tu das auch. Guck dir den CTC-Modus 
an.
Damit lässt sich der Timer besser einstellen.

Den Sinn deiner Funktionen kann ich irgendwie nicht erkennen, weil man 
nicht sieht, wann und wieso sie aufgerufen werden.

Also vernünftiges Programm posten.

mfg.

PS
Auch wenn es dem Compiler egal ist, aber Variante mit "W" tut schon ein 
bisschen weh in den Augen.

von amateur (Gast)


Lesenswert?

Aber...
Die Prozessoren haben meist mehrere Timer, die durch die Belegung 
unterschiedlichster Register initialisiert werden.
Es werden verschieden "breite" Variablen zur Steuerung, sogar bei ein 
und demselben Prozessor, verwendet.
Die Zeitbasen und natürlich deren Initialisierung sind sehr 
unterschiedlich. Dazu kommt noch wenigstens ein Dutzend Betriebsarten.
Vor lauter ifdef's kommst Du dabei gar nicht mehr zum Kodieren.
Wer so etwas dann auch noch warten will... Freiwillige vor! Ich stell' 
mich gern ganz hinten an.

von Alexander S. (alexander_s12)


Lesenswert?

Also zuerst mal danke für die ersten Beiträge.

Thomas bei dir muss ich mich wohl für meine Gramatik entschuldigen, ist 
leideer meine Schwäche.

Das in einer Headerdatei keine Funktionen hingehören ist mir neu, weil 
wenn ich die printf Funktion aufrufen will binde ich die stdio.h ein. 
Oder verstehe ich was falsch? Wie gesagt ich bin noch dabei es zu 
lernen.

Sorry wegen der Unübersicht des Codes. die Funktion timer_1 soll dan 
nach einbinden der Headerdatei Timer.h folgend aufgerufen werden.

if(timer_1(10,2))
{
etwas tun wenn 10 Sekunden vergangen sind
}

Hoffe du kannst jetzt nachfolziehen was ich meine.

Amateur der von mir gewählte Ausdruck universel ist natürlich weit 
ausgeholt, in meinem Fall würde es reichen wenn ich die Headerdatei für 
die Kontroller Mega 8 - 32 benutzen könnte.

von Thomas E. (thomase)


Lesenswert?

Alexander S. schrieb:
> Das in einer Headerdatei keine Funktionen hingehören ist mir neu, weil
> wenn ich die printf Funktion aufrufen will binde ich die stdio.h ein.
> Oder verstehe ich was falsch?
Mit der Headerdatei wird dem Compiler die Funktion bekannt gemacht. Die 
steht aber in einer Library. Das sind ganz einfach gesagt, etliche  *.c, 
die schon compiliert sind.

Für den Anfang arbeitest du erstmal nur in einer *.c-Datei. Dann kannst 
du auf eigene Headerdateien ganz verzichten. Die dienen in ersten Linie 
dazu, Funktionen und Variablen anderen *.c-Dateien im Projekt bekannt zu 
machen. Also wenn du mehrere *.c-Dateien hast. Oder auch um Code aus 
anderen Projekten einzufügen. Aber so weit bist du noch nicht.

Die Headerdateien der libc musst du natürlich weiterhin einbinden, also 
stdio.h & Co.


mfg.

von Karl H. (kbuchegg)


Lesenswert?

Alexander S. schrieb:

> gefunden habe war ein Scheduler der erlich gesagt für meinen Stand der c
> Kentnisse zu komliziert ist. Aber dasa was ich verstanden habe löst
> nicht wirklich mein Problem

Dein Ansatz ist ja grundsätzlich nicht so schlecht.
Nur versuch noch nicht, dafür eine allgemeingültige 
Ein_Für_Allemal_Lösung zu finden. Denn wenn etwas allgemein verwendbar 
sein soll, dann werden die Dinge meistens kompliziert. Wohingegen der 
jeweilige Spezialfall meist sehr einfach ist.

Tip.
Meistens vereinfachen sich solche Timing-Sachen, wenn du die Dinge 
umdrehst. Zähl nicht die Zeit hinauf, sondern herunter! Aus deinem 
Hauptprogramm gibst du eine Zeit vor (indem du sie einer Variablen 
zuweist) und in der ISR zählst du die Zeit sukzessive herunter, bis die 
0 erreicht wurde. Und dann machst du deine Aktion (die in vielen Fällen 
einfach nur das Schalten eines Portpins ist).

zb. das zeitverzögerte Ausschalten einer LED
1
volatile uint8_t offTime;
2
3
ISR( ... )
4
{
5
  if( offTime > 0 )
6
  {
7
    offTime--;
8
    if( offTime == 0 )
9
      LED ausschalten
10
  }
11
}
12
13
int main()
14
{
15
  ...
16
  Timer initialisieren
17
  ...
18
19
   sei();
20
   while( 1 ) 
21
   {
22
      ....
23
      if( irgendwas )
24
      {
25
        LED einschalten
26
        offTime = 30;
27
      }
28
   }
29
}

wenn 'iegendwas' eintritt, dann schaltest du die LED ein und setzt in 
offTime die notwendige Zahl für die zeitverzögerung. In der ISR wird 
diese 'Zeit' dann runtergezählt und wenn die so vorgegebene Zeit 
verstrichen ist, dann schaltet die ISR die LED wieder aus.

ganz einfach. ganz simpel.

Und was mit einer derartigen Variablen geht, geht auch mit 3. 
Prinzipiell gehts auch mit 200, nur nimmt man dann schon ein Array für 
die Zeitvariablen und keine 200 Einzelvariablen mehr.

Das ist jetzt natürlich auf den speziellen Anwendungsfall 
'zeitverzögertes Ausschalten' einer LED zugeschnitten. Wenns allgemeiner 
verwendbar sein soll, dann wirds etwas komplizierter. Daher belass es 
momentan dabei und schneidere dir diese Funktionalität für deinen 
konkreten Anwendungsfall zurecht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.