Forum: Mikrocontroller und Digitale Elektronik Timer 2 starten AVR4


von Merve B. (student1990)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein kleines Problem. Ich habe ein ATmega1281 und benutze den 
JTAGICE mII.
Ich habe den Timer 2 konfiguriert (ich hoffe auch richtig). Wenn ich 
anfange zu debuggen, kommen auch keine Fehler.
In dem Fenster I/O View sehe ich die ganzen Bits vom Timer. Ich habe 
zwar "manuell" Bits gesetzt/gelöscht, aber in diesem Register muss ich 
trotzdem diese "Häckchen" anklicken, damit die Bits sich ändern.
Ich habe auch den Verdacht, dass mein Timer nicht startet.
Zur Info: Dieses Programm enthält keine main(). Wurde mit APIs 
programmiert.
Im Anhang ist ein Screenshot wie das ganze aussieht.

Ich wäre über jede Hilfe dankbar.

Gruß

Merve

von c. m. (Gast)


Lesenswert?

wie bekommt man eigentlich so einen weißen rand an einen screenshot? das 
ist irgendwie hübsch und wirkt edel.

von Merve B. (student1990)


Lesenswert?

Kann mir keiner einen Tipp geben?????

von Karl H. (kbuchegg)


Lesenswert?

> Zur Info: Dieses Programm enthält keine main()

Trotzdem müssen irgendwo die Funktionen mal wo aufgerufen werden.
Dort knüdelst du deinen Breakpoint hin und siehst nach, ob der Aufruf 
auch tatsächlich erfolgt.

Nur deswegen, weil du in irgendeiner Funktion irgendwelche Registerwerte 
beschriebst, bedeutet das noch lange nicht, dass dieser Code dann auch 
irgendwann mal (magisch) ausgeführt wird. Wird die Funktion nie 
aufgerufen - gibst auch keine Besetzung der Registerwerte.
C ist ja nicht Excel, das sich selbst zusammensucht was es zu tun 
gedenkt.

von Merve B. (student1990)


Lesenswert?

Ja ich ruf meine Funktion auch auf, aber das was ich in die Register 
geschrieben habe, übernimmt der irgendwie nicht.
TCNT2 ist doch für das "hochzählen" zuständig oder?
Wenn TCNT2 bei 255 angelangt ist, fängt der doch wieder von vorne an, 
oder
hab ich da was falsch verstanden???
Weil wenn ich das Programm laufen lasse, seh ich bei TCNT2, dass er mal 
den Wert 0xcc dann 0x71 und dann aufeinmal 0x05 hat.
Das ist doch nicht normal oder??

von spess53 (Gast)


Lesenswert?

Hi

>In dem Fenster I/O View sehe ich die ganzen Bits vom Timer. Ich habe
>zwar "manuell" Bits gesetzt/gelöscht, aber in diesem Register muss ich
>trotzdem diese "Häckchen" anklicken, damit die Bits sich ändern.

Dein Text ist etwas unverständlich.

Die IO-Anzeige wird nur aktualisiert wenn du das Debugging anhälst. Und 
die Bits kannst du auch nur in diesem Zustand ändern.

Ob dein Timer läuft siehst du am einfachsten am Inhalt von TCNT2. Dazu 
kannst du auch mal den Vorteiler kleiner machen.

MfG Spess

von Merve B. (student1990)


Lesenswert?

Danke Spess. Ich weiß jetzt, dass mein Timer startet ( da sich ja die 
Werte immer ändern).
Aber ist trotzdem alles seltsam :)

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Danke Spess. Ich weiß jetzt, dass mein Timer startet ( da sich ja die
> Werte immer ändern).
> Aber ist trotzdem alles seltsam :)

Was ist da drann seltsam?
Wenn du dein Programm mit F5 laufen lässt, wird der I/O View nicht 
laufend nachgezogen. Das würde viel zu viele Resourcen binden und dein 
Simulator würde nur noch diesen Update machen und sonst nichts mehr (zb 
das Programm in vernünftiger Zeit durchsimulieren).

Wenn du dir in ConfigTimer2 am Anfang einen Breakpoint setzt und dann 
mit F10 (Single Step) durch die Funktion durchgehst, ändern sich die 
Häkchen oder ändern sie sich nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Aber ist trotzdem alles seltsam :)

