ungewollter Reset AtMega128

Gast #1143805
Lesenswert?

Hallo,

ich verwende einen Mega128 in einem kleinen Projekt, um unter anderem 
einen Drehcoder auszuwerten. Der 2 Drehcoder Leitungen sind mit 5.6K 
Pull-up Widerständen gegen Vcc geschaltet und haben jeweils einen 100n 
Kondensatoren gegen Masse. Am Controller sind sie an PD0 (INT0) und PC4 
angeschlossen.

Wenn ich am Drehcoder drehen kommt es nun häufig zu einem Reset des 
Controllers. Im MCUCSR sind danach PORTF, EXTRF und JTRF gesetzt. Das 
Datenblatt sagt mir dazu auf Seite 51 verschiede Erklärungen, wobei ich 
nicht deuten kann wodurch dir Kombination aus den oben genannten 
auftreten soll.

Die Spannungsversorgung sollte eigentlich stabil sein. Die Schaltung ist 
auf einer doppelseitigen Platine, Abblockkondensatoren sind soweit 
überall verbaut.

Ich hoffe dass mir jemand weiterhelfen kann oder zumindest Ideen hat wo 
der Fehler liegen könnte. Vielen Dank
Thomas
Gast #1143856
Lesenswert?

Ist der Reset Pin richtig beschaltet?
Ansonsten die Speisung mal während des Drehens mit einem KO messen.
Wenn ales nichts hilft; es kann auch ein Programmierfehler sein, welcher 
z.B. einen Stacküberlauf hervorruft.
Gast #1143877
Lesenswert?

Ich habe die ganze Interrupt Steuerung aus meinem Programm 
auskommentiert. Es sollte also INT0 nicht mal mehr aktiv sein und daher 
schließe ich einen Softwarefehler aus.

Ja der Reset Pin sollte stimmen. Ich habe 5V in normalem Betrieb, mit 
aufgestecktem JTAG nur noch 4V. Dass das so ist war mir zwar noch nie 
aufgefallen aber nachdem ich an der Schaltung schon länger bastel geh 
ich mal davon aus dass das normal ist.
Gast #1143918
Lesenswert?

Der Schaltplan ist etwas größer, im angehängten Teil ist zu sehen wie 
der Drehcoder angeschlossen ist. Die Leitungen P0, P1... gehen dann 
direkt auf die Pins den Controllers wie ich es oben beschrieben habe. 
Können durch die Kondensatoren irgendwelche Probleme entstehen? 
Eigentlich sollten die ja wenn dann nur über die Schalter im Drehcoder 
entladen werden und damit dort etwas höhere Ströme verursachen?
1
int main(){
2
      
3
  io_init();  
4

5
  cli();
6

7
  while(1){
8

9

10
  }
11
    
12
  return 0;
13
}
14

15
void io_init(void)
16
{
17
   
18
  DDRC &= ~(1 << DDC0);                      // switch 0 (breakpoint)
19
  DDRC &= ~(1 << DDC1);                      // switch 1
20
  DDRC &= ~(1 << DDC2);                      // switch 2
21
  DDRC &= ~(1 << DDC3);                      // switch 3
22
  DDRC &= ~(1 << DDC4);                      // rotary encoder 0
23
  DDRC &= ~(1 << DDC5);                      // rotary encoder button
24

25
  DDRD &= ~(1 << DDD0);                      // rotary encoder 1
26

27

28
  //Pull Ups
29
  PORTD |= (1 << DDD0);
30
  PORTC |= (1 << DDC4);
31
  PORTC |= (1 << DDC5);
32
          
33
}
Angehängte Dateien:
Gast #1143957
Lesenswert?

ok,

1. L5 gehört raus, AGND und GND niederohmig zusammen schliessen
2. Reset Beschaltung: R11 100K, C14 100p
3. pins 21 und 52 mit min 1µF gegen masse beschalten
4. warum brauchst Du so niederohmige pullup's am encoder 5,6k, deine 
interne µP pullup's schpielen keine rolle mehr.

hast du interne beschaltung vom encoder? ich habe ein verdacht!
Gast #1143982
Lesenswert?

wenn Du punkte 1-3 bereits hast, schmeiß die ext. Pullup's 5.6k raus und 
laß die internen eingeschalten, für den ersten test. Cap. sollen 
richtung 1nF runter

es darf kein Reset mehr vorkommen. Bei erfolg erzähle ich dir meinen 
verdacht
Gast #1144234
Lesenswert?

Was meinst du mit Niederohmigkeit des Pullups? Sollten doch 5.6K bleiben 
und die sollten der Spannungsversorgung doch nichts antun? Ich meine ich 
hoffe inständig dass du Recht hast, ich kanns mir noch nicht erklären 
;-)
Gast #1144837
Lesenswert?

Hallo,

hattest Recht! Vielen Dank Dir und auch den anderen! Ich habe sowohl die 
Widerstände als auch die Kondensatoren raus genommen und es ging sofort, 
hatte auch keinerlei prellen oder sonstige Probleme mit der Auswertung.
Dann habe ich die Kondensatoren wieder rein gemacht und bekamm wieder 
häufige Resets. Scheinbar waren 100n doch etwas übertrieben ;-) Was nur 
mit den Widerständen passiert habe ich jetzt nicht mehr extra 
ausprobiert, die internen Pullups tun ihre Sache ja ganz gut.
Gast #1144887
Lesenswert?

gut gut,

hast Du die anderen Sachen auch umgesetzt? Wichtig ist auch, daß die 
Masse überall durchverbunden ist. Wenn Masse schwimmt, kann auch zum 
Systemreset kommen.

Beim Encoder, den du einsezen tust, ist eine enprellung von ca. 3-5ms 
notwendig, um Betriebssicherheit zu gewehrleisten, das muß Du 
sinnvollerweise in der sw machen. wie oben schon gesagt, kannst Du die 
Cap. richtung 100p-1nF einsetzen

gruß

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