Umstieg von Atmega8 auf Atmega88

Gast #4479905
Lesenswert?
• ▲
▼
Ich steige derzeit vom Atmega8 auf ein Atmega88 um,
mein Programm funktioniert so nicht richtig

ist meine Konfiguration von den Timern und Interrupts richtig



 //Atmega8
 //TCCR2 = (1<<CS00);    // No prescaling

 //Atmega88
  TCCR2B = (1<<CS00);    // No prescaling

  TCNT2 = 0;//TIMER2 Startwert

 //Atmega8
 //TCCR0 = (1<<CS00);    // No prescaling

  //Atmega88
  TCCR0B = (1<<CS00);    // No prescaling

  //Atmega8
  //TIMSK = (1<<TOIE0)|(1<<TOIE2);

  //Atmega88
   TIMSK0 = (1<<TOIE0);
   TIMSK2 = (1<<TOIE2);

  //Atmega8
  //MCUCR = 0b00001100;

   //Atmega88
   EICRA = 0b00001100;

  //Atmega8
  //GICR =  0b10000000;

   //Atmega88
   EIMSK =  0b10000000;


   TCCR1B = 0b00000100;    //Timer1 starten

 sei();

ISR(TIMER0_OVF_vect)
{

}

ISR(TIMER2_OVF_vect)
{
}
ISR(INT1_vect)
{
}
Gast #4480068
Lesenswert?
• ▲
▼
Im Datenblatt von Atmel steht so in der Liste
 //Atmega8
 GICR 0x3B (0x5B)
 GICR 0x3B (0x5B)

Ist das so richtig?
 //Atmega88
 EIMSK 0x1D (0x3D)
 MCUCR 0x35 (0x55)

  //Atmega8
  //GICR =  0b10000000;

   //Atmega88
   EIMSK =  0b10000000;

   //Atmega8
   //MCUCR 0x35 (0x55)
  //MCUCR = 0b00001100;

   //Atmega88
   //SMCR 0x33 (0x53)
   EICRA = 0b00001100;
Moderator Persönliche Seite #4480078
Lesenswert?
• ▲
▼
andy schrieb:
> EICRA = 0b00001100;

Benutze die Preprocessor-Konstanten, um die Bits zu bilden. Dann 
brauchst Du Dich um die einzelnen Bit-Positionen im Register nicht zu 
kümmern.

Also konkret bei dieser Zuweisung:
1
EICRA = (1<<ISC11) | (1<<ISC10);

Bei einem Prozessor-Wechsel musst Du dann nur noch kontrollieren, ob 
irgendein Bit von einem in ein anderes Register gewandert ist. Das ist 
wesentlich portabler und auch lesbarer als Deine 0bxxxxx-Schreibweise.
Gast #4480084
Lesenswert?
• ▲
▼
So wie jetzt ist läufts auf dem atmega88 nicht.

Das was ausgeblendet ist lief auf einem atmega8 ohne probleme
.
  //TCCR2 = (1<<CS00);    // No prescaling
  TCCR2B = (1<<CS00);    // No prescaling

  TCNT2 = 0;//TIMER2 Startwert

  //TCCR0 = (1<<CS00);    // No prescaling
  TCCR0B = (1<<CS00);    // No prescaling

  //TIMSK = (1<<TOIE0)|(1<<TOIE2);
   TIMSK0 = (1<<TOIE0);
   TIMSK2 = (1<<TOIE2);

  //MCUCR = 0b00001100;
  EICRA = (1<<ISC11) | (1<<ISC10);

  //GICR =  0b10000000;
  EIMSK =  0b10000000;


  TCCR1B = 0b00000100;    //Timer1 starten
Moderator Persönliche Seite #4480107
Lesenswert?
• ▲
▼
andy schrieb:
>   TCCR2B = (1<<CS00);    // No prescaling

Falsch: TCCR2B enthält die Bits

    FOC2A FOC2B – – WGM22 CS22 CS21 CS20

CS00 gibts da nicht, siehe Datenblatt. Du meinst wohl CS20. 
Glücklicherweise haben CS00 und CS20 denselben Wert, so dass dieser 
Fehler keine Auswirkungen hat.


>   TCCR0B = (1<<CS00);    // No prescaling

Okay. Damit löscht Du aber vielleicht ein eventuell gesetztes WGM02.

>   //TIMSK = (1<<TOIE0)|(1<<TOIE2);
>    TIMSK0 = (1<<TOIE0);
>    TIMSK2 = (1<<TOIE2);

Okay.

>   //MCUCR = 0b00001100;
>   EICRA = (1<<ISC11) | (1<<ISC10);

Okay.

>   //GICR =  0b10000000;
>   EIMSK =  0b10000000;

Falsch. Dieses Bit ist lt. Datenblatt *unbenutzt*:

EIMSK  – – – – – – INT1 INT0

Bit 7..2 – Res: Reserved Bits
These bits are unused bits in the ATmega48PA/88PA/168PA/328P, and will 
always read as zero.

Hättest Du hier versucht, die Preprocessor-Konstante zu verwenden, dann 
hättest Du auch gemerkt, dass dieses Bit undefiniert ist.

Dein
>   //GICR =  0b10000000;

setzt INT1. Also hättest Du schreiben müssen:

    EIMSK = (1<<INT1);

Hier ist genau der Fehler gemacht worden, der tödlich ist. Hättest Du 
von vornherein INT1 geschrieben, dann hätte die Änderung
von
    GICR = (1<<INT1);
nach
    EIMSK = (1<<INT1);

gereicht. Denn das Bit sitzt dort an einer ganz anderen Position! In 
GICR ist es Bit7, in EIMSK ist es Bit1.


>   TCCR1B = 0b00000100;    //Timer1 starten

Datenblatt:

TCCR1B     ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10

Damit setzt Du CS12, also einen Teiler.

Datenblatt:
  CS12 CS11 CS11
   1    0    0     clk I/O /256 (From prescaler)

Ist dies das gewünschte?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren