Forum: Mikrocontroller und Digitale Elektronik AtMega128 16bit Timer ansteuern


von andy k. (andyk89)


Lesenswert?

Moin liebe Gemeinde,

ich habe im Rahmen eines Projektes ein Autonomes Modellfahrzeug zu 
programmieren, einen Fehler in meinem Porgramm.
Ich bin noch am Anfang, also nicht wundern.

Das Problem ist bisher nur, dass keine ISR beim Timerüberlauf ausgelöst 
wird.
Es handelt sich um einen AtMega128 mit 16bit Timer.

----------------------------------------------------------------
void main(){
//---------------------------------------------------------------------- 
--------
//  Timer Initialisierung
//---------------------------------------------------------------------- 
--------
// SETUP für 16bit Timer [NEUES BOARD]
    TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) | 
(0<<COM1B1)| (0<<COM1B0)| (0<<COM1C1)| (0<<COM1C0) ;
  TCCR1B |= (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12);

//Prescaler Setup [001=1 | 010=8 | 011=64 | 100=256 | 101=1024]
// 16000000MHZ/256=62500 Hz
// 65536/62500 =1.048576 seconds
  TCCR1B |= (1<<CS12) | (0<<CS11) | (0<<CS10);

  TCCR1B = (0<<FOC1A) | (0<<FOC1B) | (0<<FOC1C);

//Timer Interrupt Enable
  TIMSK |= ( 1 << TOIE0 );


TIMSK1 = 0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation page 148 (mode0);

TCCR1B = 0x04; // start timer/ set clock

// 16bit counter start register
// start at 3036 -> overflow every second
// 16000000MHz/256=62500 Hz
// (65536-3036)/62500 =1.00 second
TCNT1 = 3036;


//Global Interrupt Enable
  sei();


while(1);
}
-------------------------------------------------------------------

Zurzeit besteht die ISR nur aus reseten des Timers.

Mein Ziel ist es, bei jeder ISR ein PWM-Signal mit dem Oszilloskopen 
auszugeben.

Ich bedanke mich jetzt schon einmal für eure Hilfe.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
>  TCCR1B |= (1<<CS12) | (0<<CS11) | (0<<CS10);

>  TCCR1B = (0<<FOC1A) | (0<<FOC1B) | (0<<FOC1C);
Das schieben von Nullen bringt nicht das, was du denkst.

von Karl H. (kbuchegg)


Lesenswert?

Und TCCR1B nach dem Setzen des Vorteilers mit 0 zu überschreiben, löscht 
dann auch das gesetzte Vorteiler-Bit wieder.

Manchmal ist weniger einfach mehr!
Vor allen Dingen dann, wenn man vor lauter 0-en und 1-en und genutzten 
bzw. nicht genutzten Möglichkeiten den Überblick verliert, welche 
Konfiguration am Timer eigentlich hergestellt werden soll.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und TCCR1B nach dem Setzen des Vorteilers mit 0 zu überschreiben, löscht
> dann auch das gesetzte Vorteiler-Bit wieder.


Ooops.
Und 3 Zeilen weiter heißt es dann

TCCR1B = 0x04; // start timer/ set clock



Ach komm!
Mach doch deinen Code erst mal übersichtlich. So hat das doch keinen 
Sinn.

von Karl H. (kbuchegg)


Lesenswert?

Apropos AtMega128

Die M103 Fuse hast du gelöscht?
Die ist standardmässig gesetzt und bewirkt, dass du einen Mega103 vor 
dir hast und keinen Mega128. Ist das der Fall und compilierst du für 
einen Mega128, dann geht der erste Funktionsaufruf (kann natürlich auch 
ein ISR AUfruf sein), kräftig in die Hose.

von Oliver S. (oliverso)


Lesenswert?

andy kkkkkk schrieb:
> TCCR1A = 0x00; // normal operation page 148 (mode0);
>
> TCCR1B = 0x04; // start timer/ set clock

Über diese beiden Zeilen solltest du nochmal gründlich nachdenken.

Oliver

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.