Was ist seltsam? Ein 8-Bit-Timer hat bei 32kHz und Prescaler 1024 eine 
Overflowzeit von 8s. In dieser Zeit werden die 256 Werte durchlaufen.

MfG Spess

von Merve B. (student1990)


Lesenswert?

Doch sie ändern sich.
Es war für mich verwirrend, da es im Register nicht in "1-Schritten" 
hochzählt.
@spess53
habe ich wirklich 8s als Overflowzeit?
Ich wollte eigentlich 1s haben.
Gibt es da eine bestimmte Formel. Wie kann ich das bestimmen, dass es 
jede Sekunde einen Interrupt erzeugt.
Es tut mir wirklich Leid. Wahrscheinlich sind das dumme Fragen, aber ich 
bin wirklich eine blutige Anfängerin :(

Danke

von Spess53 (Gast)


Lesenswert?

Hi

>Gibt es da eine bestimmte Formel. Wie kann ich das bestimmen, dass es
>jede Sekunde einen Interrupt erzeugt.

Dann nutze den CTC-Mode des Timers. Mit 0x1F im OCR2A-Register bekommst 
du dann jede Sekunde einen Interrupt. Dann allerdings nicht den 
Overflow-Interrupt sondern den TIMER2 COMPA-Interrupt.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Doch sie ändern sich.
> Es war für mich verwirrend, da es im Register nicht in "1-Schritten"
> hochzählt.
> @spess53
> habe ich wirklich 8s als Overflowzeit?
> Ich wollte eigentlich 1s haben.
> Gibt es da eine bestimmte Formel.

Auch das gibt es.
Ich finde es aber immer besser, wenn man versteht, was da eigentlich vor 
sich geht. Denn dann braucht man sich keine Formeln merken sondern 
leitet sich das von Fall zu Fall ganz einfach schnell her.

FAQ: Timer

Und so ein Timer ist in Wirklichkeit ja eine ganz simple Sache.

Wenn du alle 5 Sekunden mit dem Fuss aufstampfst und 10 mal aufstampfst, 
wie lange brauchst du dann für 10 mal aufstampfen?

Wie oft musst du aufstampfen, damit das ganze genau 1 MInute dauert.


Wenn du diese beiden "Rechenaufgaben" bewältigst, dann hast du das 
Grundprinzip des Einsatzes von Timern verstanden. Alles andere sind dann 
nur noch Details.

von Merve B. (student1990)


Lesenswert?

Hallo,

ich habe mir die Erklärung vom Timer durchgelesen und fand es ziemlich 
hilfreich. Danke dafür nochmal.
Ich hab da aber eine Frage.
Wenn ich das richtig verstanden habe, dann wird doch die Taktfrequenz 
durch den Prescaler geteilt und Hz ist ja 1/s also wenn man das dann 
umrechnet in Sekunden, kann man ja herausfinden, welchen Vorteiler man 
benutzen muss.
Nun ich habe auch einen 8-Bit mc und 1MHz Taktfrequenz. Wenn ich die 
32kHz "herausnehme" und den Prescaler bei 1024 belasse, müsste ich doch 
1s bekommen oder?

Bei CTC-Mode muss ich keinen Vorteiler einstellen oder wie??
Aber ich würde schon den Prinzip richtig verstehen, damit ich es auch 
später anwenden kann, wenn ich wieder mit den Timer arbeiten muss. Ich 
werde wohl oder übel nicht drumrum kommen :)

Danke wirklich für die hilfreichen Tipps schönen Tag :)

von Merve B. (student1990)


Lesenswert?

@spess
 Entschuldigung, du hast ja beschrieben, wie man auf eine Sekunde kommt 
im CTC-Mode :)

von Merve B. (student1990)


Lesenswert?

Hallo,

ich habe nun versucht den Timer 2 im CTC-Modus zu programmieren.
static void ConfigTimer2(void)
{
  ASSR |= (0 << EXCLK) | (1 << AS2);
  TIFR2 |= (1 << TOV2) | (1 << OCF2A);
  TIMSK2 |= (1 << OCIE2A) | (1 << TOIE2);
  TCCR2B |= (1 << CS20);
  TCCR2A |= (0 << COM2A1) | (0 << COM2A0) | (1 << WGM21); //CTC Mode
  OCR2A = 31249;
//  TCNT2 = 0;

}

