Stránka 1 z 2
Emulace bistabilního KO pomocí PIC
Napsal: 21 dub 2008, 00:14
od Kixx
Zdravím všechny.
Jsem v oblasti uProcesorů nováčkem.
Potřebuji sestrojit zařízení, jehož popis je níže. HW bych dal dohromady, ale SW nezvládnu.
Přesně vím, jak bych toto řešil např. s 555 (odběr cca 15-20mA), ale je tu požadavek napájení z baterií a dlouhé životnosti, tedy nutné použití uP a funkce Stand-by (1-5uA).
Obvod nejlépe s PIC, či jiným microprocesorem.
- využití módu SLEEP a Wake on pin change. (nutné pro úsporu energie pro napájení z BAT.)
Předpokládám využití obvodu se dvěma vstupy a jedním výstupem.
První vstup bude mít funkci nastavovací.
Druhý vstup bude mít funkci hlídací.
Výstup bude ativní v případě, že je obvod nastaven a následně aktivován vstup hlídací.
Je to vlastně obdoba bistabilního klopného obvodu
Podmínkou je reakce druhého vstupu na LOG0, případně nestandartní stav(mezi LOG0 a LOG1).
Další podmínkou je,že výstup zůstane aktivní při první změně vstupu 2 a žádná další, nebo opaovaná změna na tomto vstupu, výstup již nezmění.
Změna výstupu do LOG0 bude opětovným nastavením prvního vstupu.
Díky za jakoukoliv pomoc.
Napsal: 21 dub 2008, 06:01
od Stan3
A co použít 555ku v CMOS verzi?
Napsal: 21 dub 2008, 08:45
od mihal
podobne som riesil nahradu 555 s PIC10F200, zabral menej miesta na dps, mal neskonale mensiu spotrebu v sleep mode a bol lacnejsi - nakup asi 4.-kc/k. Ak nechces programovat tak sa poobzeraj na
www.ti.com po obvodoch "litle logic" maju tam mnozstvo funkcii za par centov.

