Hallo, kann ich beim ATMEGA16 die frequenz auch anders regeln, als das ich einen externen taktgeber anschließe? das programm soll dann in der angegebenen frequenz ausgefürht werden. die frequenz soll im KHz bereich liegen. mfg
Dafür besteht im allgemeinen kein Bedarf... Wenn Du (variable) Frequenzen erzeugen willst, dann kannst Du mittels Timer-Interrupt und Sleep das Programm so "ausbremsen", dass es pro Timer-Int. nur "eine Runde" in der Mainloop macht und danach bis zum nächsten Interrupt schläft. Der Controller läuft dann zwar mit normalem Takt, macht aber nach jeder Runde eine Pause. Der Zeitanstand der Arbeitszyklen ist mittels Timer exakt einstellbar. ...
aber wie kann ich das machen, das ich dann immer einen schritt im hauptprogrammm weiter gehe? das hauptprogramm müsste ich dann ja immer als "interuptprogrmm" schreiben. ... ach nein, das geht ja auch nicht. das hauptporgramm ist ja im prinzip das schlafen, nur wenn der timer einen interupt auslöst, gehts mit meinem richtigen programm weiter. aber wie aknn ich das machen, das er immer den nächsten schritt, den er noch nicht ausgeführt hat ausführt?
Um das zufriedenstellend beantworten zu können, müsste ich wissen, was das Programm tun soll. Eine Möglichkeit ist die, den Programmcode in der ISR auszuführen, in der Mainloop wird dann nur gepennt. Das gibt aber dann Probleme, wenn ein zweiter Interrupt ins Spiel kommt, denn dann müssen ISRs möglichst kurz sein. Dann setzt man in der ISR einen Merker (Jobflag, Semaphore, Bitvariable, Boolean...). In der Mainloop fragt man alle Merker ab und verzweigt bei gesetztem Merker zur entsprechenden Routine. Diese löscht den Merker und arbeitet den Job ab, springt dann wieder zur Mainloop. Sind alle Jobs erledigt, fällt die Mainloop in den Sleep, wo der Controller vom nächsten Interrupt geweckt wird. Wenn jeder "Schritt" etwas anderes tun soll, dann hilft ein "Schrittzähler". Anhand dessen Zählerstandes wird zur entsprechenden Routine verzweigt (State-machine, Zustandsautomat). Hier kann indizierte Verzweigung über den Z-Pointer sehr hilfreich sein. ...
Also das programm schaltet immer wieder verschiedene ports auf ein und aus. es ist eine led schrift. diese wird dann vom Controller immer "geschrieben" und wieder gelöscht. so wie es im prozessortakt abläuft ist mir alles aber viel zu schnell und ich möchte nicht nach jedem schritt irgendwelche unterprogramme aufrufen, da ich dann ja auch noch mehrere verschiedene bräucht. vielen dank aber erstmal für deine antwort. das mit dem schrittzähler klingt gut. ich habe es aber noch nicht so richtig verstanden wie es funktioniert. evtl. könntest du mir ja noch ein paar befehle mit erwähenn. mfg
Spyro wrote: > Also das programm schaltet immer wieder verschiedene ports auf ein und > aus. es ist eine led schrift. diese wird dann vom Controller immer > "geschrieben" und wieder gelöscht. Also sowas wie Propeller-Clock, eine Schrift, die mittels einer LED-Leiste dargestellt wird? > so wie es im prozessortakt abläuft > ist mir alles aber viel zu schnell und ich möchte nicht nach jedem > schritt irgendwelche unterprogramme aufrufen, da ich dann ja auch noch > mehrere verschiedene bräucht. Dann schau Dir mal die vielen Propeller-Clock-Projekte an, die hier im Forum bereits diskutiert wurden. Die Suchfunktion könnte Dein Freund sein. > > vielen dank aber erstmal für deine antwort. das mit dem schrittzähler > klingt gut. ich habe es aber noch nicht so richtig verstanden wie es > funktioniert. Dann könnten Dir die Suchbegriffe "Zustandsautomat" und "state-machine" bei einer Suchmaschine Deiner Wahl behilflich sein. > evtl. könntest du mir ja noch ein paar befehle mit erwähenn. > mfg Die Befehle, die der Mega16 versteht, findest Du unter dem Suchbegriff "Instruction set summary" im Datenblatt des Mega16, die zugehörigen Erklärungen in der Hilfedatei zum AVR-Studio und in der Datei "AVR-Instruction-Set" von der ATMEL-Homepage. Übrigens: Dein Computer scheint kaputt zu sein, es sieht so aus, als wären dessen Großbuchstaben in der Gewerkschaft und würden gerade streiken. ...
Also ich habe jetzt sehr lange an vielen Stellen gesucht. doch leider finde ich zu diesem Schrittzähler einfach nichts so richtig. Vielleicht kann mir ja noch jemand weiter helfen, da ich noch nichtmal einen richtigen Ansatz habe.
Wenn Du Sachen in einem bestimmten Zeitraster machen willst, dann ist ein Timerinterrupt die erste Wahl. Peter
ja, einen Timerinterrupt will ich auch verwenden. Mein einziges Problem ist nur, das ich nicht weiß, wie ich diesen Schrittzähler mache, da ich ja irgendetwas brauche, damit immer der nächste Schritt ausgeführt wird.
Spyro wrote: > ja, einen Timerinterrupt will ich auch verwenden. Mein einziges Problem > ist nur, das ich nicht weiß, wie ich diesen Schrittzähler mache, da ich > ja irgendetwas brauche, damit immer der nächste Schritt ausgeführt wird. Unter "Schrittzähler" wirst Du auch keine Informationen finden, eher unter "state machine" oder "Zustandsautomat". Das Prinzip ist recht einfach. Du zerlegst die zu erledigende Arbeit erstmal in einzelne Schritte, damit Du überhauprt erstmal weißt, was zu tun ist. Wenn Du das analysiert hast, kannst Du festlegen, wieviele unterschiedliche Routinen im Spiel sind und welche Jobs von einundderselben Routine durch sich ändernde Parameter (z.B. Spaltennummer in Text-Bitmap) erledigt werden können. Angenommen, Du hast 'ne Bitmap von Leuchtpunkten (anzuzeigender Text, bereits in Pixel aufbereitet, jedes Byte verkörpert 8 übereinander liegende Punkte, die per 8 rotierende LEDs angezeigt werden sollen) im RAM liegen. Dann ist der Pointer auf RAM schonmal als Schrittzähler geeignet. Er legt fest, welche Grafikspalte an die LEDs auszugeben ist. Läuft der Pointer über, so wird er auf Anfang des RAM-Bereiches gesetzt und ein weiterer Zähler erhöht. Anhand dieses Zählers kann die Anzeigedauer bis zum Wechsel des Textes verwaltet werden. Du kannst es natürlich auch als stinknormales Programm mit verschachtelten Schleifen schreiben und statt eines Wait_xyz ein Sleep einfügen. Im Hintergrund läuft dann ein Timer (mit Interrupt) und weckt den Controller in regelmäßigen Abständen. Die ISR darf dabei sogar leer sein, es geht nur um das pünktliche Wecken. Haarig wird es dann aber, wenn der Controller mehr zu tun bekommen sollte und weitere Interrupts benutzt werden. ...
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.