www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16F627 Wacht nicht auf


Autor: Dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,


ich bin Anfänger und brauch da mal eure Hilfe.

Ich möchte gerne über ein interupt (RB0)den PIC in sleep setzten und 
dann wieder aufwecken.


Interupt auslösen und in den sleep mode geth aber er wacht nihct mehr 
auf.

Habt ihr irgendwelche ideen?

hier der code:

  org 0
  goto  RESET


  org 4    ;interupt on/off routine
inter
  movf  TMR0,0  ;TMR0
  subwf  0x40,0
  BTFSS  STATUS,2
  goto  inter
  BCF  STATUS,2
  movlw  D'0'
  movwf  out
  clrw
  clrf  TMR0
  BSF  INTCON,4
  BSF  INTCON,7
  BCF  INTCON,0
  ;btfss  out,0    ;????
  sleep
  nop
  RETFIE
  nop
  goto  captime



RESET  MOVLW  B'00001111'  ;
  MOVWF  CMCON

init  bsf      STATUS, RP0     ;
        movlw   B'00000001'     ;
        movwf   TRISB
  movlw   B'11000111'     ;
        movwf   OPTION_REG

  bcf     STATUS, RP0     ;
  movlw  B'10010000'
  movwf  INTCON    ;
  movlw   B'00110001'  ;
  movwf  T1CON

Autor: stephan_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wodurch soll denn der PIC wieder aufgeweckt werden? Durch den timer0 
sicher nicht, denn der ist während des SLEEP ausgeschaltet.

Autor: Dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

nein , er soll durch ein Signal am RB0 wieder aufgeweckt werden.

Danke für die Antwort

Autor: stephan_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie gelangt er in den Interrupt: auch durch RB0 (das vermute ich mal 
aufgrund der Programmierung des INTCON)?

Wie checkst Du, ob er überhaupt in den Interrupt gelangt. Checkst Du, ob 
er aus der Schleife
inter
   ...
   goto inter

herauskommt? (ich mache das immer mit diversen LEDs).

Noch ein paar Tips zur Lesbarkeit: Kommentare, Kommentare, Kommentare, 
sonst weisst Du in 3 Wochen nicht mehr, was Du Dir dabei gedacht hast 
(und wir sowieso nicht). Und schreib nicht  INTCON, 4  sondern INTCON, 
INTE  bzw. nicht  INTCON, 7  sondern INTCON, GIE, dann weiss man 
leichter, was sich hinter dem Bit verbirgt.

Autor: Dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja,

wenn der interrupt ausgelöst wird, springt er ja zu zeile 4.

das währe dieser part:


 org 4    ;interupt on/off routine
inter
  movf  TMR0,0  ;TMR0
  subwf  0x40,0
  BTFSS  STATUS,2
  goto  inter
  BCF  STATUS,2
  movlw  D'0'
  movwf  out              ; alle LED aus
  clrw
  clrf  TMR0
  BSF  INTCON,4         ;
  BSF  INTCON,7         ;interupt erlauben
  BCF  INTCON,0          ;flag zurücksetzen.
  sleep
  nop
  RETFIE
  nop
  goto  captime


hier werden dann alle ausgänge auf null gesetzt und der interrupt wieder 
erlaubt.

leider wacht er dann aber (nach signal an RBO) niht wieder auf. habe 
schon das manual gewälzt bin aber wohl zu blöd ihn aufzuwecken.

Werde mit eine andere schreibweise angwöhnen und die Kommentare mit 
posten ;-)

Mach ich das so richtig oder kannst du mir nen tip geben?

Autor: Dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja die erste schleife ist zum "entprellen des tasters" an RB0

nter
  movf  TMR0,0  ;TMR0
  subwf  0x40,0
  BTFSS  STATUS,2
  goto  inter
  BCF  STATUS,2

habe nen festen wert in 0x40 stehen den ich subtrahiere.

Autor: Rene B. (yob) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dixi,

der Interrupt wird aufjedenfall ausgelöst jedoch geht der 
Mikrocontroller in der Interrupt Routine selbst gleich wieder in den 
Sleep-Modus ohne das diese korrekt beendet wurde! Somit ist ein zweites 
Aufwecken schon unmöglich. Desweiteren ist nicht erkennbar wo deine 
Register gerettet werden, Die Initialisierung sieht auch sehr kurz aus 
und deine Leds im Programm angeschalten werden!

Mein Tip:

1. verwende die mitgelieferten zurgehörige INC-Datei in dieser stehen 
alle Registernamen, welcher der Registeradresse bereits zugeordnet sind. 
Dies erleichtert dir das programmieren erheblich und anderen die 
Kontrolle ebenso.
2. Immer den ganzen Programmcode posten, damit man Initialisierung, 
Eingabe, Verarbeitung und Ausgabe prüfen kann.
3. Ein kleine Beschreibung was genau das Programm tun soll ist immer gut 
;).

Hier findest alles was du brauchst um den Interrupt erfolgreich zu 
realisieren.

>>http://www.sprut.de/electronic/pic/int/int.htm

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Interrupt wird das GIE ausgeschaltet, und durch das RETFIE
wieder eingeschaltet. Man kann es natürlich wieder einschalten,
um z.B. nested interrupts zu realisiseren, wenn man sich genug auskennt,
bringt aber auch Problematiken mit sich.

Um es kurz zu machen, setz ein Flag und im Hauptprogramm, check das Flag
und gehe dann in Sleep, vom Hauptprogramm, aber nie von einem Interrupt,
denn normalerweise sind dann die Interrupts ausgeschalten, und der 
Prozessor
hat dann keine Möglichkeit mehr, nur mit Interrupts aufzuwachen, da 
diese
ja ausgeschalten wurden. Andererseits, wenn du sie vor dem Sleep wieder
einschaltest, dann hast du einen kaputten Return-Stack.
Also merk dir, SLEEP niemals !!! im Interrupt verwenden.

Autor: dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werd ich mal versuchen.

Melde dann erfolg oder misserfolg :-)

vielen dank

Autor: dixi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris schrieb:
> Also merk dir, SLEEP niemals !!! im Interrupt verwenden.



Top Tip.
 Läuft...

Vielen dank

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.