Napsal: 21 dub 2008, 11:15
od ZdenekHQ
A co takhle 74HC75 ?
Napsal: 22 dub 2008, 12:23
od Kixx
to ZdenekHQ
Také jsem uvažoval o podobných obvodech, ale PIC má více zatížitelné výstupy. Pro jednodušší aplikace nemusím proto hlídat na výstupu každý mA, což bych musel u 74... posilovat. Dále mne láká ta spotřeba 1uA při spánku. Zařízení bude většinu času v neaktivním stavu... a teprve změnou na vstupu jej chci probudit a pak může mít krátkodobě větší odběr.
Pravda, 8uA u 74... také není k zahození, ale zpožďovací funkce budu muset řešit nějakými kapacitami, kdežto PIC by stačilo doprogramovat.
No, vzhledem k tomu, že programovat v ASM neumím, budu muset toto řešit klasickou cestou. Měl bych ale snahu se něčemu přiučit, stačí přinakopnout .
Díky i za takové rady.
Napsal: 22 dub 2008, 12:42
od ZdenekHQ
Já osobně taky raději veškerou složitější logiku v přístroji nahrazuju procesorem - jednak to zabere míň místa, jednak se dá jednoduše měnit logika. Jde pouze o to, jestli ten program píšeš 20 minut nebo týden...
Napsal: 22 dub 2008, 13:22
od jankop
74HC75 nemá paměť a jestli jsem dobře pochopil zadání, tak by se to s ní nedalo realizovat. 74HC74 už má odběr 40uA. Klidně ti program pro 10F200 napíšu, když mi upřesníš zadání.
Napsal: 22 dub 2008, 13:53
od Kixx
to Jankop.
Oh, díky velice za ochotu. Určitě upřesním a budu velkým vděčníkem

)
Ano, 74HC75 nemá paměť, ale právě zvolený obvod je ve své podstatě paměťí sám sobě. Vstupem D data "nahrát" (0,1) a pomocí LATCH, lze uvést obvod do výchozího stavu. Pro mne paměť

)
Musím dát za pravdu Zdenkovi, že tím končíme a pro další věci to chce trochu vyšší dívčí.
Budu tedy velice vděčen za nabídnutou pomoc. Zadání je na začátku tématu. Určitě jej dopřesním do emailu.
Díky mnohokráte..
Napsal: 22 dub 2008, 13:54
od ZdenekHQ
Co asi znamená slůvko
latch v popisu 7475
V pdf k SN7475 je hned na první stránce nahoře funkční tabulka.
Napsal: 22 dub 2008, 15:17
od jankop
Má paměť, nemá paměť.. Funkce je jasná. Jen mi není jasné, jak by s 74HC75 šla realizovat jednoduše požadovaná funkce, toť vše. Nejde to prostě udělat podle zadání.
Napsal: 22 dub 2008, 16:00
od ZdenekHQ
Když to tak čtu, tak bych to dokázal i s 4-5 hradly NAND .
Vstupní LOG0 se přenese na výstup pouze v případě, že je povoleno hlídání a zůstane tam - to jsou 2 hradla jako KO a další 2 jako "gate".
Reset bude způsoben sestupnou či náběžnou hranou (edited) řídícího vstupu přes derivační kondík do druhýho vstupu KO.
Pokud by bylo nutný vyhodnotit "mezistav" jako LOG0, přidat 1x komparátor.
Napsal: 22 dub 2008, 17:44
od jankop
Takhle nějak by vypadal program:
Kód: Vybrat vše
list p=10F200 ; list directive to define processor
#include <P10F200.INC> ; processor specific variable definitions
__CONFIG _WDT_OFF&_MCLRE_ON&_CP_OFF
;--------- CONSTANTS DEFINITIONS---------------------------------------
#define RAM_Start 0x10
#define MASK_Cal B'11111110'
#define PORT_Inp B'00001011'
#define FROM_W 0x06
;--------- VARIABLE DEFINITIONS ---------------------------------------
CBLOCK RAM_Start
TMP0
TMP1
TMP2
ENDC
;----------------------------------------------------------------------
ORG 0x00
andlw MASK_Cal
movwf OSCCAL ; kalibrace interniho oscilatoru
movlw 0<<NOT_GPWU|0<<NOT_GPPU|0<<T0CS
option ; nastaveni PullUp a WakeUp
movlw PORT_Inp ; nastaveni V/V portu
tris FROM_W ; nastaveni V/V portu
btfsc GPIO,GP0 ; test nastavovaciho vstupu GP0, 'H'=hlida, 'L'= reset
call active ; hlidani zapnuto, testuj vstup
btfss GPIO,GP0 ; test nastavovaciho vstupu GP0, 'H'=hlida, 'L'= reset
bcf GPIO,GP2 ; hlidani vypnuto, proved reset vystupu
movf GPIO,W
sleep
active
btfss GPIO,GP1 ; test hlidaciho vstupu 'H'=klid, 'L'= alarm
bsf GPIO,GP2 ; doslo k alarmu nastav vystup GP2 do 'H'
retlw 0x00
;org 0xff
;movlw B'10101010'
end
Napsal: 23 dub 2008, 10:52
od Kixx
to Jankop:
Díky moc, jsi nesmírně ochotný. Večer si to hodím na simulátor.
Nejlépe se totiž učí rozborem hotových věcí. Člověk se má čeho chytnout.
Mám pár dotazů, zda to chápu správně.
Řádek v podprogramu active:
"btfss GPIO,GP1 ; test hlidaciho vstupu 'H'=klid, 'L'= alarm"
pochopil jsem to tak, že když budu chtít obrátit logiku na 'L'=klid, 'H'= alarm, použiji instrukci BTFSC.
Mám dotaz k režimu SLEEP.
Někde jsem četl, že před přechodem do SLEEP je třeba načíst do paměti všechny stavy, aby nedocházelo k nedefinovaným stavům během spánku.
Jestli jsem to v dokumentaci někde přehlédel, ale nemohu to najít.
Předpokládám, že je to právě ta instrukce "movf GPIO,W".
Nevím jak, ale chtěl bych tam ještě zakomponovat časovač. Koukal jsem, že je tam Timer0, ale nevím jak jej použít. Vyčetl jsem nutnost nastavení v registru OPTION a intrukce pro registr TMR0. Je nutné současné hodnoty někam uložit do nějakého pomocného registru a pak vyvolat zpět? Další otazník zní, vrátí se po provedení časové fci zpět do hlavního programu na místo odkud odskočil, jak jsem to popsal níže, nebo začne vykonávat vše od začátku ?
Nebude spíše vhodnější použít nějakou inkrementaci registru ? Nějakým cyklem GOTO postupně provést 10.000.000 instrukcí ? Brr.
Funkce by měla být takováto:
Při nastavování může nastat situace, kdy bude i hlídací vstup v alarmu. Tento stav bych potřeboval oddálit o 10s. Potom by to vypadalo tak, že při nastavení GP0 bude na 1, bude zpožděné vykonávání dalších programů, včetně volání podprogramu active.
Nevím , jestli neuvažuji špatně z pohledu programování, ale představoval bych si to asi takto:
..
...
btfsc GPIO,GP0 ; test nastavovaciho vstupu GP0, 'H'=hlida, 'L'= reset
// zpožďovací fce
call active ; hlidani zapnuto, testuj vstup
...
..
Kixx
Napsal: 23 dub 2008, 20:47
od jankop
Pochopitelně, změnou BTFSC na BTFSS změníš logickou podmínku. Jen pozor, těch podmínek v programu může být několik, stejně jako v přiložené ukázce. Před aktivací Sleep s WakeUp od změny vstupů je nutné přečíst GPIO. Použití TMR0 není u tohoto procesoru moc účelné. Asi lepší je programová smyčka. Obecně bych řekl, že řada PIC 10FXXX není moc šťastná. I pro ta nejjednodušší použití je vhodnější 12F629, což už je plnohodnotný MCU se vším všudy včetně přerušení. Existuje i v mrňavé SMD verzi a stojí o cca 5-6Kč víc než 10F200.
Kód: Vybrat vše
list p=10F200 ; list directive to define processor
#include <P10F200.INC> ; processor specific variable definitions
__CONFIG _WDT_OFF&_MCLRE_ON&_CP_OFF
;--------- CONSTANTS DEFINITIONS---------------------------------------
#define RAM_Start 0x10
#define MASK_Cal B'11111110'
#define PORT_Inp B'00001011'
#define del_hi d'241' ; konstanta pro cca 10s
;--------- VARIABLE DEFINITIONS ---------------------------------------
CBLOCK RAM_Start
TMP0
TMP1
TMP2
OLDP
ENDC
;----------------------------------------------------------------------
ORG 0x00
andlw MASK_Cal
movwf OSCCAL ; kalibrace interniho oscilatoru
movlw 0<<NOT_GPWU|0<<NOT_GPPU|0<<T0CS
option ; nastaveni PullUp a WakeUp
movlw PORT_Inp ; nastaveni V/V portu
tris GPIO ; nastaveni V/V portu
btfss OLDP,GP0 ; test predchoziho stavu aktivacniho vstupu
call delay ; predchozi stav byl'L'=reset
btfsc GPIO,GP0 ; test aktivacniho vstupu GP0, 'L'=reset, 'H'= aktivace
call alarm ; aktivace zapnuta, testuj hlidaci vstup
btfss GPIO,GP0 ; test aktivacniho vstupu GP0, 'L'=reset, 'H'= aktivace
bcf GPIO,GP2 ; aktivace vypnuta, proved reset vystupu alarmu GP2 do 'L'
movf GPIO,W
movwf OLDP ; uloz stav portu
sleep ; prechod do rezimu SLEEP
;----------------------------------------------------------------------
alarm
btfss GPIO,GP1 ; test hlidaciho vstupu 'H'=klid, 'L'= alarm
bsf GPIO,GP2 ; doslo k alarmu nastav vystup GP2 do 'H'
retlw 0x00
;----------------------------------------------------------------------
delay ; prodleva, kdyz je alarm uz pri aktivaci
btfsc GPIO,GP1 ; test hlidaciho vstupu 'H'=klid, 'L'= alarm
retlw 0x00 ; neni alarm pri zapnuti hlidani
btfss GPIO,GP0 ; test aktivacniho vstupu GP0, 'L'=reset, 'H'= aktivace
retlw 0x00 ; neni aktivace
clrf TMP0 ; casovaci konstanta
clrf TMP1 ; casovaci konstanta
movlw del_hi ; casovaci konstanta
movwf TMP2
loop ; casovaci smycka
incf TMP0,F
btfsc STATUS,Z ;
incf TMP1,F ;
btfsc STATUS,Z
incf TMP2,F
btfsc STATUS,Z
retlw 0x00 ; ukonceni casovaciho intervalu
btfss GPIO,GP0 ; test aktivacniho vstupu GP0, 'L'=reset, 'H'= aktivace
retlw 0x00 ; ukonceni delay pri prepnuti na reset
goto loop
end
Napsal: 15 kvě 2008, 01:00
od Kixx
Zdravím všechny.
Po delší pauze jsem se dostal k simulaci napsaných programů Jankopem.
Mám sw simulátor od Oshonsoft pro PIC10F. Narazil jsem na jeden problém a třeba budete někdo vědět co s tím. Při vykonávání programu vše běží jak má a dokonce se zastaví při SLEEP. Bohužel už nejde v simulaci dále pokračovat (změnou na "vstupu" probudit), protože se simulace zastaví úplně a lze ji pouze spustit od začátku.
Tento program se mi velice líbí, dá se zde hezky pochopit práce vlastního procesoru, ale zrovna zde (sleep) to bude asi neřešitelné.
Dokonce bych klesl tak hluboko, že si tento program koupím..... no řekněte €15.00 , nekupte to
Asi budu muset obvod postavit a testovat přímo. Ještě silně zvažuji zakoupení programátoru PICKIT-2DE a odladit aplikaci i takto. Ne že bych nezvládl postavit programátor, ale málo jich podporuje zrovna PIC10Fxxx a za čas co bych strávil prací nad tím si vydělám na již zmíněný debuger
to Jankop: kdysi jsi nabízel nějakému Brňákovi programátor ICD2 za pětikilo. Už jsi jej prodal, nebo bude pro mne lepší ten PICKIT ?