Stránka 1 z 2

PIC režim SLEEP

Napsal: 06 čer 2012, 23:35
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

Napsal: 07 čer 2012, 01:45
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?

Napsal: 07 čer 2012, 07:13
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

Napsal: 07 čer 2012, 21:42
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.

Napsal: 08 čer 2012, 04:56
od Chenzee
No a uC vykonává co má nebo ne? Řešíš spotřebu uC nebo nefunkčnost programu?

Napsal: 08 čer 2012, 07:30
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.

Napsal: 08 čer 2012, 07:46
od procesor
Iba k RAIF...to sa s BCF INTCON, RAIF nedá zmeniť.
Na to sa musí použiť prečítanie PORTA

Napsal: 08 čer 2012, 09:14
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.

Napsal: 08 čer 2012, 11:05
od Chenzee
no a hned bod a)

Napsal: 08 čer 2012, 11:29
od sewerman_cz
Já jsem to pochopil, že musím udělat a) i b).

Napsal: 10 čer 2012, 09:35
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.

Napsal: 10 čer 2012, 10:39
od Andrea
procesor píše:Zrušiť RAIF sa dá iba s vygenerovaním RDPORTA.

A instrukce BTFSC PORTA,5 to neprovede?

Napsal: 10 čer 2012, 20:37
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

Napsal: 10 čer 2012, 21:15
od Andrea
Tak co se ti teda na tom programu nelíbí?

Napsal: 10 čer 2012, 21:40
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.