PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR- ATmega8


St@N
2009-02-16, 10:18:11
moin :)

ich bräuchte mal hilfe für 2 programme, sollten im avr studio oder vergleichbaren laufen

Aufgabe 1:
Schreiben sie eine Interruptserviceroutine, die einen 24 Bit Zähler, der im SRAM an der Adresse 0x60 gespeichert ist um 2 inkrementiert. Achten sie darauf, dass durch die Interruptserviceroutine keine Informationen ungewollt verändert werden.

Hier weiß ich nur das ich vorher sichere und das gesicherte am Ende wiederhole, push und pop...das mit dem 24 Bit Zähler verstehe ich nicht so ganz (3 Register nutzen?!?!) und dann die Adresse verwenden...da weiß ich nicht so recht wie ich das machen soll.


Aufgabe 2:
Sie brauchen eine sehr genaue Zeitangabe zwischen 2 ereignissen. Mit welcher Hardware des ATmega8 können sie diese Messung effektiv gestalten? Wie sähe der mögliche Ablaufplan der Messung aus? Für ihren 16Bit Timer stehen ihnen Prescaler kit 1,8,16, 64, 256 oder 1024 zur verfügung. Was müssen sie tun wenn ihr Prozessor mit 1MHZ taktet, sie eine Genauigkeit von +-5us benötigen und die längste mögliche Zeit zwischen 2 signalen 1s beträgt?

Bei der Aufgabe hab ich ehrlich gesagt keinen Schimmer wie ich anfangen soll :(

Ich danke schonmal für Hilfe :)

Der_Donnervogel
2009-02-16, 20:47:14
Ich habe nie etwas mit dem ATmega8 gemacht, sondern nur mit 32-Bit Versionen und auch da fast nur mit C und kaum was mit Assembler (und wer rastet der rostet ;) ). Also alles bitte mit etwas Vorsicht zur Kenntnis nehmen.

Zuerst wird man wohl die Register sichern, die man verwenden will. Da der ATmega8 vermutlich nur 8-Bit Register hat und somit immer nur 8-Bit-Zahlen addieren können wird, wird man also wohl die Addition in drei Teile aufteilen müssen. Erst mal nimmt man das niederwertigste Byte der Zahl. Da muss man aufpassen wie die Zahl im Speicher abgelegt ist, ob das niederwertige Byte vorn oder hinten steht. Das holt man sich aus dem Speicher ins Register und addiert dort 2 hinzu und speichert das Ergebnis. Sofern das Carry-Bit gesetzt wurde (es hat also einen Übertrag gegeben) muss man dann dieses zum zweiten Byte dazu zählen, und das selbe dann nochmal mit dem dritten Byte falls es auch beim zweiten wieder das Carry-Flag gesetzt wurde.


Bei der zweiten Aufgabe auch mal ein Schnellschuß von mir. Kann aber gut sein, dass da noch ein Fehler drinn ist, also bitte auch selber durchdenken.
Der 16-Bit-Timer (ich nehme mal an der ist unsigned) kann also maximal bis 65536 zählen. Mit einem Prescaler wird der nicht bei jedem Takt hochgezählt sondern nur in den Intervallen die der Prescaler angibt. MHz sind ja eine Angabe pro Sekunde, folglich muss man also schauen dass der Timer in 1 Sekunde nicht überläuft. Eine Genauigkeit von +/- 5 us bedeutet dass man einen Intervall von 10 us hat. Eine us ist 10^-6 und der Takt von der CPU ist 1 MHz also 1.000.000 Takte pro Sekunde, folglich dauert ein Takt 1 us. Man hat also 10 Takte Zeit. 1.000.000 / 65536 = 15,2 man kommt also nicht mit dem Timer über die Runden ehe er abläuft, da man einen Prescaler von 16 bräuchte, aber nur 10 Takte warten darf. Ich denke also man wird die Messung auf 0,5 Sekunden auslegen müssen und dann den Wert speichern und dann für die restlichen 0,5 Sekunden ein zweites Mal messen und abschließend die beiden Werte addieren müssen.

St@N
2009-02-17, 14:47:48
danke dir, habs mit den tipps hinbekommen

Altes-Kamel
2009-02-17, 15:29:35
Fuer die Aufgabe 2 wuerd ich das InputCatchRegister nehmen, das merkt sich den Zaehlerstand wenn das Ereignis ausgeloest. Musst halt zwei nutzen und dann subtrahieren. Umrechnen geht dann relativ einfach schau halt welcher Prescaler am genauesten hinkommt und trotzdem ausreicht vom Zaehlerstand.