Forum: Mikrocontroller und Digitale Elektronik TIMER0_COMP_vect - Laufzeit Kontrolle


von hal (Gast)


Lesenswert?

Hallo,
ich hab (höchst wahrscheinlich) eine sehr dämliche Verständnisfrage.

- ATmegaXX
- JTAG
- AVR Studio

Angenommen ich habe eine ISR(TIMER0_COMP_vect) eingerichtet die alle 
10ms aufgerufen wird. Um nun zu kontrollieren wie lange die Abarbeitung 
der Routine braucht könnte ich doch einfach einen Haltepunkt am Ende der 
Routine setzten und mir dann den Wert TCNT0 anschauen? oder nicht? 
Natürlich mit der Unsicherheit, dass Timer0 nicht mehrmals durchgelaufen 
ist.

danke
hal

von Karl H. (kbuchegg)


Lesenswert?

hal schrieb:

> Angenommen ich habe eine ISR(TIMER0_COMP_vect) eingerichtet die alle
> 10ms aufgerufen wird. Um nun zu kontrollieren wie lange die Abarbeitung
> der Routine braucht könnte ich doch einfach einen Haltepunkt am Ende der
> Routine setzten und mir dann den Wert TCNT0 anschauen?

Könntest du.
Je nach eingestelltem Vorteiler ist der Wert, den du kriegst so 
nichtssagend wie gar keine Messung.

Du könntest auch im Simulator auf den Anfang der ISR einen Breakpoint 
setzen, den im Simualtor angezeigten Zyklencounter ablesen (bzw. gleich 
darunter die aktuelle Simulationszeit), am Ende der ISR nachmal dasselbe 
und mit der Differenz die Zeit ablesen (ich glaub der SImulator hat 
sogar eine simulierte Stoppuhr für diesen Zweck, dann braucht man nicht 
rechnen).

Du könntest auch am Anfang der ISR einen Pin toggeln und am Ende wieder 
und dann mit dem Oszi die Pulsdauer ausmessen. Das hat den Vorteil, dass 
du tatsächlich die reale Zeit misst, so wie sie tatsächlich auftritt und 
du von nichts anderem, wie zb korrekt eingestellten Clock-Fuses, 
abhängig bist. Das was du misst, ist auch der tatsächliche 
Zeitverbrauch.

von Peter D. (peda)


Lesenswert?

Ein Wert reicht nicht, Du weißt ja nicht, wann der Eintritt erfolgte.
Du mußt die Differenz bilden Austritt - Eintritt.


Peter

von hal (Gast)


Lesenswert?

Mit dem Simulator funktioniert ja leider nicht die _delay..-Funktionen. 
Da ich im Projekt eine LCD-Display verwende und die Timingfunktionen 
über _delay gesteuert werden geht das leider nicht. Klar könnte ich die 
ISR Routine isolieren und testen, aber ich suche einen Weg ohne dies zu 
tun.

Pin toggeln ist klar, aber für was ist denn dann mein JTAG-Debugger gut? 
OK, Haltepunkte, Registerwerte usw. auslesen, in Ordnung.

Gibt es denn wirklich keinen Weg die Taktzyklen über den JTAG-Debugger 
zu bekommen, evtl. auch indirekt?

von Peter D. (peda)


Lesenswert?

hal schrieb:
> Mit dem Simulator funktioniert ja leider nicht die _delay..-Funktionen.

Wie kommst Du darauf?

Daß ohne Optimierung die Delays länger sind, das stört das LCD ja nicht.


Peter

von hal (Gast)


Lesenswert?

Wenn ich das Programm mit dem Simulator starte tut sich ab _delay_xx 
einfach nix mehr. Das Programm bleibt einfach stehen.

von Karl H. (kbuchegg)


Lesenswert?

hal schrieb:
> Wenn ich das Programm mit dem Simulator starte tut sich ab _delay_xx
> einfach nix mehr. Das Programm bleibt einfach stehen.

Es bleibt nicht stehen. Es dauert nur seine Zeit, bis der Simulator die 
paar Tausend Schleifendurchgänge gemacht hat.
Am besten ist es (wenn du den _delay nicht stillegen willst, weil du 
Zeit im Simulator messen musst), wenn du dir nach dem _delay einen 
Breakpoint setzt und dann den Simulator mittels F5 laufen lässt. Aber 
erwarte dir keine Wunder. Im Millisekundenbereich dauert das schon seine 
Zeit.

von hal (Gast)


Lesenswert?

Ja so geht's ... mit dem Wissen, dass die _delay_xx mit dem Simulator 
extrem länger dauert. Ich hab am Anfang zwei Wartezeiten mit 3 Sekunden 
für die Versionsanzeige auf dem LCD-Display.

Allerdings wäre es toll wenn es auch in 'echt' mit dem JTAG-Debugger 
gehen würde!? ;-)

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.