PIC režim SLEEP

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
sewerman_cz
Příspěvky: 289
Registrován: 13 úno 2011, 00:00
Bydliště: Brno
Kontaktovat uživatele:

PIC režim SLEEP

#1 Příspěvek od sewerman_cz »

Učím se programovat PIC v asm.
A narazil jsem na zajímavý problém na PIV 16F630 jsem udělal jednoduchý program kde se pomocí přerušení přepíní 7 podprogramů blikání 10 x led.
Osmý program uspává mcu a po dlouhém stisku tlačítka na RA5 mcu probudí a začne od programu 1.
Když jse zkoušel měřit spotřebu tak my měřák po uspání ukázal 0 mikroA, po krátkém stisku (po kterém by se mcu měl znovu uspat) už je spotřeba cca 600 mikroA.
Je to normální chování nebo je chyba v kódu?

Kód: Vybrat vše

PROG8
   movlw    0x00        ; vypnutí všech led
   MOVWF   PORTC          ; a přesunutí na PORT C
   MOVWF   PORTA          ; a přesunutí na PORT A
USPANI
    BCF      INTCON,GIE            ;zakázání všech přerušení
   SLEEP                   ; přepne procesor do režimu SLEEP
    CALL      DELAY1         ;čekací smyčka pro kontrolu dlouhého stisku
    CALL      DELAY1         ;čekací smyčka pro kontrolu dlouhého stisku
    BTFSC      PORTA,5          ;kontrola zda je opravdu stisknuto tlačítko
   GOTO      USPANI        ;pokud je na RA5 log 1 (není stisknuto) uspi
    BSF      INTCON,GIE            ;povolení všech přerušení
   MOVLW     0x01          ;pokud byl probuzen
   MOVWF     PROGRAM        ;skok na první program
   GOTO   PROG1
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#2 Příspěvek od procesor »

Hm, nevidím inicializáciu a isr, ťažko povedať čo to robí iba z takéhoto úryvku.
Najlepšie dať celý zdroj. Zrejme si to lieta kade sa mu chce.

Tlačidlo RA5 pripájaš na VSS/VDD?
Uživatelský avatar
sewerman_cz
Příspěvky: 289
Registrován: 13 úno 2011, 00:00
Bydliště: Brno
Kontaktovat uživatele:

#3 Příspěvek od sewerman_cz »

NA RA5 je nopojený interní pullup a tlačítkem se připojuje na VSS.

Inicializace a přerušení:

Kód: Vybrat vše

; === OBSLUHA PŘERUŠENÍ ===  
    ORG     0x004             ; nastavení vektoru přerušení
      movwf   w_temp            ; uložení aktuálního hotnoty registru W do w_temp
      swapf   STATUS,w            ; přesun registru STATUS do registru W
      movwf   status_temp         ; záloha registru STATUS
    BCF STATUS,RP0            ;banka 0 nezávisle na aktuální bance
   
    BCF      INTCON,GIE            ;zakázání všech přerušení (po návratu z přerušení se nastaví samo zpět)
      
; kontrola zda je opravdu stisknuto tlačítko
     CALL    DELAY02          ; čekací smyčka (odstranění zákmitů tlačítka)
    BTFSC      PORTA,5         ;kontrola zda je opravdu stisknuto tlačítko
      GOTO      PRERUS_KON   ;pokud je na RA5 log 1 ukonči přerušení
      BCF      STATUS,C
      RLF        PROGRAM,1      ;pokud je na RA5 log 0 přičte jedničku do proměnné program
   
   
PRERUS_KON
    BCF      INTCON,RAIF            ;smazání příznaku přerušení
      swapf    status_temp      ; přesun zálohy registru
      movwf   STATUS              ; zpět do registru STATUS
      swapf   w_temp,f          ; přesun záohy registru W do f
      swapf   w_temp,w          ; a uložení do restru W
      retfie                    ; návrat z přerušení 
 
MAIN     
; Inicializace portů             
   BCF      STATUS,RP0   ; výběr banky 0
   CLRF   PORTA      ; inicializace PORTA
   CLRF   PORTC      ; inicializace PORTB
;   movlw    05h       ;konfigurace RA2-RA0
;   movwf    CMCON       ;jako digitální vstupy/výstupy
   BSF      STATUS,RP0   ; výběr banky 1
   MOVLW   B'11101000'   ; nastavení piny RA <0,1,2,4> jako výstupy
   MOVWF   TRISA      ; přesun f do W
   BCF    OPTION_REG,7   ; povolení pull-up
   BSF      WPUA,5     ; nastavení RA5 Pull-up rezistor
  BSF      IOCA,5     ; nastavení povolení přerušení na portu RA5
   CLRF   TRISC      ; Piny RC<5:0> jako výstupy
