PIC 16F88 wacht aus SLEEP durch TIMER1 nicht auf
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Timer (Assembler)  |  PIC 16F88 wacht aus SLEEP durch TIMER1 nicht auf « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: PIC 16F88 wacht aus SLEEP durch TIMER1 nicht auf  (Gelesen 2180 mal)
 
Stephan
Jr. Member
**
Offline Offline

Beiträge: 88


Profil anzeigen
« am: Januar 10, 2010, 13:12:38 »

Moin allerseits,

mein PIC 16F88 soll durch TIMER1 aus einem SLEEP-Befehl geweckt werden. Genau das passiert aber nicht, er schläft weiter. Im angehängten Beispiel geht die LED an, aber nicht mehr aus. Obwohl laut Datenblatt das GIE-Bit nicht gesetzt werden muss, habe ich auch eine Version damit sowie mit dem PEIE-Bit durchgespielt, immer das gleiche.

Vorab schon mal "Danke".
Stephan

* timer1_88.asm (2.83 KB - runtergeladen 102 Mal.)
Gespeichert
Stephan
Jr. Member
**
Offline Offline

Beiträge: 88


Profil anzeigen
« Antworten #1 am: Januar 10, 2010, 16:29:38 »

Habe das Problem selbst gelöst. TIMER1 kann im Timer-Modus einen SLEEP-Befehl nicht beenden, nur im Counter-Modus. Also einen 32.768-Quarz und 2x 27pF-Kondensatoren an RB6 und RB7 und den Timer 1 anders konfiguriert. Nach quarzgenauen 16 Sekunden ist SLEEP beendet (16 Sekunden: 32.768kHz, Vorteiler 8, Timer1 mit 0x00 und 0x00 = 65536 vorbesetzt).

Code: (asm)
; Timer 1 einstellen
bank0
    clrf T1CON            ; T1CON erst mal rücksetzen
    bsf T1CON, TMR1CS     ; Takt extern
    bsf T1CON, T1CKPS0    ; 11 = prescaler=1/8
    bsf T1CON, T1CKPS1    ;
    bsf T1CON, NOT_T1SYNC ; Timer 1 nicht snchronisiert
    bsf T1CON, T1OSCEN    ; Timer 1 Oscill. ist an
« Letzte Änderung: Januar 10, 2010, 16:47:42 von Stephan » Gespeichert
stevelmckneevel
Gast
« Antworten #2 am: Januar 12, 2010, 08:50:56 »

Hallo zusammen,
Ich habe auch das Problem, dass mein PIC 16F88 durch timer1 nicht aus dem sleep aufwacht.
Er tut dies nur, wenn ich vorher den Systemtakt mit Hilfe des OSCCON <1:0> Registers ändere.
Das Problem ist hier aber, dass bei clock switching am Übergang von Clock1 zu Clock2 Verzögerungen
auftreten, bis der Takt sicher anliegt.
Würde das Ganze gern ohne Clock switching machen; funktioniert aber nicht.
Sollte ja eigentlich auch funktionieren, wenn ich
T1RUN=1;
OSCCON=0x05;
weglasse. Tut es aber nicht.
Danke schon mal und schönen Tag noch

Hier mein CODE
      
PEIE=1;
TMR1IE=1;   
T1CON=0x0E;
TMR1H=0xC0;TMR1L=0x2C;         //Timer für 500ms vorladen
TMR1IF =0;
GIE=0;               //Globaler Interrupt aus=>tritt nicht in isr ein
TMR1ON=1;
T1RUN=1;
OSCCON=0x05;            //Systemclock umschalten                 #asm                                                                                        sleep                                       
nop
#endasm      
Gespeichert
meimei
Gast
« Antworten #3 am: Januar 12, 2010, 13:14:13 »

Der Timer 1 läuft über unabhängig davon, wie der Oszillator läuft, clock switching ist also nicht nötig. Wenn Timer 1 nicht überläuft, dann hat der Timer ein Problem: zur Beendigung des SLEEP-Befehles muss er als asynchroner Zähler (nicht Timer!) konfiguriert sein (siehe Datenblatt 18F88 S.146) und es müssen natürlich an RB7 Impulse reinkommen (z.B. dadurch, dass zwischen RB7 und RB6 ein Quarz mit 32.768 kHz hängt oder an RB7 ein externer Quarzoszillator - max im kHz-Bereich hängt). Siehe Beitrag von Stephan weiter oben.

Nach dem SLEEP sollte ein NOP stehen, da der Prozessor beim Beginn des SLEEP-Befehls den nächsten Befehl schon mal holt und lädt und dann die Verzweigung zum Interrupt problematisch sein kann.

T1RUN darfst Du übrigens nicht setzen, da dann der Systemclock vom Timer kommt und nicht von Deinem Sytemquarz.
Gespeichert
meimei
Gast
« Antworten #4 am: Januar 12, 2010, 13:19:41 »

Korrektur: der Eingang für Timer 1 ist natürlich RB6 und nicht RB7
Gespeichert
stevelmckneevel
Gast
« Antworten #5 am: Januar 12, 2010, 14:36:19 »

Hallo nochmal,
Danke schon mal für die Antwort, sie bringt mich aber nicht unbedingt weiter.
ich habe jetzt wirklich schon alles versucht und mein PIC wacht jetzt zwar auf, allerdings sehr unregelmäßig ca. alle 10sek. Da ich aber einen 32kHZ Quarz ohne Vorteiler benutze kann dieser Wake up nicht von Timer1 kommen. Watchdog ist ausgeschalten, In circuit debugging ist aus, alle peripheren Bauteile sind ausgeschalten. Hat jemand eine Idee, warum der PIC so unrgelmäßig aufwacht, bzw. warum er nicht von Timer1 geweckt wird.
Mein Code:
hier sollte eigentlich der Timer den PIC nach 500ms aufwecken, tut er aber nicht.

INTCON=0x00;
PIE1=0x00;
TMR1IE=1;          
GIE=1;
PEIE=1;         
TMR1H=0xC0;
TMR1L=0x00;
T1CON=0x0F;
Delay100us(50);   
   #asm                                             sleep                                 
nop
#endasm   

Danke schonmal
Gespeichert
stevelmckneevel
Gast
« Antworten #6 am: Januar 12, 2010, 15:09:05 »

Hallo,
Problem ist gelöst. Habe den PIC ersetzt und es funktioniert jetzt.
Mfg
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.039 Sekunden mit 19 Zugriffen.
 
Top! Top!