Forum: Mikrocontroller und Digitale Elektronik Umstieg von Atmega8 auf Atmega88


von andy (Gast)


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

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Atmel hat in der AVR094 alle nötigen Informationen für diesen Wechsel 
zusammengestellt:
http://www.atmel.com/Images/doc2553.pdf

von S. Landolt (Gast)


Lesenswert?

1
  //Atmega8
2
  //GICR =  (1<<INT1);
3
4
   //Atmega88
5
   EIMSK =  (1<<INT1);

von andy (Gast)


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;

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Cyblord -. (cyblord)


Lesenswert?

Frank M. schrieb:
> 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.

Alles andere ist auch lediglich ein Fehler der darauf wartet zu 
passieren.

von andy (Gast)


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

von Frank M. (ukw) (Moderator) Benutzerseite


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?

: Bearbeitet durch Moderator
von andy (Gast)


Lesenswert?

vielen dank für die Ausführliche Antwort.
Hab ich wieder was gelernt.
danke
jetzt gehts

mfg

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.