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
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.
Hi, bin kein Experte aber wenn der Anschluss an INT0 ist wird doch ein interner Interrupt ausgelöst und dies ggf, noch während der vorherigen Interuptverarbeitung, wenn man schnell genug dreht... Da scheint mir ein Stack Overflow leicht möglich.
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.
wenn Interrupt freigeschalten ist, muß eine entsprechende ISR geben. Kann diese von sw nichtgefunden werden, weil der Zeiger nicht existiert, kommt es zum Reset am Baustein.
ferndiagnose wird immer schwieriger. poste mal den code und schaltplan, der fehler kann sowohl in der hw als auch in der sw liegen.
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 | }
|
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!
Die 5.6K sind aus dem Datenblatt, die 100n aus einem anderen und ich wollte mir damit das Software entprellen sparen. Ich verwende diesen Encoder: http://www.farnell.com/datasheets/127163.pdf "Terminal C" ist auf GND, A und B gehen auf RE0 und RE1.
Ach ja, die internen Pull Ups bringen hatte ich anfangs nicht, sind nur bei der Fehlersuche drin gelandet.
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
Tut mir Leid, das wird heute nichts mehr, kann es leider erst morgen überprüfen. Was hast du denn im Verdacht?
durch niederohmigkeit des pullups wird für kurze Zeit Einbruch im Vcc verursacht. Dadurch geht µP in Reset. Beim Encoder habe ich damals 10MOhm eingesetzt.
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 ;-)
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.
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.