...
TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
...die ISR wird jedoch nicht angesprungen
Moin.
Wieder mal ein neues Problem. An nem ATMega2560-Modul (von Robotikhardware) ist ja an TOSC1/TOSC2 ein 32768Hz-Uhrenquarz. Hab jetzt versucht, den für die Uhr zu verwenden, was aber nicht klappt.
Hier die relevanten Codeteile:
Das Programm selbst bleibt bei der "while"-Anweisung stehen; ohne das while läuft zwar der Rest vom Programm; die ISR wird jedoch nicht angesprungen (was man sonst an einer blinkenden LED sehen würde)Code:void Clock_Start(ui8_t timer) { TIMSK2 |= (1<<TOIE2); } void Clock_Init(void) { TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2 ASSR |= (1 << AS2); // Select 32768 Hz Clock TCCR2A = 0; // Standard timer (No Counting, No PWM) TCCR2B = 0 | (1<<CS22) | (1<<CS20); // Prescaler = 128 TCNT2 = TCNT2_REL; // Reload while(ASSR & ((1<<TCR2BUB)|(1<<TCR2AUB)|(1<<TCN2UB))); // wait until clock has switched TIFR2 |= ((1<<OCF2A)|(1<<OCF2B)|(1<<TOV2)); // Clear Interrupt flags ONBOARD_LED_DDR |= (1 << ONBOARD_LED_PIN); } ISR (SIG_OVERFLOW2) { TCNT2 = TCNT2_REL; ONBOARD_LED_PORT ^= (1 << ONBOARD_LED_PIN); }
Sieht hier jemand nen Fehler?
mfG
#ifndef MfG
#define MfG
...
TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
...die ISR wird jedoch nicht angesprungen
MfG
Stefan
Naja, eigenltlich wärs ja logisch, dass in der Main nacheinander Clock_Init() und Clock_Start() aufgerufen werden.
In der Clock_Start() wird TOIE2 wieder freigegeben.
#ifndef MfG
#define MfG
Tja, logisch wäre es schon. Das bedeutet aber nicht, dass es auch tatsächlich so ist. Ich kann ja nicht Hellsehen. Und so weiß ich z.B. auch nicht, ob du die Interrupts global freigeschaltet hast.Naja, eigenltlich wärs ja logisch, dass in der Main nacheinander Clock_Init() und Clock_Start() aufgerufen werden.
In der Clock_Start() wird TOIE2 wieder freigegeben.
MfG
Stefan
Es folgt zuerst _Init, dann_Start; Interrupts sind global freigeschaltet.
Aber wie schon gesagt, die relevanten Teile sind oben angegeben, d.h. es muss irgendwo in der dortigen Bitschubserei der Register haken, dass dort eben ein nötiges Bit fehlt oder ein unnötiges Bit gesetzt ist.
Wird statt dem Quarz an TOSC1/2 der Systemtakt verwendet (also "normaler" Timer) dann gehts ja.
#ifndef MfG
#define MfG
Nein, nicht wirklich. Wie ist z.B. TCNT2_REL definiert?die relevanten Teile sind oben angegeben
MfG
Stefan
Die Definition dieser "Variable" ist in dem Fall 0; da der Interrupt aber garnicht erst auftritt, ist der Wert ja egal. Würde er auftreten, wäre das mit 0 halt die max. Zählweite mit den übrigen Einstellungen.
#ifndef MfG
#define MfG
Und auch keinerlei Warnungen vom Compiler? Z.B.:
In function 'ISR':
warning: type of '__vector_15' defaults to 'int'
MfG
Stefan
Naja, "leider" nicht; dann hätt ich ja zumindest nen Anhaltspunkt. Aber der Code lässt sich fehlerfrei kompilieren...
#ifndef MfG
#define MfG
Bleibt eigentlich nur ein Hardware-Problem.
Schwingt der Quarz überhaupt?
MfG
Stefan
Lesezeichen