Wenn ich nun debugge, funktioniert mein Interrupt beim Drücken des 
Tasters nicht (dieser Taster ist unabhängig vom Timer 2).
Davor wurde der Interrupt noch ausgelöst, aber der TCNT2 hat nicht 
hochgezählt. Dann habe ich gemerkt, dass ich im TCCR2B-Register den 
CS20-Bit nicht gesetzt habe (da ja alles sonst null wäre und damit mein 
Timer ja stoppt).
Aber wenn ich dieses Bit setze funktioniert mein Taster nicht mehr und 
ich werde langsam wahnsinnig.
Könnte mir bitte jemand helfen???

Danke

von spess53 (Gast)


Lesenswert?

Hi

>  OCR2A = 31249;

Der Timer2 des ATMega1281 ist ein 8-Bit-Timer.

MfG Spess

von Merve B. (student1990)


Lesenswert?

Hi Spess,

danke für die schnelle Antwort. Ich habe im Internet versucht mich über 
den CTC-Modus schlau zu machen, hab da aber anscheinend etwas falsch 
verstanden...
Ich muss ja einen Prescaler bestimmen.
Wenn ich jetzt 8MHz durch 32 teile bekomme ich ja als "neue" 
Taktfrequenz 250kHz.
Kann ich dann 250 in den OCR2A-Register schreiben?
Wäre das dann eine Sekunde?

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:

>   TIMSK2 |= (1 << OCIE2A) | (1 << TOIE2);


Du gibst hier 2 INterrupts frei. Hast du auch die zugehörigen ISR 
Routinen?
Wenn du einen Interrupt frei gibst, dann MUSST du auch die INterrupt 
Routinen dazu haben. Wenn nicht -> Prozessor Reset wenn der Interrupt 
auslöst.

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Hi Spess,
>
> danke für die schnelle Antwort. Ich habe im Internet versucht mich über
> den CTC-Modus schlau zu machen, hab da aber anscheinend etwas falsch
> verstanden...
> Ich muss ja einen Prescaler bestimmen.
> Wenn ich jetzt 8MHz durch 32 teile bekomme ich ja als "neue"
> Taktfrequenz 250kHz.

d.h. der Timer zählt in 1 Sekunde bis 250-tausend. D.h. wenn er könnte - 
was er als 8 Bit Timer natürlich nicht kann.
Aber er macht in 1 Sekunde 250-tausend Zählvorgänge.

> Kann ich dann 250 in den OCR2A-Register schreiben?
> Wäre das dann eine Sekunde?

Nö. Dann bist du bei 1 Tausendstel Sekunde.

Wenn der Timer in 1 Sekunde 250-tausend Zählvorgänge macht, dann braucht 
er logischerweise 1 tausendstel Sekunde um bis 250 zu zählen.

von Merve B. (student1990)


Lesenswert?

Oh man ich raffs einfach nicht :(

Also noch mal

Der 8-Bit Timer kann nur bis 256 zählen, was logisch ist.
D.h. ich müsste logischerweiße so lange "runterteilen" bis
der auf den Wert von 256 kommt oder wie?
Hab ich es schon wieder falsch verstanden??

Könntest du mir vielleicht ein Rechenbeispiel geben?
Vielleicht kapiere ich es dann besser...

von Merve B. (student1990)


Lesenswert?

Wäre das hier richtig?

8000000 / 1024 = 7812,5

7812,5 / 256 = 30,51....

also den Register dann auf 30 setzen.

Wenn ich den Vorteiler 1024 benutze würde mein Timer 7812 Overflows 
insgesammt pro Sekunde haben.
Da aber mein Timer nur bis 256 zählen kann, teile ich ihn nur 256
und bekomme 30.
Wenn ich nun den OCR2A auf 30 setze, dann würde doch alle 30 Overflows 
ein Intterupt auslösen oder??

von spess53 (Gast)


Lesenswert?

Hi

>also den Register dann auf 30 setzen.

Der größte sinnvolle Prescaler um genau eine Sekunde zu erreichen ist 
256. Mit einem OCR-Wert von 0xF9 ergibt das einen Abstand von 8ms 
zwischen 2 Interrupts. Also nur noch 125 Interrupts abzählen und die 
Sekunde ist rum.

MfG Spess

von Merve B. (student1990)


Lesenswert?

Ach ja ich habe eine ISR

ISR(TIMER2_COMP_vect)
{
  sekunde++;
}

hab jetzt mal den TOV2 gelöscht, aber irgendwie will der nicht.
Also mein Taster funktioniert immer noch nicht.

von Merve B. (student1990)


Lesenswert?

spess53 schrieb:
> Also nur noch 125 Interrupts abzählen und die
>
> Sekunde ist rum.

Wie kann ich einen Interrupt abzählen ich bin gerade etwas verwirrt.
Das Abzählen läuft doch schon über OCR2A dachte ich????

Danke

von Merve B. (student1990)


Lesenswert?

@ Karl Heinz Buchegger

Entschuldigung, habe das falsche Bit gelöscht :)

