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.