Emulace bistabilního KO pomocí PIC

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

Moderátor: Moderátoři

Zpráva
Autor
Kixx

Emulace bistabilního KO pomocí PIC

#1 Příspěvek 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.
Stan3

#2 Příspěvek od Stan3 »

A co použít 555ku v CMOS verzi?
Uživatelský avatar
mihal
Příspěvky: 1844
Registrován: 06 dub 2005, 00:00
Bydliště: Zilina

#3 Příspěvek 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. :wink:
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#4 Příspěvek od ZdenekHQ »

A co takhle 74HC75 ?
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Kixx

#5 Příspěvek 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.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#6 Příspěvek 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...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#7 Příspěvek 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í.
Kixx

#8 Příspěvek od Kixx »

to Jankop.
Oh, díky velice za ochotu. Určitě upřesním a budu velkým vděčníkem :o)
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ěť :o)
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..
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#9 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#10 Příspěvek 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í.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#11 Příspěvek 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.
Naposledy upravil(a) ZdenekHQ dne 22 dub 2008, 17:49, celkem upraveno 1 x.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#12 Příspěvek 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
Uživatelský avatar
Kixx
Příspěvky: 4
Registrován: 22 dub 2008, 00:00

#13 Příspěvek 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
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#14 Příspěvek 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

Uživatelský avatar
Kixx
Příspěvky: 4
Registrován: 22 dub 2008, 00:00

#15 Příspěvek 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 :D

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 :lol:

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 ?
Odpovědět

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