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!
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.
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?
@ Stefan Ernst Was machst du es so spannend? Kleiner Tipp?
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.
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.
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.
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!
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.
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".
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.