PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega2560(Modul), 32 kHz-Quarz an TOSC: will nicht.



Jaecko
28.07.2008, 12:54
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:



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);
}



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)

Sieht hier jemand nen Fehler?

mfG

sternst
28.07.2008, 13:17
...
TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
...

die ISR wird jedoch nicht angesprungen

Jaecko
28.07.2008, 13:23
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.

sternst
28.07.2008, 13:31
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.


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.

Jaecko
28.07.2008, 13:59
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.

sternst
28.07.2008, 14:22
die relevanten Teile sind oben angegeben
Nein, nicht wirklich. Wie ist z.B. TCNT2_REL definiert?

Jaecko
28.07.2008, 14:46
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.

sternst
28.07.2008, 15:03
Und auch keinerlei Warnungen vom Compiler? Z.B.:

In function 'ISR':
warning: type of '__vector_15' defaults to 'int'

Jaecko
28.07.2008, 15:32
Naja, "leider" nicht; dann hätt ich ja zumindest nen Anhaltspunkt. Aber der Code lässt sich fehlerfrei kompilieren...

sternst
28.07.2008, 15:59
Bleibt eigentlich nur ein Hardware-Problem.
Schwingt der Quarz überhaupt?