Forum: Mikrocontroller und Digitale Elektronik unbeabsichtigter Rest wird ausgelöst (ATMega32)


von Fred (Gast)


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.

von Johannes M. (johnny-m)


Lesenswert?

Vollständiges Programm? Wo ist der Handler des USART-RXC-Interrupts? 
Einen Reset bei global gesperrten Interrupts ist allerdings oft eher ne 
Hardware-Sache...

von Fred (Gast)


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.

von Gast (Gast)


Lesenswert?

Fred wrote:
>  und der Reset-Pin nicht beschalten ist.

Genau das wird die Ursache sein...
Ein 10K gegen+ und ein 100nF gegen Masse wirken wunder.

von Mäh (Gast)


Lesenswert?

Abblockkondensatoren vergessen? Zinnbrücke unter Flussmittelresten? 
ISR-Vektor falsch eingetragen?

von Fred (Gast)


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.

von holger (Gast)


Lesenswert?

>und auch hier resettet der ATMega wenn ich am Drehgeber drehe.

Wie ist der Drehgeber angeschlossen?
Nicht das der dir die Betriebsspannung kurzschliesst.

von Olli R. (omr) Benutzerseite


Lesenswert?

Schaltplan? Foto?

von Fred (Gast)


Lesenswert?

ich habe die so beschalten wie im Datenblatt des Drehgebers 
vorgeschlagen:

                    VCC
                     |
                     |
                    10k
                     |
Drehgeber_Channel----|
                     |
                     |
                    68nF
                     |
                    GND

von holger (Gast)


Lesenswert?

>ich habe die so beschalten wie im Datenblatt des Drehgebers
>vorgeschlagen:

Dann miß mal nach ob da wirklich 10k zwischen
Drehgeberanschluß und Vcc liegen.

von Fred (Gast)


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.

von Fred (Gast)


Lesenswert?

bei einem Pin 11k, beim andern 21k. Warum 21k muss ich noch schauen, 
denn der Widerstand an sich hat exakt 10k.

von Fred (Gast)


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.

von holger (Gast)


Lesenswert?

>es scheint mir fast, dass als einzige Erklärung bleibt, dass der ATMega
>beim löten was mitbekommen hat.

Statt am Drehgeber zu drehen klopf mal die Platine ab.
Gibt es dann auch Resets?

von Fred (Gast)


Lesenswert?

klopfen bewirkt gar nichts, auch Taster zu bedienen die an anderen I/O's 
angeschlossen sind nicht führen zu keinem Reset. Nur der Drehgeber. bzw 
nur PD3 oder PC7.

von zwieblum (Gast)


Lesenswert?

was sagt das oszi zu den signalen vom drehgeber?

von Fred (Gast)


Lesenswert?

Oszi meldet alles i.O.

von Fred (Gast)


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.

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.