PIC18F14K50 - seltsames Verhalten bei Wake-up aus Sleep

OP #5997714
Lesenswert?
• ▲
▼
Servus zusammen,

ich habe einen PIC18F14K50.
Über den Timer 0 habe ich mir einen Grundtakt von ca. 10 ms gebaut und 
erledige dort mein Ablaufprogramm. Hier wird regelmäßig Timer 3 
zurückgesetzt, wenn Inputs erfolgen.
Bei längerem Ausbleiben von Inputs wird Timer 3 nicht zurückgesetzt und 
veretzt den PIC in den Sleep-Mode. Dies funktioniert auch so weit.
Aufgeweckt werden soll das ganze über den externen Interrupt INT0 an Pin 
16.
Den habe ich mit 10k auf Masse gezogen und will bei einer steigenden 
Flanke weitermachen.
So weit so gut.
Allerdings reagiert der PIC nach dem Sleep-Befehl ca. 7 bis 8 Sekunden 
auf gar nichts mehr. Die Zeit ist immer gleich.
Ab und an kommt der Interrupt direkt nach dem Sleep-Befehl durch - 
allerdings nur, wenn ich das Programm zum ersten Mal starte und auch nur 
das eine Mal. Danach habe ich dann immer die 7 bis 8 Sekunden Wartezeit.

Hat jemand eine Idee, was hier passiert? Ich stehe gerade total auf dem 
Schlauch...
Danke euch schon mal, für eure Hilfe!
#5997773
Lesenswert?
• ▲
▼
Das liegt am Signal an Int0, und/oder am Quarz.
Entweder löst der Int nicht aus weil die Flanken zu luschig sind, oder 
du nutzt einen langsamen Quarz, der so lange braucht um hochzukommen.
Bei manchen PICs kann es vorkommen, das der erste Int den Quarz startet, 
aber wenn der Proz läuft ist der Int weg und nichts passiert. Der zweite 
Vogel fängt dann den Wurm weil der Quarz schon läuft.

Versuchs mal mit IntRC und poste deine Beschaltung am Int.
OP #5997820
Lesenswert?
• ▲
▼
Danke schon mal für die Antwort.

Ich tu mir noch schwer vorzustellen, daß es daran liegt.
Ich nutze den internen Takt mit 250 kHz.
Die Beschaltung habe ich mal angehängt. Also recht simpel.
Und das Signal an INT0 ist eine ganz normale steigende Flanke, auf die 
ich reagiere - und davon gebe ich zum Versuch jede Menge ab. Die 
Reaktion erfolgt aber immer nach genau der gleichen Zeit.
Gegen den zu langsamen Quarz spricht doch, daß es manchmal funktioniert 
- warum ist er da dann schnell? Und wir reden ja immer von 7 bis 8 
Sekunden.
Angehängte Dateien:
Gast #5997855
Lesenswert?
• ▲
▼
> Was meinst Du mit drinnen?

In dem unsichtbaren Sourcecode vorhanden?

> Aber 7 bis 8 Sekunden? Und warum manchmal sofort?

Die CPU braucht wohl ein paar Takte, bevor sie ordnungsgemäß 
Funktioniert.
OP #5998184
Lesenswert?
• ▲
▼
Ok, bin ein Stück weiter.
Scheint ein Watchdog-Problem zu sein.
Hab den mal deaktiviert.

Jetzt klappt's aber immer noch nicht so ganz.
Der PIC geht in SLEEP und läßt sich durch den Interrupt aufwecken.
Allerdings nur einmal. Wenn er das nächste Mal in SLEEP geht, kommt er 
nicht mehr zurück.
Nach dem Interrupt setze ich folgende Bits und schalte den Interrupt 
wieder aus:

INTCONbits.INT0IF = 0;  // reset INT0
INTCONbits.INT0IE = 0;  // INT0 interrupt off for wake-up

Vor dem Sleep-Befehl setze ich das folgende und schalte den Interrupt 
wieder an. Habe ich da was vergessen? Es klappt nämlich nur beim ersten 
Mal.

INTCONbits.INT0IE = 1;  // INT0 interrupt on for wake-up

Danke euch schon mal :-)
OP #5998209
Lesenswert?
• ▲
▼
Ok, bin wieder weiter, aber nicht schlauer :-D

Ich hatte in der Interrupt-Routine die folgende Abfrage für den INT0 
drin:
if (INTCONbits.INT0IE && INTCONbits.INT0IF)

Das geht beim ersten Interrupt durch, beim zweiten aber nicht mehr.
Die Abfrage nach INT0IE macht Probleme. Das Bit ist beim zweiten 
Interrupt nicht mehr gesetzt, obwohl er kommt.
Jemand eine Idee warum?

Hab jetzt mal die Abfrage geändert - so funktioniert es:
if (INTCONbits.INT0IF)
#5998250
Lesenswert?
• ▲
▼
Hallo,

welcher Befehl steht denn direkt hinter dem SLEEP?

Wenn ich das richtig im Kopf habe, wird auch bei aktiviertem GIE der 
nächste Befehl nach SLEEP ausgeführt. Erst dann springt der Controller 
in die ISR.

Gruß


EDIT:

Schau mal unter Kapitel "17.1.6 INTERRUPTS" im Datenblatt. Da stehts 
drin.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.