Forum: Mikrocontroller und Digitale Elektronik Programmablauf richtig? (OverfolwInterrupt???)


von Kathy (Gast)


Lesenswert?

Hallo Leute!

Ich habe eine Theorie, welche ich in die Praxis umsetzen möchte.
Jedoch möchte ich wovor ich loslege mal Eure Meinungen über mein
Vorhaben hören, um eventulle Verbesserungen zu nutzen oder Fehler
frühzeit zu vermeiden.

Also:
Ich programmiere mit C und benutze AVR Studio4 mit dem C-Compiler.

Mein Ausgewählter Mikrocontroller ist ein Tiny2313von ATMEL.
Mit dem Controller möchte ich vorerst 3 LED´s ansteuern.
Die  LED´S (LED1 und LED2) sollen ganz normal an einen Ausgang
angeschlossen werden und HIGH oder LOW sein.
Die LED3 möchte ich mit verschieden PWM-Werten ansteuern.Der PWM-Wert
hängt von zwei Eingängen ab.Achja die PWM realisiere ich mit der
vorhanden Hardware PWM (passende BITS im Passenden Register setzen und
ab gehts)

Eingänge:
1 0 -->100%
1 1 --> 50%
sonst 0%

Funktionsablauf:
--> Starttaster wird gedrückt (änderung wird in einem Bit als Wert
vorgegben.Stop übrigens auch)
-->LED1 und LED2 gehen an.
--> Eingänge werden geprüft ob PWM 50% oder 100%!
--> LED3 wird mit PWM-WERT eigeschaltet.

So jetzt leuchten alle drei LEDS und sollen nach ca 20. Sekunden
abeschaltet werden, wenn nicht erneut START gedrückt wird, oder Stop
gedrückt wurde.
Habe mir überlegt, das ich die Betreibsdauer von 20 Sekunden mit Hilfe
des Overflows-Interrupt des Timers realisiere. also wenn der Timer mir
meine PWM herstellt zählt der Counter  hoch und wenn der Wert von 255
auf 254 (bei z.B 8-Bit)wechselt....kommt dann der OverflowInterrupt?IST
DAS RICHTIG????????

in dem Interrupt Würde ich dann eine Variable(Hilfsregister) hochzählen
und mir ausrechnen (Taktfrequenz und so)....wiehoch die Variable gezählt
werden muss bis ich 20 Sekunden ereicht habe....Ausserdem prüfe ich im
Interrupt ob START oder STOP gedrückt wurden.
Wenn START gedrückt wird dann Variable auf NULL
wenn STOP gedrückt wird dann Variable auf ENDWERT setzen.
Wenn der Interrupt so oft ausgelöst hat, das meine Variable den
Vergeleichswert(ENDEWERT) erreicht hat---Dann Alles Auschalten.

Kann man das so machen.............?

Bin schon neugierig auf Eure MEINUNGEN!!

LG Kathy

von Kathy (Gast)


Lesenswert?

Mhhhh! Hallo hat keiner LUST mir zu helfen

von Olaf K. (Gast)


Lesenswert?

Naja, natürlich kannst Du es so etwa machen. Der Kreativität sind im
Prinzip keine Grenzen gesetzt, das ist ja das Schöne an den µCs.
Fang doch einfach mal an, das Programm zu schreiben, und simuliere
immer kleine Abschnitte im AVRStudio.

Verstehe ich richtig, Du willst PWM und die Zeitverzögerung mit
demselben Timer machen? Ich würde das lieber auf zwei Timer aufteilen,
ist für den Anfang übersichtlicher.

Der Timer zur Verzögerung und Tastenabfrage (angenommen, wir nehmen
Timer0) wird so eingestellt, daß er z.B. aller 10ms (= 100Hz) einen
Overflow auslöst (= von 255 nach 0!). Dazu sucht man sich einen
passenden Prescaler aus und lädt den Timer mit einem Wert vor, damit er
nicht jedesmal bei Null beginnt. Bei 4 MHz und Prescaler 1024 müßte der
8-bit-Timer etwa 39 mal bis zum Overflow (rechnerisch bei 256)
"ticken":
4000000/1024 = 39.0625
D.h. man lädt den Timer auf 256-39=217 vor. Das muß man auch jedesmal
in der Overflow-Interrupt-Routine so machen. Für längere Verzögerungen
lädt man niedrigere Werte vor, für 50 Hz z.B. 256-78=178.

Der tiny2313 bietet aber auch eine einfachere Möglichkeit: Den Compare
Interrupt. Hier stellt man einfach den Wert ein, bis zu dem der Timer
von Null bis zum Interrupt zählen soll, wir können also für 100Hz
direkt 39 als Compare-Wert einstellen. Im CTC-Modus springt der Timer
dann auch automatisch wieder zur Null zurück und fängt von vorn an, und
man braucht sich um nix mehr kümmern. Halt, Fallstrick: 39 ist falsch,
da der Timer erst dann zurückspringt, wenn die 40 kommen würde (wir
hätten also 40 Timer-Ticks lang gewartet), also nehmen wir 38 als
Compare-Wert. (Schau Dir mal die Application Note AVR091 an, da steht
ganz gut beschrieben, wann der Compare-Interrupt auslöst).

So, für Deine 20s Verzögerung mußt Du nun nur 2000 dieser
Compare-Interrupts zählen (100Hz x 20), das dürfte in C nicht schwer
sein. Oder besser wir zählen bis 2003, denn wir hatten oben ja keinen
geraden Compare-Wert rausbekommen (sondern 39.0625), d.h. die Frequenz
ist bei 39 etwas zu schnell (4000000 / 1024 /39 = ca. 100.16 Hz), das
können wir hier wieder teilweise ausgleichen.

Die Start-Stop-Tasten setzen den Zählerstand jeweils auf Min oder Max,
das kann man so machen. Du mußt nur dafür sorgen, daß der Zähler im
Stopmodus nicht z.B. weiterläuft und dann evtl. Unsinn rauskommt (z.B.
weil der Zähler überläuft und das Programm "denkt", es sei schon
wieder 20s Start-Modus angesagt).

Nochwas: Tasten haben die unangenehme Eigenschaft des "Prellens",
d.h. im Moment des Drückens und Loslassens gibt es für einige ms lang
ein Impulsgewitter. Sobald man Tasten ohne Hardwareentprellung
verwendet, sollte man sich daher Gedanken zum Entprellen per Software
machen. Peter Dannegger hat dazu z.B. eine geniale Routine geschrieben,
siehe (samt Diskussion dazu) Forum Codesammlung "Tasten entprellen -
bulletproof".

Ohne Entprellung kann es z.B. passieren, daß Deine "Start"-Taste
nicht nur beim Drücken, sonden auch beim Loslassen die 20s
Zeitverzögerung startet, und das wäre vielleicht unschön. Und in Deinem
nächsten Projekt brauchst Du vielleicht eh' eine anständige
Tastenentprellung.

MfG Olaf

von Kathy (Gast)


Lesenswert?

Hey Olaf! Das war ja mal neh echt nette Audkunft, dir mir einwenug
sicherheit gibt. Werde mich morgen mal ran setzen und einfach mal
probieren....falls dann fragen auftauchen werde ich mich melden.
Aber nochmal grossen Dank!
LG Kathy aus Dortmund

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.