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.
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.
...