Hallo,
ich lese mit einem ATMega32 einen Drehgeber ein (über PD3(INT1) und
PC7(TOSC2)). Dabei Polle ich die Zustände in zeitlichem Abstand (mit
Timer2), benutze also nicht INT1.
Das äusserst seltsame ist dass beim Drehen des Drehgebers jeder zweite
bis ca. vierte Impuls einen Reset des µC auslöst. Watchdog ist keiner
drin, Brown-Out deaktiviert und an Reset liegt keine spezielle Hardware,
nur 10k PullUp und 47nF Entstörkondensator, die ich testweise auch noch
beide entfernt habe. Reset ist jetzt gerade also komplett unbeschalten
und dennoch wird der ATMega resettet.
Wie ist das Möglich?? Es gibt doch gar keine weiteren
Reset-Möglichkeiten.
Die Spannung ist übrigens stabil auf 5V.
Meine Initialisierung sieht wie folgt aus:
1 | DDRB = (1<<PB3); // OC0 als Ausgang (Summer) | (1<<PB1) | (1<<PB2);
|
2 | DDRD = (1<<PD2) | (1<<PD6); // PD2 = DE für MAX485
|
3 | DDRC = (1<<PC5) | (1<<PC3); // Ausgang zur LED von Home-Taster
|
4 | UBRRH = UBRR_VAL >> 8;
|
5 | UBRRL = UBRR_VAL & 0xFF;
|
6 |
|
7 | UCSRB = (1<<RXEN)|(1<<TXEN)| (1 << RXCIE); //UART TX einschalten
|
8 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); //8 data, 2 stop bits
|
9 |
|
10 | // MCUCR |= (1<<ISC00); //INT1 auf fallende und steigende Flanke triggern
|
11 | // GICR |= (1<<INT1); //INT1 wird aktiviert
|
12 |
|
13 | TCCR0 = 3; //Timer0 auf FCPU/64 einstellen
|
14 | TCCR0 |= (1 << WGM01); // CTC Modus (Timer 0 wird bei erreichen von OCR0 zurück gesetzt
|
15 | // TCCR0 |= (1 << COM00); //Toggle OC0
|
16 | OCR0 = 108; //OC0 wird bei erreichen von OCR0 getoggelt
|
17 | TCCR2 = 6; //Timer2 auf FCPU/256 einstellen
|
18 | TCCR2 |= (1 << WGM21); // CTC Modus (Timer 2 wird bei erreichen von OCR2 zurück gesetzt
|
19 | OCR2 = 71; //Compare Match alle 10ms
|
20 |
|
21 | TIMSK |= (1<<OCIE2); //CTC-Interrupt wird aktiviert
|
22 | // TIMSK |= (1<<TOIE2); //Timer2 wird aktiviert
|
23 |
|
24 | ADMUX = 7; // ADC-Kanal waehlen
|
25 | ADMUX |= (1<<ADLAR) | (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
26 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
|
27 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
28 | while ( ADCSRA & (1<<ADSC) ) {
|
29 | ; // auf Abschluss der Konvertierung warten
|
30 | }
|
31 |
|
32 | SPI_MasterInit();
|
33 | PORTC ^= (1<<PC5); //##########################################################
|
34 | sei();
|
35 |
|
36 | void SPI_MasterInit(void)
|
37 | {
|
38 | /* Set MOSI, SCK and SS output, all others input */
|
39 | DDRB |= (1<<PB4) | (1<<PB5) | (1<<PB7); // SPI SS, MOSI und SCK als Ausgang setzen
|
40 | PORTB |= (1<<PB4); //SS auf high setzen -> Master
|
41 | /* Enable SPI, Master, set clock rate fck/128 = 115200kHz */
|
42 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);
|
43 | }
|
Auch wenn sei() deaktiviert ist wird der µC noch resettet. Wenn ich die
komplette Initialisierung deaktiviere resettet er nicht mehr, aber den
schuldigen Part zu finden bei einzelner Aktivierung/Deaktivierung gelang
mir noch nicht. Scheint mir ein Zusammenspiel von verschiedenen
Verursachern zu sein. Aber ich verstehe immer noch nicht wie das
überhaupt möglich sein darf.