Und das war acuh der Fehler :)
Danke dir!!!

von Merve B. (student1990)


Lesenswert?

Aber mein TCNT2-Register will immer noch nicht hochzählen.
Was ich wirklich nicht verstehe, warum er das nicht macht.

von spess53 (Gast)


Lesenswert?

Hi

>Wie kann ich einen Interrupt abzählen ich bin gerade etwas verwirrt.
>Das Abzählen läuft doch schon über OCR2A dachte ich????

Nein. Das OCR-Register bestimmt die Anzahl der Timertakte bis der Timer 
wieder von Null anfängt und damit den Abstand der OC-Interrupts. Wenn du 
jetzt in jedem OC-Interrupt eine Variable hochzählst, so wie du es schon 
in

>ISR(TIMER2_COMP_vect)
>{
>  sekunde++;
>}

schon gemacht hast, dann ist bei sekunde=125 die Sekunde wirklich 
abgelaufen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:

>
> Könntest du mir vielleicht ein Rechenbeispiel geben?
> Vielleicht kapiere ich es dann besser...

Ist doch ganz einfach.
Du musst erst mal unterscheiden zwischen:
       wieviele Zählvorgänge macht der Timer in der Sekunde?
  und: was bedeutet das jetzt konkret für den Timer mit seiner
       begrenzten Bitzahl


du hast 8 Mhz und einen Vorteiler von 32.
D.h. der Zähler macht 250-tausend Zählvorgänge inder Sekunde.
Damit ist nicht gesagt, wieviele Overflows er macht oder wie oft er bei 
127 vorbeikommt oder ... sondern einfach nur: in 1 Sekunde zählt der 
Timer 250-tausend mal um 1 weiter.

Wenn ich dir jede Sekunde 1 Tritt gebe, dann gebe ich dir in 1 Stunde 
3600 Tritte. Unabhängig davon, ob du mit 10 Fingern überhaupt soweit 
zählen kannst oder nicht.


OK. Jetzt wissen wir, wie oft in der Sekunde zählt denn der Timer?

Jetzt fragen wir uns: Was sind denn jetzt die technologischen 
Beschränkungen. Das ein 8-Bit Timer nicht in einem Aufwasch bis 
250-tausend zählen kann sollte klar sein. Du kannst ja auch nicht mit 
deinen 10 Fingern bis 3600 zählen.
Aber, wenn du immer schön brav bei jedem Tritt einen Finger mehr 
ausstreckst, und jedesmal wenn deine Hand voll ist, alle Finger wieder 
einziehst, wie oft in der Stunde ziehst du dann deine Finger wieder ein?

Na, wenn du 3600 mal jeweils 1 Finger ausstreckst und bei 10 Finger 
ziehst du alle wieder ein, dann hast du klarerweise 360 mal die Finger 
wieder eingezogen. Denn wenn du 360 mal die 10 Finger durchgezählt hast, 
dann hast du ja bis zu den 3600 gezählt. Du hast also in dieser 1 Stunde 
360 mal wider von vorne angefangen. Wie groß ist daher die Zeitspanne 
zwischen dem Einziehen der Finger: Na offensichtlich 3600 (weil 1 
Stunde) geteilt durch 360 (so oft hast du eingezogen). Und das ergibt 
10. Also ziehst du alle 10 Sekunden die Finger ein.

