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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.