Forum: Mikrocontroller und Digitale Elektronik Timer 2 Problem ATmega640


von Chris (Gast)


Lesenswert?

Hallo,

ich versuche schon seit einiger Zeit meinen 2. Timer zum laufen zu 
kriegen, aber irgendwie will er einfach nicht. Das Programm lief vorher 
schon auf dem Atmega64 und ich will es einfach nur so anpassen dass es 
auf dem Atmega640 läuft. Beim starten des Programms hängt es sich jedoch 
einfach auf.
1
void Interrupt_Timer2_Konfig(void)
2
{
3
bit_setzen(TCCR2B,CS22);
4
bit_setzen(TCCR2B,CS21);
5
bit_loeschen(TCCR2B,CS20);
6
7
bit_setzen(TCCR2A,WGM21);
8
bit_loeschen(TCCR2A,WGM20);
9
bit_loeschen(TCCR2B,WGM22);
10
11
bit_setzen(TIMSK2,OCIE2A);
12
13
OCR2A = 62;
14
}
15
16
ISR (TIMER2_COMPA_vect)
17
{
18
.
19
.
20
.
21
}

Infos:
Atmega640
Fclock = 16 MHz
Timer 1 und 3 auch im Einsatz


Schonmal Vielen Dank für Eure Hilfe

Chris

von spess53 (Gast)


Lesenswert?

Hi

Bist du sicher, das es am Timer liegt? Sieht eigentlich OK aus.

Übrigens wird deine 1ms genauer, wenn du einen Vorteiler von 64 benutzt. 
Jetzt hast du 0,8% Fehler.

MfG Spess

von Chris (Gast)


Lesenswert?

Ja eigentlich schon, sobald ich das OCIE2A bit nicht setze funktioniert 
alles einwandfrei.

von spess53 (Gast)


Lesenswert?

Hi

>Ja eigentlich schon, sobald ich das OCIE2A bit nicht setze funktioniert
>alles einwandfrei.

Dann liegt es wohl eher an der Interruptroutine.

MfG Spess

von Chris (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ja eigentlich schon, sobald ich das OCIE2A bit nicht setze funktioniert
>>alles einwandfrei.
>
> Dann liegt es wohl eher an der Interruptroutine.
>
> MfG Spess

die Idee hatte ich auch schon aber wenn ich die rausnehme klappt es 
trotzdem nicht :/

von spess53 (Gast)


Lesenswert?

Hi

>die Idee hatte ich auch schon aber wenn ich die rausnehme klappt es
>trotzdem nicht :/

Das passt aber nicht zu deiner Aussage:

>Ja eigentlich schon, sobald ich das OCIE2A bit nicht setze funktioniert
>alles einwandfrei.

Ohne Interruptroutine, aber mit gesetztem OCIE2A-Bit geht natürlich 
nichts. Was machst du denn in deiner Interruptroutine?

MfG Spess

von holger (Gast)


Lesenswert?

>Ohne Interruptroutine, aber mit gesetztem OCIE2A-Bit geht natürlich
>nichts. Was machst du denn in deiner Interruptroutine?

Irgendwie riecht doch alles danach das das Programm für den
falschen Controller übersetzt wurde;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vielleicht gibst du uns ja compilierfähigen Code.

Die Steuerregister bitweise einzeln zu setzen hat übrigens nicht viel
Sinn.  Sinnvoller ist es dort, sie komplett zu setzen:
1
TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS21);
2
TCCR2A = _BV(WGM21) | _BV(WGM20);

Chris schrieb:
> Das Programm lief vorher
> schon auf dem Atmega64 und ich will es einfach nur so anpassen dass es
> auf dem Atmega640 läuft.

Du hast aber dran gedacht, dass der Vorteiler von T/C2 auf dem
ATmega640 andere Einstellungen hat als der des T/C2 auf dem ATmega64,
ja?  (Das hängt damit zusammen, dass T/C2 hier derjenige ist, der
asynchron vom 32-kHz-Quarz betrieben werden kann, das war beim 64er
der T/C0.)

von Peter D. (peda)


Lesenswert?

Chris schrieb:
> die Idee hatte ich auch schon aber wenn ich die rausnehme klappt es
> trotzdem nicht :/

Das geht nicht. Sobald ein Interrupt freigegeben wird, muß dazu ein 
Handler existieren. Du kannst ihn aber einfach leer lassen.


Peter

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.