Zurück zum Timer.
Das unterscheidet sich in nichts von den Tritten!

Der Timer macht in 1 Sekunde 250-tausend Zählvorgänge. Wenn er dabei 
jedesmal bis 250 zählt (er hat 250 Finger), wie oft in der Sekunde muss 
er dann wieder bei 0 anfangen (die Finger einziehen). Na, offenbar 
250-tausend durch 250. Das macht 1000. D.h. der Timer fängt in jeder 
Sekunde 1000 mal wieder von vorne an zu zählen. Im Umkehrschluss: von 
einem mal bei 0 anfangen bis zum nächsten mal bei 0 anfangen vergehen 
daher 1/1000 Sekunden.


> Wie kann ich einen Interrupt abzählen ich bin gerade etwas verwirrt.
> Das Abzählen läuft doch schon über OCR2A dachte ich????

Um bei diesem Beispiel zu bleiben.
Du hast dir jetzt ausgerechnet, dass die ISR 1000 mal in der Sekunde 
ausgeführt wird. Denn jedesmal, wenn der Timer wieder bei 0 anfängt, 
ruft er deine ISR auf.
Also zählst du in der ISR in einer Variablen mit. Wird die ISR 1000 mal 
in der Sekunde aufgerufen und hat die Variable 1000 erreicht, dann ist 1 
Sekunde vergangen.
1
uint16_t cnt;
2
3
ISR( ... )
4
{
5
  cnt++;
6
7
  if( cnt == 1000 )
8
  {
9
    cnt = 0;
10
11
    ..... der Code hier wird im Abstand von 1 Sekunde ausgeführt
12
  }
13
}

Um beim obigen Beispiel zu bleiben. Nach jeweils 10 Sekunden getreten 
werden, fährst du die Finger wieder ein. Soweit klar.
Jetzt steht dein Kumpel Klaus neben dir und zählt seinerseits mit, wie 
oft du die Finger eingefahren hast. UNd jedesmal wenn er bei 6 angelangt 
ist, ruft er 'Hurra'. In welchem zeitlichen Abstand ruft er?
Na, wenn du alle 10 Sekunden deine Aktion machst und Klaus 6 deiner 
Aktionen abwartet, dann vergehen 60 Sekunden, also 1 Minute, zwischen 
seinen Rufen.


Lös dich von der Vorstellung, dass der Timer alles irgendwie magisch 
alleine macht. Das tut er in dem Fall nicht, weil es sich mit den 
Zahlenwerten nicht ausgeht.

von Merve B. (student1990)


Lesenswert?

@spess

Alles klar jetzt habe ich es verstanden vielen Dank.
D.h. ich kann in meine ISR z.b. x++; if x == 125) {sekunde++;}
oder?

Und Karl Heinz Buchegger danke wirklich ich habe dank deiner 
ausführlichen und verständlichen Erklärung den Timer kapiert.
Ist gar nicht so kompliziert wie ich dachte :)
Wirklich DANKE!!!!

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:

> Ist gar nicht so kompliziert wie ich dachte :)

Es ist wirklich sehr simpel.

Und entschuldige, dass ich dich getreten habe. :-)

von Merve B. (student1990)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und entschuldige, dass ich dich getreten habe. :-)

Wurde bei mir auch mal langsam Zeit. Sonst hätte ich es ja nach 10 
jahren nicht kapiert :D
Ich glaube diese Erklärung wird JEDEM helfen, der das ließt :))

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Merve Bulut schrieb:
> @spess
>
> Alles klar jetzt habe ich es verstanden vielen Dank.
> D.h. ich kann in meine ISR z.b. x++; if x == 125) {sekunde++;}
> oder?

Fast. Da fehlt ein

   x = 0;

innerhalb der geschweiften Klammern ;-)

von Merve B. (student1990)


Lesenswert?