; Nastavení přerušení
   MOVLW   b'10001000'
   MOVWF   INTCON         ; povoleno přerušení pouze od PORT A
    BCF      STATUS, RP0      ; výběr banky 0
Uživatelský avatar
Niki31
Zablokován
Zablokován
Příspěvky: 131
Registrován: 05 črc 2008, 00:00

#4 Příspěvek od Niki31 »

Mas to nejake rozsypane a poprehadzovane.Vytrhnute z kontextu.
Tak iba niekolko postrehov narichlo:

-Mas hrozny styl,miesas velke a male pismena.
-Inicializacia portov sa musi vykonat na zaciatku programu a nie
v hlavnej slucke.To sa potom stale dokola inicializuje.
-Init portov je lepsie zacat nast. registrov tris a az potom vkladat hodnoty
do portov.
-Ovplyvnujes priznaky v registri STATUS,to netreba(mimo obnovy po
preuseni) bolo to asi na riadku 16. Priznaky sa nastavuju automaticky
-Na riadku 17 je pripocitavanie pomocou instr. RLF ,ta vykona len posun
do lava,co je vlastne nasobenie dvoma nie sucet.Ak chces zvysit
obsah reg. o 1 pouzij instrukciu INCF reg. .
- ... atd.
Tolko v skratke.
Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 00:00
Bydliště: Vysočina

#5 Příspěvek od Chenzee »

No a uC vykonává co má nebo ne? Řešíš spotřebu uC nebo nefunkčnost programu?
Žádnej učenej z nebe nespadl ...
Uživatelský avatar
sewerman_cz
Příspěvky: 289
Registrován: 13 úno 2011, 00:00
Bydliště: Brno
Kontaktovat uživatele:

#6 Příspěvek od sewerman_cz »

Jde o můj první projekt, který je trochu poslepovaný z různých studijních materiálů (proto ty malé a velké písmena).
Inicializaci mám sice v hlavní smyčce ale inicializuje se pouze po restartu ...
...
Děkuji za připomínky a v příštím projektu se polepším :-)

Program je však plně funkční šlo mi pouze o tu spotřebu v režimu SLEEP.

Díky za reakce.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#7 Příspěvek od procesor »

Iba k RAIF...to sa s BCF INTCON, RAIF nedá zmeniť.
Na to sa musí použiť prečítanie PORTA
Uživatelský avatar
sewerman_cz
Příspěvky: 289
Registrován: 13 úno 2011, 00:00
Bydliště: Brno
Kontaktovat uživatele:

#8 Příspěvek od sewerman_cz »

Vycházel jsem z popisu v datasheetu

Přerušení změnou stavu na vstupu

...V obslužné rutině přerušení musí uživatel ukončit žádost
o přerušení následujícím způsobem:
a) Provést jakékoli čtení nebo zápis do registru PORTA. Tím dojde k ukončení změnového stavu, který generuje žádost o přerušení.
b) Nulovat příznak přerušení RAIF.
Pokud nedojde po detekované změně úrovně na bráně PortA k uvedené proceduře, změnový stav neustále nastavuje příznak přerušení
RAIF a jeho nulování nezpůsobí jeho trvalé uvedení do stavu log.0.
Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 00:00
Bydliště: Vysočina

#9 Příspěvek od Chenzee »

no a hned bod a)
Žádnej učenej z nebe nespadl ...
Uživatelský avatar
sewerman_cz
Příspěvky: 289
Registrován: 13 úno 2011, 00:00
Bydliště: Brno
Kontaktovat uživatele:

#10 Příspěvek od sewerman_cz »

Já jsem to pochopil, že musím udělat a) i b).
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#11 Příspěvek od procesor »

Zrušiť RAIF sa dá iba s vygenerovaním RDPORTA.
V obsluhe mi chýba "dobré" spracovanie nabežnej a dobežnej hrany RA5 a filtrovanie zákmitov. Na to filtrovanie by som použil čas a 100 ms.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#12 Příspěvek od Andrea »

procesor píše:Zrušiť RAIF sa dá iba s vygenerovaním RDPORTA.

A instrukce BTFSC PORTA,5 to neprovede?
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#13 Příspěvek od procesor »

Však píšem... vygenerovať RDPORTA...
...to je signál, ktorým sa otvorí port A na vnútorný databus,
takže RAIF by sa resetol aj pri inštrukcii BTFSC PORTA,0
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#14 Příspěvek od Andrea »

Tak co se ti teda na tom programu nelíbí?
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#15 Příspěvek od procesor »

Kód: Vybrat vše

BCF      INTCON,RAIF            ;smazání příznaku přerušení 


iba táto instrukcia
a počas režimu mimo SLEEP neošetrený-ošetrený druhý interrupt pri pustení tlačidla
a že to bude so zákmitmi aj na konci tlačidla.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“