www.mikrocontroller.net

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


Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  DDRB = (1<<PB3); // OC0 als Ausgang (Summer) | (1<<PB1) | (1<<PB2);
  DDRD = (1<<PD2) | (1<<PD6); // PD2 = DE für MAX485
  DDRC = (1<<PC5) | (1<<PC3); // Ausgang zur LED von Home-Taster
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
   
  UCSRB = (1<<RXEN)|(1<<TXEN)| (1 << RXCIE);      //UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);      //8 data, 2 stop bits

//  MCUCR |= (1<<ISC00);    //INT1 auf fallende und steigende Flanke triggern
//  GICR |= (1<<INT1);    //INT1 wird aktiviert

  TCCR0 = 3;  //Timer0 auf FCPU/64 einstellen
  TCCR0 |= (1 << WGM01); // CTC Modus (Timer 0 wird bei erreichen von OCR0 zurück gesetzt
//  TCCR0 |= (1 << COM00); //Toggle OC0
  OCR0 = 108; //OC0 wird bei erreichen von OCR0 getoggelt
  TCCR2 = 6;  //Timer2 auf FCPU/256 einstellen
  TCCR2 |= (1 << WGM21); // CTC Modus (Timer 2 wird bei erreichen von OCR2 zurück gesetzt
  OCR2 = 71; //Compare Match alle 10ms

  TIMSK |= (1<<OCIE2);    //CTC-Interrupt wird aktiviert
//  TIMSK |= (1<<TOIE2);    //Timer2 wird aktiviert

  ADMUX = 7;                      // ADC-Kanal waehlen
  ADMUX |= (1<<ADLAR) | (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }

  SPI_MasterInit();
  PORTC ^= (1<<PC5);  //##########################################################
  sei();  

void SPI_MasterInit(void)
{
  /* Set MOSI, SCK and SS output, all others input */
  DDRB |= (1<<PB4) | (1<<PB5) | (1<<PB7); // SPI SS, MOSI und SCK als Ausgang setzen
  PORTB |= (1<<PB4);   //SS auf high setzen -> Master
  /* Enable SPI, Master, set clock rate fck/128 = 115200kHz */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);
}

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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mäh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abblockkondensatoren vergessen? Zinnbrücke unter Flussmittelresten? 
ISR-Vektor falsch eingetragen?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>

int main(void){
  PORTC ^= (1<<PC5);
  return 0;
}
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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und auch hier resettet der ATMega wenn ich am Drehgeber drehe.

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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltplan? Foto?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe die so beschalten wie im Datenblatt des Drehgebers 
vorgeschlagen:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred (Gast)
Datum:

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

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was sagt das oszi zu den signalen vom drehgeber?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oszi meldet alles i.O.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.