Oh habe ich vergessen :)
Danke.
Hmm wenn er trotz allem meine sekunde bzw mein x nicht erhöht, heißt das 
doch, dass meine ISR gar nicht aufgerufen wird oder??

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Oh habe ich vergessen :)
> Danke.
> Hmm wenn er trotz allem meine sekunde bzw mein x nicht erhöht, heißt das
> doch, dass meine ISR gar nicht aufgerufen wird oder??


Da gibts jetzt wieder andere Ursachen.

Zeig mal dein komplettes Programm.

von Merve B. (student1990)


Lesenswert?

Das komplette Programm darf ich leider nicht schicken.
(Es sind einige Bachelor und Masterarbeiten drin und ein paar 
Studienarbeiten deswegen :( )
Ich werde dir Ausschnitte schicken, in der der Timer 2 vorkommt.

static void ConfigTimer2(void)
{
  ASSR |= (0 << EXCLK) | (1 << AS2);
  TIFR2 |= (1 << TOV2) ;
  TIMSK2 |= (1 << TOIE2);
  TCCR2B |= (1 << CS22) | (1 << CS21) | (0 << CS20);
  TCCR2A |= (0 << COM2A1) | (0 << COM2A0) | (1 << WGM21); //CTC Mode
  OCR2A = 0xf9;
//  TCNT2 = 0;

}

ISR(TIMER2_COMP_vect)
{
  test_timer++;
  if(test_timer == 125)
    {
      test_timer = 0;
      sekunde++;
    }
}

case APP_NETWORK_JOINED_STATE:
  if(initFlag == false)
  {
    ConfigTimer2();
    uhrzeit();
      ConfigPwm();        // init PWM
    SetDutyCycle();      // set PWM = 255
    InitFiveSecondTimer();  // init timer for 5sec
    InitIRQ();        // init IRQ
    InitLED();        // LEDs
    initFlag = true;
   }

Der Aufruf geschieht ganz oben ich habe es nur ganz unten eingefügt :)
Tut mir Leid!

von Karl H. (kbuchegg)


Lesenswert?

>   ASSR |= (0 << EXCLK) | (1 << AS2);

Was hast du damit vor?
Willst du jetzt den Timer 2 von einem externen QUarz versorgen lassen 
oder benutzt du den Systemtakt.

Wenn Systemtakt -> dann lass das ASSR Register in Ruhe.
Du bruachst es nicht.

Mit einer Initialisierung
1
static void ConfigTimer2(void)
2
{
3
  TIMSK2 |= (1 << TOIE2);
4
  TCCR2A |= (1 << WGM21); //CTC Mode
5
  TCCR2B |= (1 << CS22) | (1 << CS21) | (0 << CS20);
6
7
  OCR2A = 249;
8
}

bist du dabei und dann läuft auch der Timer mit einem Vorteiler von 256 
vom Systemtakt weg.


>  ISR(TIMER2_COMP_vect)

>  TIMSK2 |= (1 << TOIE2);

Wenn du eine ISR für den Compare Interrupt hast, dann solltest du auch 
den Compare Interrupt freigeben und nicht den Overflow Interrupt

  TOIE2     #T#imer #O#verflow #I#nterrupt #E#nable vom Timer #2#

von Merve B. (student1990)


Lesenswert?

Ich will mit dem Systemtakt arbeiten.
Total komisch der geht immer noch nicht in meine ISR rein.
Zumindest werden die Variablen nicht erhöht.

von Merve B. (student1990)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn du eine ISR für den Compare Interrupt hast, dann solltest du auch
>
> den Compare Interrupt freigeben und nicht den Overflow Interrupt

Ach so, ich probiers mal gleich danke :)

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

>>  ISR(TIMER2_COMP_vect)
>
>>  TIMSK2 |= (1 << TOIE2);
>
> Wenn du eine ISR für den Compare Interrupt hast, dann solltest du auch
> den Compare Interrupt freigeben und nicht den Overflow Interrupt
>
>   TOIE2     #T#imer #O#verflow #I#nterrupt #E#nable vom Timer #2#

Ausserden hat dein Timer 2 Stück Compare Register. Jeder kann einen
INterrupt auslösen. Daher wird der Name des Compare Registers, welches
den Interrupt ausgelöst hat, auch im ISR Namen vorkommen. ALso wird
TIMER2_COMP_vect wohl nicht der richtige Name sein. Da muss im Namen ein 
'A' bzw. 'B' drinn vorkommen.

