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
wie bekommt man eigentlich so einen weißen rand an einen screenshot? das ist irgendwie hübsch und wirkt edel.
> 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.
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??
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
Danke Spess. Ich weiß jetzt, dass mein Timer startet ( da sich ja die Werte immer ändern). Aber ist trotzdem alles seltsam :)
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?
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
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
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
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.
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 :)
@spess Entschuldigung, du hast ja beschrieben, wie man auf eine Sekunde kommt im CTC-Mode :)
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
Hi
> OCR2A = 31249;
Der Timer2 des ATMega1281 ist ein 8-Bit-Timer.
MfG Spess
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?
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.
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.
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...
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??
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
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.
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
@ Karl Heinz Buchegger Entschuldigung, habe das falsche Bit gelöscht :) Und das war acuh der Fehler :) Danke dir!!!
Aber mein TCNT2-Register will immer noch nicht hochzählen. Was ich wirklich nicht verstehe, warum er das nicht macht.
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
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.
@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!!!!
Merve Bulut schrieb: > Ist gar nicht so kompliziert wie ich dachte :) Es ist wirklich sehr simpel. Und entschuldige, dass ich dich getreten habe. :-)
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 :))
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 ;-)
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??
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.
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!
> 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#
Ich will mit dem Systemtakt arbeiten. Total komisch der geht immer noch nicht in meine ISR rein. Zumindest werden die Variablen nicht erhöht.
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 :)
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)
> (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.
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?
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!
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
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 :(
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?
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.
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.
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
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.
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.
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.