Forum: Mikrocontroller und Digitale Elektronik ungewollter Reset


von Holger Körber (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe das Problem, das der 2313 in unregelmäßiger Reihenfolge
resettet, wenn ich externe Interupts an Int0 über einen
Fototransistor (siehe schaltung) anlege.
Wo kann das herrühren?
Watchdog kann ausgeschlossen werden, ist deaktiviert!
Speisespannung kommt aus Bleiakku und ist stabil.
Kann es an der Eingangsbeschaltung des Int0 liegen?

Danke und Gruß Holger

von crazy horse (Gast)


Lesenswert?

Stackproblem?
Hardware eher nicht.

von Stefan Kleinwort (Gast)


Lesenswert?

Kann es am Programm liegen?

Gibst Du innerhalb der IR-Routine Interrupts wieder frei?
-> mehrfacher IR-Aufruf -> Stack läuft über -> Absturz -> Reset ??

1-2 100nF-Kondensatoren parallel zum 470uF solltest Du noch einbauen.

Stefan

von Jens123 (Gast)


Lesenswert?

wenn vorhanden watchdog??

und sicher, dass es ein "RESET" ist

toggel mal ein paar LEDs im Programm um herrauszufinden, wo / wann er
"RESETTET"

von Holger Körber (Gast)


Lesenswert?

Hallo zusammen,
schon mal Danke für die schnelle Reaktion!!
Es ist sicher, dass es ein Reset ist, da das Programm in einer Loop
läuft und nur durch Reset die LED an PD5 gesetzt wird und
beim ersten Int0 abgeschaltet wird.
Interupts werden während der IR-Routine freigegeben,
da parallel auch noch ein Timer läuft, der bei Überlauf einen
Int. auslöst und eine Variable hochzählt.
Kann es sich dann um einen "Prell-Effekt" der Lichtschranke handeln?

Gruß Holger

von Michael (ein anderer) (Gast)


Lesenswert?

Hat der 2313 nicht einen Hardware-Stack? Wenn ja, hast Du mit 99.99999%
ein Softwarefehler.

Im übrigen ist Dein 7805 falsch beschaltet: Der 470uF Kondensator
gehört an den Eingang (auf die 12 Volt Seite). Zusätzlich baust Du noch
einen 100nF Kondensator zwischen VCC und GND an Dein 2313 ran. Ein
Kondensator am Ausgang des 7805 ist Blödsinn.

von Tobi (Gast)


Lesenswert?

"Ein Kondensator am Ausgang des 7805 ist Blödsinn."

das nicht, aber er sollte 100nF haben

von Stefan Kleinwort (Gast)


Lesenswert?

BEVOR Du innerhalb der IR-Routine andere IRs freigibst, musst Du den
INT0 sperren, sonst wird er mehrfach aufgerufen -> bis der Stack durch
die IR-Push-Adressen überläuft.

INT0/1 kann entweder level- oder flankengetriggert erfolgen. Im ersten
Fall bekommst Du bei Dauer-low immer wieder einen IR, im zweiten Fall
bei jeder Flanke.

Stefan

von Daniel (Gast)


Lesenswert?

Ich dachte Interrupts würden (zumindest in C) automatisch komplett
deaktiviert, sobald eine Int-Routine aufgerufen wird?

von Holger Körber (Gast)


Lesenswert?

Hallo zusammen,
der Int0 ist flankengetriggert für fallende Flanke konfiguriert.
Will heißen, wenn Licht eingeschaltet wird, dann Int0.
Licht ausschalten oder eingeschaltet lassen sollte doch keine
Auswirkung haben.

Gruß Holger

von crazy horse (Gast)


Lesenswert?

und warum stellst du nicht endlich mal dein Programm ein, damit die
Rätselraterei aufhört?

von Holger Körber (Gast)


Lesenswert?

Hallo zusammen,
kann es sein, dass Sprünge in Prozeduren innerhalb einer
Interrupt-Routine unzu(ver)lässig sind?
Habe zwei solcher Sprünge etwas umgebaut, sodass der Code jetzt
innerhalb der Routine abgearbeitet wird und der Fehler scheint
weg zu sein.
Übrigens programmiere ich mit AVRide.

Gruß Holger

von Michael (ein anderer) (Gast)


Lesenswert?

Unzurvelässig sind solche Sprünge nicht, sondern Dein Programm ist
unzuverlässig. Du hast ganz offensichtlich einen Stack-Überlauf.

Aber wie "crazy horse" schon mal geschrieben hat, stell' doch
einfach Deinen Source hier rein. Alles andere hat keinen Wert. Wenn Du
Angst hast, dass jemand etwas abkupfert, dann musst Du alleine mit
Deinem Problem fertigwerden!

von Sebastian Wille (Gast)


Lesenswert?

Hallo Holger,

auf die Schnelle sind mir zwei Dinge aufgefallen:

1.: Schließe mal einen 47pF-Kondensator direkt noch an Reset, andere
Seite an GND.

2.: Verwendest Du bei Deinen Interrupts auch "reti". Ein "ret" wäre
hier falsch!!!

Sonst stell' mal Dein Programm rein...

Sebastian

von icke (Gast)


Lesenswert?

2.: Verwendest Du bei Deinen Interrupts auch "reti". Ein "ret" wäre
hier falsch!!!



Der Mann programmiert in c

von Holger Körber (Gast)


Lesenswert?

Hallo zusammen,
AVRide ist ein kleiner Assembler, der auch für Anfänger (wie mich)
recht einfach zu verstehen ist.
Gibt es eine Möglichkeit, vielleicht durch einen Registereintrag
festzustellen ob ein Stack-Überlauf stattgefunden hat?
Wenn ja, welches Register ist das?

Gruß Holger

von Michael (ein anderer) (Gast)


Lesenswert?

HAST DU WAS AN DEN OREN???? STELL' DEIN SOURCE HIER REIN, DANN REDEN
WIR WEITER!!!

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.