unbeabsichtigter Rest wird ausgelöst (ATMega32)

Gast #1233853
Lesenswert?

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.
Gast #1233866
Lesenswert?

ich muss mich nochmals korrigieren, auch wenn die komplette 
Initialisierung deaktiviert ist erfolgt der Reset. (Hatte meine 
Rset-Anzeige LED an PC5 mit deaktiviert)

Dennoch bleibt die Frage wie der Reset ausgelöst werden kann wenn die 
Spannung stabil ist und der Reset-Pin nicht beschalten ist.
Gast #1233895
Lesenswert?

>Ein 10K gegen+ und ein 100nF gegen Masse wirken wunder.
hab ich ja, bzw. einen 47nF. Unbeschaltet war nur zum testen ob an der 
Reset-Beschaltung ein Problem lag, was ich nun ausschließen kann.

>ISR-Vektor falsch eingetragen?
ich hab jetzt mal ein komplett leeres Projekt erstellt nur mit einem 
LED-Indikator für den Reset:
1
#include <avr/io.h>
2

3
int main(void){
4
  PORTC ^= (1<<PC5);
5
  return 0;
6
}
und auch hier resettet der ATMega wenn ich am Drehgeber drehe.

Wie eine Zinnbrücke dieses Verhalten erklären sollte weiss ich jetzt 
nicht. Da selbst wenn PD3 oder PC7 direkt mit Reset kurzgeschlossen 
wären (was sie nicht sind), würde der Reset bei jeder zweiten Drehung 
kommen, aber er kommt mit keiner Regelmässigkeit.
Gast #1233933
Lesenswert?

ich muss dazu sagen dass ich den Drehgeber mit dieser Beschaltung schon 
ohne Probleme verwendet habe, allerdings an anderen Pins. Da es sich 
hierbei aber um eine SMD-Platine handelt kann ich nicht einfach mal so 
die Pins tauschen.
Gast #1233982
Lesenswert?

ich weiss nicht genau was ich vorher gemessen habe, aber die 21k sind 
doch auch nur 10k wie es sein sollte.

es scheint mir fast, dass als einzige Erklärung bleibt, dass der ATMega 
beim löten was mitbekommen hat.
Gast #1248110
Lesenswert?

so um nochmal schnell Feedback zu geben:
Des Rätsels Lösung war Layouttechnisch begraben. Die Ground Leitung zu 
den Entprellkondensatoren war wohl nicht dick genug oder zu lang und so 
hat, ab und zu wenn der Channel vom Drehgeber von low auf high ging, der 
Entprellkondensator den GND stark genug mit angehoben dass der µC 
resettet hat.

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