2ms Interrupt
-
Hallo,
ich hab die Aufgabe gestellt bekommen ein Assembler Programm zu schreiben welches nach 2ms einen Interrupt auslösen soll. Hier tut sich nun aber ein Problem auf weil so wie ich die Aufgabenstellung verstehe darf ERST nach 2ms ein Interrupt auftreten davor aber nicht.
Hier mal die Daten:
Habe einen ATmega644P
Schreibe die Programme mit AVRStudio 4
die Taktfreqeunz ist 16MHz bei dem ATmega
und es gibt nur den kleinsten Timer also den der von 0-255 zählen kann.Hab schon alle möglichen Sachen probiert: Warten bis einmal Carryflag gesetzt ist und dann bis 500-256 hochzählen dann Interrupt oder im CTC-Mode (aber da nimmt man ja Interrupts) und dann kommt noch das Problem dazu, dass ja die Befehle auch Takte brauchen die sich dann dazuaddieren und die 2ms (500 Takte) wieder vereiteln.
Hoffe das mir bei dem Problem jemand eine elegante Lösung vor Augen führen kann.
-
Kannst du diesen Timer sleber zurücksetzen? Wenn ja, würde ich einfach zwei mal bis 250 zählen. Wenn der Timer kontinuierlich läuft, mußt du dir den Wert bei Aufruf merken und mitzählen, wie of du diesen Wert erreichst:
start = timer ziel = (start + dauer) % 256 runden = dauer / 256 while runden > 0 if timer = start --runden while timer != ziel nop
-
Ja mit C das ganze zu programmieren wäre sicher nicht so schwer, ich muss es aber mit der wirklichen Assembler-Sprache schreiben.
-
dann mußt du halt aus dem Code dot oben Assambler bilden - die zwei Schleifen sollten doch nicht allzu schwer sein, oder?
Ich kenne leider Assambler (bzw. den von der ATmega vewendeten Dialekt) nicht gut genug, um di auch noch diese Aufgabe abnehmen zu können - und wollen.
-
Du weisst vom Prinzip, wie dieser Timer funktioniert? (=> Datenblatt)
1. Kannst du den Zaehler des Timers auf beliebige Werte initialisieren (Register TCNT0) und im CTC-Modus immer bis zum Wert in OCR0 zaehlen, dann automatisch auf 0 zuruecksetzen und gleichzeitig einen IRQ ausloesen lassen...
2. Hat jeder timer mehrere clock prescaler zur Auswahl, mit denen du den Zaehler zB. auch nur alle 8 Takte runterzaehlen lassen kannst (CS02:0 im Register TCCR).
Mit 16MHz hast du T=1/16M, also 2ms/(1/16M)=32k Takte abzuwarten. Hm... Es gibt einen Prescaler, der die timer Clk mit Clk_io/256 fuettert... 32k/256 = .....
hth.Falls du dann noch konkrete Fragen zur Realisierung in Assembler hast, kannst du gerne noch mal nachfragen. Aber Anfragen fuer abgabefertige Loesungen zu Hausaufgaben sind eher unbeliebt.