Wieder mal COmpilerwarnungen ignoriert?
("TIMER2_COMP_vect seems to be an invalid signal handler name" oder so 
ähnlich)

von Karl H. (kbuchegg)


Lesenswert?

> (Es sind einige Bachelor und Masterarbeiten drin und ein paar
> Studienarbeiten deswegen

Und?

Das ist noch lange kein Grund, dass du nicht ein 10 Zeiler Testprogramm 
machen kannst, in dem du den Timer in Aktion zeigst.
Das Beispiel in der FAQ kann das ja auch. Und dafür habe ich keinen 
Doktortitel gekriegt.

von Merve B. (student1990)


Lesenswert?

Karl Heinz Buchegger schrieb im Beitrag #2906275:
> ALso wird
>
> TIMER2_COMP_vect wohl nicht der richtige Name sein.

Hmm wie kann ich rausfinden, welcher der richtige Name ist?

von Merve B. (student1990)


Lesenswert?

Ach so hast du das gemeint. Ich dachte, ich soll das ganze Programm 
schicken. Mein Fehler. Ich habe dich falsch verstanden.
Ich hatte schon mal ein Problem und als ich dann Hilfe wollte im Forum, 
durfte ich nur kleine Programmausschnitte schicken mehr nicht. Ich hab 
ein bisschen Ärger bekommen, deswegen habe ich die Finger davon 
gelassen.
Wenn es nur mein Programm wäre, wäre es für mich kein Problem gewesen.
Naja so viel dazu... Tut mir Leid!

von Karl H. (kbuchegg)


Lesenswert?

Generell heissen die immer so, wie sie auch im Datenblatt des Prozessors 
heissen.
In der Übersicht der INterrupts zb eines Mega88 (weil ich das gerade 
offen habe), findet sich zb
1
  8  0x007   TIMER2 COMPA    Timer/Counter2 compare match A
2
  9  0x008   TIMER2 COMPB    Timer/Counter2 compare match B

Also heisst der Vector
TIMER2_COMPA_vect   bzw.
TIMER2_COMPB_vect

von Merve B. (student1990)


Lesenswert?

Danke!
Es müsste der TIMER2_COMPA_vect sein.
Dadurch kommt ein Fehler


../../BitCloud/Components/../lib\libBcAll.a(halSleepTimerClock.o): In 
function `__vector_13':
halSleepTimerClock.c:(.text.__vector_13+0x0): multiple definition of 
`__vector_13'
./Receiver.o:C:\Users\Laborbenutzer\Desktop\merve\ZDK_Complete\Applicati 
ons\Receiver  - Kopie/Receiver.c:1280: first defined here
collect2: ld returned 1 exit status
make: *** [link] Fehler 1
Build failed with 1 errors and 9 warnings...

p.s. die Warnings haben nichts mit dem Timer zu tun. Das sind Variablen 
die deklariert, aber nicht benutzt werden (auskommentiert).

Aber wenn ich TIMER2_COMPB_vect schreibe kommt kein Fehler, aber mein 
Interrrupt wird wieder nicht aufgerufen.

Ich glaube, ich fange an zu nerven oder? Tut mir Leid :(

von Merve B. (student1990)


Lesenswert?

Kann es sein, dass meine Bibliothek diesen Vektor nicht beinhaltet?

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Kann es sein, dass meine Bibliothek diesen Vektor nicht beinhaltet?

Nein. Steht doch dort!

Was heißt denn 'multiple definition' auf Deutsch?

multiple    ... mehrfach
definition  ... Vereinbarung

also. was wird wohl multiple definition bedeuten?

von Stefan E. (sternst)


Lesenswert?

Merve Bulut schrieb:
> Kann es sein, dass meine Bibliothek diesen Vektor nicht beinhaltet?

Nein, offenbar wird der Timer und der entsprechende Interrupt bereits 
irgendwo im restlichen Code verwendet.

von Merve B. (student1990)


Lesenswert?

Seltsam.
Mir wurde gesagt, dass in der gesamten Software keine Timer benutzt 
worden sind. Auch nicht der Timer 2.
Ich habe es eigentlich auch nur einmal in diesem Programm.
Naja danke für den Tipp. Ich werde mal mir das genauer anschauen.

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:
> Seltsam.
> Mir wurde gesagt, dass in der gesamten Software keine Timer benutzt
> worden sind. Auch nicht der Timer 2.


Regel römisch Eins:
Der Compiler/Linker hat immer recht.

Hier
../../BitCloud/Components/../lib\libBcAll.a(halSleepTimerClock.o): In
function `__vector_13':
halSleepTimerClock.c:(.text.__vector_13+0x0): multiple definition of
`__vector_13'

versteckt sich die andere ISR gleichen Namens:
halSleepTimerClock.c

und das Ganze befindet sich in der Library libBcAll

von Merve B. (student1990)


Lesenswert?

Ich wäre gar nicht darauf gekommen. Da sieht man mal wie unerfahren ich 
bin. Aber ich lerne und das ist gut :)
Danke!!!
Aber dieser Vektor hängt nicht mit dem OCR2A Register zusammen oder? 
Weil wenn das der Fall ist, kann ich den CTC-Modus nicht benutzen, da 
genau dieses Register benötigt wird.

von Karl H. (kbuchegg)


Lesenswert?

Merve Bulut schrieb:

> Aber dieser Vektor hängt nicht mit dem OCR2A Register zusammen oder?
> Weil wenn das der Fall ist, kann ich den CTC-Modus nicht benutzen, da
> genau dieses Register benötigt wird.

Die hängt sogar ziemlich sicher mit OCR2A zusammen. Denn man würde keine 
ISR schreiben, die auf einen Compare-Match des OCR2A Registers reagiert, 
wenn man dann das OCR2A Register nicht verwenden würde.

Genaueres kann man aber nur sagen, wenn man sich den Code in diesem 
Modul mal ansieht und analysiert, was dort überhaupt gemacht wird und 
wie und wozu der Timer eingesetzt wird.

Aber wenn ich raten müsste, dann würde ich mich mal am Dateinamen 
orientieren. Menschen neigen ja dazu, die Dinge so zu benennen, dass aus 
dem Namen schon ein bischen was ablesbar ist. Sonst könnte man ja das 
File auch xyz.x nennen :-)

