Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 6: Genauigkeit des Simulators?


von Hawa M. (hawamand)


Angehängte Dateien:

Lesenswert?

Hallo,
Wieder mal Anfängerfragen von mir...

Ich habe im Atmel Studio 6 einen ATmega328 simuliert.
- Timer0 mit Prescaler CLK/8
- CTC mode
- compare a und b
- enable alle Timer0 Interrupts

Im Simulator habe ich für jede Interrupt-Routine eine Zählervariable 
definiert und auf dieses Inkrement je einen Breakpoint gelegt.

Die Erwartungshaltung war nun die, dass nach Auslösen eines Compare-IRQ 
bei CLK/8 wohl noch einzelne Schritte weiterzählt (Daten auf Stack 
etc.), bis der Breakpoint in der IRQ-Routine erreicht wird. Soweit so 
gut, das klappte auch.

Wenn ich nun aber in der Simulation den Prescaler auf CLK/1024 umstelle, 
dann zählt TCNT0 trotzdem noch über den zum IRQ führenden Compare-Wert 
hinaus, d.h. bis zum Erreichen des Breakpoint vergehen mindestens 1024 
Clock-Zyklen nach dem Auslösen des IRQ.

Im Anhang befindet sich der simulierte Code sowie der Screenshot beim 
Erreichen der Compare B IRQ-Routine. Bei TCNT0 ist ersichtlich, dass der 
Zähler bereits 1 weitergezählt hat, also weitere 1024 Zyklen vergangen 
sind.

Kann das sein?
Diese >1024Zyklen bis zum Erreichen der IRQ Routine kommen mir doch 
etwas hoch vor. Erklärungen dazu?

Gruss!

von Stefan E. (sternst)


Lesenswert?

hawa mand schrieb:
> Kann das sein?
> Diese >1024Zyklen bis zum Erreichen der IRQ Routine kommen mir doch
> etwas hoch vor. Erklärungen dazu?

Einfach mal im Datenblatt nachlesen, was genau beim Compare-Match 
passiert.

von Hawa M. (hawamand)


Lesenswert?

Stefan Ernst schrieb:
> Einfach mal im Datenblatt nachlesen, was genau beim Compare-Match
> passiert.
Ich finde nichts zu übermässig langen Latenzzeiten - oder habs falsch 
verstanden. Was genau meinst du?

von Stefan E. (sternst)


Lesenswert?

hawa mand schrieb:
> Was genau meinst du?

Timer0 -> Output compare unit

von Bernie (Gast)


Lesenswert?

@ Stefan Ernst

Was machst du es so spannend? Kleiner Tipp?

von Stefan E. (sternst)


Lesenswert?

Bernie schrieb:
> Was machst du es so spannend? Kleiner Tipp?

Was soll daran spannend sein? Wenn es dich interessiert, brauchst du 
doch auch nur ins Datenblatt zu schauen. Die Aussage, die das erklärt, 
was der OP beobachtet hat, ist weder schwer zu finden, noch schwer zu 
verstehen.

von BladeRunner (Gast)


Lesenswert?

Sternst,
meinst Du die Belehrungskeule hilft hier was?
Er fragt offen nach, und vielleicht (man mag es kaum glauben) versteht 
er wirklich nicht wo das Problem liegt. Immerhin gibt er direkt an 
Anfänger zu sein.
Was ist so schwer daran kurz zu erläutern was das Problem ist. Zumal es 
sowohl Dich als auch ihn deutlich weniger Zeit kosten würde als ihr 
jetzt schon investiert habt und es auch anderen helfen kann.

von Achim S. (achims)


Lesenswert?

Hallo
Hab da auch mal eine kleine Frage. Muss man zum AVR Studio 6 noch die 
WinAVR nehmen?
achim

von Hawa M. (hawamand)


Lesenswert?

Achim Seeger schrieb:
> Hab da auch mal eine kleine Frage.
Stell die doch bitte in einem eigenen Thread, danke.
Hier geht es um die Atmel Studio Simulation.

von Hawa M. (hawamand)


Lesenswert?

BladeRunner schrieb:
> Immerhin gibt er direkt an Anfänger zu sein.
Nicht Anfänger der Elektronik, aber sehr wohl Anfänger auf AVR.

> Was ist so schwer daran kurz zu erläutern was das Problem ist.
Frag ich mich auch, ehrlich.

Ich schau (nochmals) ins Datenblatt, vielleicht fällt mir der 
entscheidende Abschnitt ja beim erneuten Durchsehen auf.

Oder erbarmt sich wider Erwarten doch noch sternst und gibt etwas von 
seinem Wissen preis...

@sternst:
ganz ehrlich: das erste was mir bei deiner Antwort in den Sinn kam war: 
Uhu.
Den Wissenden durchscheinen lassen aber keine konkreten Antworten geben. 
Im OffTopic schreibt der erwähnte Vogel dann jeweils "Denk mal drüber 
nach". Denk auch mal drüber nach!

von Martin K. (maart)


Lesenswert?

