Forum: Mikrocontroller und Digitale Elektronik Frequenz anders als mit externer Taktquelle regeln?


von Spyro (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Spyro (Gast)


Lesenswert?

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?

von Hannes L. (hannes)


Lesenswert?

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.

...

von Spyro (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Spyro (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Wenn Du Sachen in einem bestimmten Zeitraster machen willst, dann ist 
ein Timerinterrupt die erste Wahl.


Peter

von Spyro (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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