halSleepTimerClock

hal      das könnte das übliche Kürzel für
         "Hardware Abstraction Layer"
         sein.
         Also eine Softwareschicht, die sich zum Ziel setzt eine
         bestimmte Hardwarefunktionalität in einer von den
         Details der Hardware unabhängigen Form zur Verfügung
         zu stellen

Sleep    da könnte es darum gehen, den µC zwecks Stromsparen, zwischen-
         durch mal 'schlafen' zu legen ...

Timer    ... und zwar mithilfe eines Timers

Clock    ... die wie eine Uhr organisiert ist.


Alles in allem ein Modul, welches einen Timer benutzt um den µC 
regelmässig oder zu bestimmten Zeitpunkten 'schlafen' zu schicken.

Das wäre mein 'educated guess' (wie die Amerikaner sagen würden), was 
sich im File halSleepTimerClock.c befindet. Und da dort besagte ISR 
offenbar drinnen ist, wird dieses Modul dazu höchst wahrscheinlich den 
Timer 2 dazu hernehmen.

von Merve B. (student1990)


Lesenswert?

Ja genau. Der ist für den "Schlafmodus" zuständig. Doof, dass sie mir 
gesagt haben, dass dafür "Software-Timer" benutzt worden ist. Naja, ich 
werde versuchen den TIMER2_COMPB_vect zu benutzen, indem ich dieses 
Compare Match Output B verwende. Keine Ahnung, ob das klappen wird ;)

Danke!

von spess53 (Gast)


Lesenswert?

Hi

>Keine Ahnung, ob das klappen wird ;)

Klappt nicht. Du willst CTC verwenden. Das geht nur mit OCR2A. Wenn 
Timer0 noch frei ist, dann nimm den.

MfG Spess

von Merve B. (student1990)


Lesenswert?

Das ist nicht gut, denn ich brauch den Timer 2, da der als einziger auch 
im Schlafmodus läuft...
Dann muss ich wohl ohne CTC klar kommen...

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.