Wenn du schon mit dem Simulator rumspielst, ist es manchmal auch 
interessant zu sehen, wie der Compiler den C-Code in Assembler umsetzt.
Dein Code (Optimierungen habe ich abgeschaltet) wird hierzu:
1
0000001E  JMP 0x0000006A    Jump
2
3
4
ISR(TIMER0_COMPB_vect) {
5
0000006A  PUSH R1    Push register on stack 
6
0000006B  PUSH R0    Push register on stack 
7
0000006C  IN R0,0x3F    In from I/O location 
8
0000006D  PUSH R0    Push register on stack 
9
0000006E  CLR R1    Clear Register 
10
0000006F  PUSH R24    Push register on stack 
11
12
00000070  PUSH R28    Push register on stack 
13
00000071  PUSH R29    Push register on stack 
14
00000072  IN R28,0x3D    In from I/O location 
15
00000073  IN R29,0x3E    In from I/O location 
16
  compb_count++;
17
00000074  LDS R24,0x0100    Load direct from data space
Wenn jetzt der Interrupt auftritt, passiert folgendes:
Der Prozessor springt die Adresse 0x1E an, von dort wird dann auf die 
Adresse der Interruptroutine gesprungen. Bis deine Variable compb_count 
hochgezählt werden kann, sind schon 18 Takte vergangen. Der Timer zählt 
währenddessen aber munter weiter.

von Stefan E. (sternst)


Lesenswert?

BladeRunner schrieb:
> Was ist so schwer daran kurz zu erläutern was das Problem ist. Zumal es
> sowohl Dich als auch ihn deutlich weniger Zeit kosten würde als ihr
> jetzt schon investiert habt und es auch anderen helfen kann.

Schwer ist daran gar nichts. Aber der Umgang mit dem Datenblatt ist ein 
Basis-Handwerk für jemanden, der µC programmieren will. Und auch hier 
gibt es so was wie Übung. Je häufiger er selber seine Nase da rein 
steckt, desto vertrauter wird er damit, desto schneller und einfacher 
kann er zukünftig seine Problem selber lösen.

1
Whenever TCNT0 equals OCR0A or OCR0B, the comparator signals a match.
2
A match will set the Output Compare Flag (OCF0A or OCF0B) at the next
3
timer clock cycle. If the corresponding interrupt is enabled, the Output
4
Compare Flag generates an Output Compare interrupt.
Wann löst der Interrupt aus?
Wenn er enabled ist und das Compare-Flag gesetzt ist.
Wann wird das Compare-Flag gesetzt?
"at the next timer clock cycle".

von Stefan E. (sternst)


Lesenswert?

hawa mand schrieb:
> Oder erbarmt sich wider Erwarten doch noch sternst und gibt etwas von
> seinem Wissen preis...
>
> @sternst:
> ganz ehrlich: das erste was mir bei deiner Antwort in den Sinn kam war:
> Uhu.
> Den Wissenden durchscheinen lassen aber keine konkreten Antworten geben.
> Im OffTopic schreibt der erwähnte Vogel dann jeweils "Denk mal drüber
> nach". Denk auch mal drüber nach!

Jemanden, der helfen will, vorzuwerfen (geradezu zu beschuldigen) er 
wäre nicht hilfreich genug, ist ja auch recht "nett".

Man kann doch wohl kaum behaupten, ich hätte in Rätseln gesprochen, oder 
nur vage Andeutungen gemacht. Ich habe klar gesagt, dass die Antwort im 
Datenblatt in der Beschreibung des Compare-Match zu finden ist, und auf 
Nachfrage auch den konkreten Abschnitt genannt. Und die Info ist dort 
auch nicht irgendwie versteckt, sondern steht gleich in den ersten 
Sätzen und ist doch ziemlich offensichtlich. Denn mal ehrlich, wenn man 
auf der Suche nach einer Erklärung für die Beobachtung im Ursprungs-Post 
ist, und dann anfängt den Abschnitt zu lesen, wie kann einem dann das 
"at the next timer clock cycle" nicht sofort ins Auge springen? Gut, 
jeder kann mal Tomaten auf den Augen haben, das ist dann aber kein 
Grund, persönlich zu werden.

von Hawa M. (hawamand)


Lesenswert?

Stefan Ernst schrieb:
> Jemanden, der helfen will, vorzuwerfen (geradezu zu beschuldigen) er
> wäre nicht hilfreich genug, ist ja auch recht "nett".
Ich entschuldige mich dafür, ehrlich. Nach noch etwas drüber nachdenken 
habe ich wohl die falsche Wortwahl getroffen - wenn man sich kennt und 
direkt in die Augen schauen kann kann das klappen, aber nicht via 
Internetforum. Sorry.

> Man kann doch wohl kaum behaupten, ich hätte in Rätseln gesprochen
Naja, wenn das Gegenüber Tomaten auf den Augen hat: ein bisschen 
schon...
In deiner Antwort hier
Beitrag "Re: Atmel Studio 6: Genauigkeit des Simulators?"
hätte ein simples "Beachte: next clock cycle" oder so den Nebel 
gelichtet.

> Denn mal ehrlich, wenn man auf der Suche nach einer Erklärung
> für die Beobachtung im Ursprungs-Post ist...
die ja nun ist (für später vorbeikommende Lösungssucher ;-) ):
- Compare Interrupt löst erst 1 Timer-Step nach dem Erreichen des 
Compare-Wertes aus
- 1 Timer-Step besteht aus der im Prescaler eingestellten Anzahl 
CPU-Takte

Und da es mir ja v.a. darum ging festzustellen, wie gross die Latenzzeit 
bis zum Ausführen der IRQ-Routine ist:
- kommt darauf an welcher IRQ
- Latenz liegt bei den Timer0-IRQs im Bereich 17..23 CPU-Clocks

> Gut, jeder kann mal Tomaten auf den Augen haben, das ist
> dann aber kein Grund, persönlich zu werden.
Richtig, entschuldige nochmals.
Und vielen Dank für die Antworten, auch allen anderen!
Gruss.
->Problem gelöst, Thread kann gekapert 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.