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) { }
Atmel hat in der AVR094 alle nötigen Informationen für diesen Wechsel zusammengestellt: http://www.atmel.com/Images/doc2553.pdf
1 | //Atmega8
|
2 | //GICR = (1<<INT1);
|
3 | |
4 | //Atmega88
|
5 | EIMSK = (1<<INT1); |
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;
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.