dotaz modeláře

icalan
Příspěvky: 8
Registrován: 29 říj 2018, 11:39

dotaz modeláře

Příspěvek od icalan »

Dobrý den, ve svých modelech používám delší dobu jako řídící člen picaxe, programuji si je sám v rámci znalostí, které pochopím z porůznu nalezených příkladů. Bohužel mám problém pochopit programování pro ovládání posuvného registru 4094 ( řady posuvných registrů, kde výstupy Qx spínají tranzistory) v současné chvíli mám program ve stavu kdy v proměnné bx je číslo které určuje změnu na 4094 ( desítky a stovky = Qx, a jednotky / 0= vypnuté, 1=zapnuté/) na picaxe C.3 clok a C.4 data, dekuji predem za vysvětlení.
DavidO
Příspěvky: 1020
Registrován: 01 kvě 2013, 21:27

Re: dotaz modeláře

Příspěvek od DavidO »

Začnu teorií:

4094 je přesněji řečeno posuvný a k tomu paměťový registr a chová se podle těchto pravidel:
1. vždy, když na jeho vstup CP (clock pulse) pošleš impuls, tak se v jeho posuvném registru data posunou o jeden bit, tj. ten co tam přišel nejdřív (Q7), bude zapomenut, Q6 se posune na Q7 atd. a do Q0 zezadu vleze bit, který je zrovna na vstupu D (0 nebo 1).
2. kdykoli je vstup STR (strobe) v log. 1 (high), data se z posuvného registru uloží do paměťového registru.
3. když je vstup OE (output enable) v log. 1, data uložená v paměťovém registru se zobrazují na výstupu (když je na log. 0 (low), tak jsou výstupy odpojené (ve stavu vysoké impedance)

Standardní použití je, že když si vymyslíš, co chceš do celého toho osmibitového registru dostat, tak postupně pro každý bit tenhle bit dáš na jeho vstup D, hodinama CP tikneš nahoru a dolů a když to tam je všechno, tak tikneš STR nahoru a dolů a pak OE nastavíš na 1. Tím se výstupy změní skokově všechny najednou. Je to ale možné udělat i tak, že trvale máš STR a OE na vysoké úrovni, takže to pořád ukazuje stav toho vstupního posuvného registru a tedy když tam sypeš ty bity, tak postupně na výstupu cestujou při každém tiknutí hodinama (kdyby tam byly připojené LED, tak s každým tiknutím hodinama se to celé posune o jednu LED).

A teď praxe:
Netuším, jak vypadá tvůj program, napsal jsi jen málo, ale jestli to je tak, že máš někde připravený celý bajt, tak baj voko takhle (val obsahuje ten bajt):

Kód: Vybrat vše

for i = 1 to 8
  symbol val = b13
  symbol temp = b12
  symbol i = b11
  symbol CP = C.3
  symbol D = C.4
  symbol STR = nevimco
  symbol OE = nevimco
  for i = 1 to 8
    temp = val & %00000001
    if temp = 1 then HIGH D
    else LOW D
    endif
    pulsout CP,1 
    val = val / 2 
  next i
  pulsout STR,1 
  HIGH OE
(STR a OE buď máš připojené k Picaxe, pak si to nevímco nahraď tyvíščím, anebo je nemáš připojené k Picaxe, pak je připoj k Vcc a tady v programu pak nemusíš mít ty pulsout CP a STR a vypadne i jejich deklarace před cyklem)

A jestli si to chystáš po jednotlivých bitech nějakým rozhodováním, tak bych si na to udělal podprogram, kterému pošleš 0 nebo 1 a on tam tenhle jeden bit strčí (v podprogramu bude if + pulsout co jsou uvnitř for cyklu) a pan na závěr tikneš STR a OE:

Kód: Vybrat vše

main:
  ....
  if ňákejtestjestlitomásvítit then 
    gosub tik1
  else
    gosub tik0
  endif
  .....
  gosub zobraz
  goto main

tik0:
  LOW D
  pulsout CP,1 
  return
tik1:
  HIGH D
  pulsout CP,1 
  return  
zobraz:
  pulsout STR,1 
  HIGH OE
  return
(kdyžtam sem dej ten program, co máš rozpracovaný, a nějak ho společnýma silama upravíme)
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1313
Registrován: 16 úno 2013, 14:26

Re: dotaz modeláře

Příspěvek od Dex »

Nic proti posuvným registrům, ale nebylo by zrovna na tohle šikovné použít spíš něco jako PCF8574? I když vlastně nevíme, k čemu se to používá.
"all your robots are belong to us"
robodoupe.cz | rxd.cz | codetory.cz
DavidO
Příspěvky: 1020
Registrován: 01 kvě 2013, 21:27

Re: dotaz modeláře

Příspěvek od DavidO »

Taky nevím, k čemu to přesně v tomhle případě je, ale v principu bych ten posuvný registr vůbec nezatracoval: Natikat bity po drátě ven do posuvného registru anebo zapsat po i2c není sice na nejnižší úrovni ideově velký rozdíl, akorát na i2c musíš mít start, adresu, ack, data, ack, stop a ošetřování chyb atd. Pak taky konkrétně 4094 bude rychlejší než PCF8574, protože u PCF jsou i2c hodiny na 100 kHz, zatímco do toho shift registru to můžeš tlačit s hodinama na řádově desítkách MHz, jestli se pamatuju dobře (ale to se na Picaxe tak moc drtivě neprojeví, jsou tam kromě pulsout další příkazy a je to interpretované, takže řádově pomalejší, než kdyby to bylo na holém železe). Navíc ještě u i2c musíš přenést tu adresu a těch pár věcí okolo, takže na i2c máš 1b start + 8b adresy + 1b ack + 8b dat + 1b ack + stop, čili 20 tiků po i2c místo 8 tiků na posun datových bitů + 1 na STR a 1 na OE pro shift registr (pokud jeden nebo oba nemáš trvale nahoře), čili 8 až 10, tj. i2c přenáší 2 až 2,5x víc bitů. A taky ty posuvné registry můžeš řetězit a změní se to jen v počtu vysypávaných bitů zase na rozdíl od i2c, kde musíš přidávat další adresy pro další PCF. A taky třeba ten shift register máš v šuplíku a/nebo ho používá projekt, který jsi převzal nebo kterým se inspiruješ. Zas z hlediska programátora vypadá to vypsání po i2c jednodušejc, protože to pošleš jedním příkazem, zatímco ten posuv si musíš rozepsat.

A jestli to je světelný had, tak posuvný registr je z hlediska výsledného efektu zjevně drtivě lepší, než nějakej sofistikovanej i2c port expander ;)
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1313
Registrován: 16 úno 2013, 14:26

Re: dotaz modeláře

Příspěvek od Dex »

Však jsem psal "nic proti posuvným registrům" ;)

Ten expandér šlape na 400 kHz což je dostatečné na spoustu věcí. Určitě bude internet plný příkladů, jak ho použít s PICAXE, takže to stačí vzít a použít. Navíc pro plno lidí je jednodušší si to představit tak, že na tuhle adresu potřebuju poslat tenhle bajt a na tuhle zase tenhle.

Šlo mi spíše o to, jestli tazatel o možnosti vyřešit to přes expandér vůbec ví, toť vše ;)

EDIT: tak PCF8574 je opravdu jen na 100 kHz, PCA8574 už je ale na 400 kHz
"all your robots are belong to us"
robodoupe.cz | rxd.cz | codetory.cz
icalan
Příspěvky: 8
Registrován: 29 říj 2018, 11:39

Re: dotaz modeláře

Příspěvek od icalan »

princip posuvných registrů chápu a líbí se mi že jich může být vice za sebou, spíše mam problém s programováním piaxe. Na c.1 a c.2 mám propojené dva kanály RC , str a oe na Vcc
Zacatek:
pulsin c1,1,w1 ;načtení pulzu co který byt se zapne - vypne
pulsin c2,1,w2 ;načtení hodnoty( méně než101 zapnuto, vice než 199 vypnuto)
if w1 =dané číslo then b27 = číslo(např 220) ;
.
.
.
ifw1=xy then b27 = yx
if w2 < 101 then b26=b27+1
if w2 > 199 then b26=b27
if w2 >101 and <199 then goto Zacatek

s většinou programů mi pomáhal mladší kolega v práci (opravoval, případně vysvětlil co jsem potřeboval), bohužel jej skolil coronavirus.
DavidO
Příspěvky: 1020
Registrován: 01 kvě 2013, 21:27

Re: dotaz modeláře

Příspěvek od DavidO »

Té aplikační logice musím přiznat nerozumím. Mohl bys to prosímtě popsat slovy, co to vlastně celé má dělat? A nejlíp ještě přidat celý program?
DavidO
Příspěvky: 1020
Registrován: 01 kvě 2013, 21:27

Re: dotaz modeláře

Příspěvek od DavidO »

Dex píše: 24 pro 2020, 21:43 Však jsem psal "nic proti posuvným registrům" ;)
... ale to obvykle znamená "posuvné registry nemám rád", tak mě nemať :lol:
icalan
Příspěvky: 8
Registrován: 29 říj 2018, 11:39

Re: dotaz modeláře

Příspěvek od icalan »

No já to mám namyšlené asi takto na RC vysílači předposlední kanál má na potenciometru aretaci.a poslední má přepínač 5 poloh . Picaxe je snímá pomocí pulz in na C.1 a C.2 první kanál určuje která věc se bude ovládat a druhým ovladam z tohoto generuji do proměnné číslo operace - úkonu - příkazu a každý výstup má dané na které číslo a jakým způsobem má zareagovat. Ovládání periferií modelu bych rád rozšířil, jednou z možností je odpojit osvětlení z C.3/4 a na tento výstup z proměnné generovat pulz číslo operace a dalším picaxe které to bude stejným způsobem zpracovávat, nebo řešit to posuvným registrem 4094, což se mi na první pohled zdálo jednodušší.
DavidO
Příspěvky: 1020
Registrován: 01 kvě 2013, 21:27

Re: dotaz modeláře

Příspěvek od DavidO »

Takže předposlední kanál s potenciometrem říká, kterou periferii modelu budeš teď nastavovat, a poslední kanál s přepínačem říká jednu z pěti předvoleb ("možností") pro tuhle konkrétní periferii? Ten potenciometr říká, který bit výstupu posuvného registru nastavuju a přepínač říká, jako má mít hodnotu, jestli 0 nebo 1?
Co je vlastně připojené na jednotlivé výstupy toho posuvného registru? A jak se to používá? Nastavím potenciometr někam, zaaretuju, zatočím přepínačem? Nebo jinak? A jak se pozná, že chci nastavovat zas něco jiného, ono to vysílá jen na explicitní povel?
Takhle nasucho si neumím tu tvoji konkrétní věc dobře představit. Je to éro, auto, domeček, vláček, tank, ponorka? Kolik věcí a jak moc tam ovládáš? A to ovládání je průběžné, nebo to jednou nějak nastavíš a pak se to dlouho používá přes ostatní RC kanály?

(promiň, nejsem modelář a RC soupravy nepoužívám, takže mi to není moc jasné. Ale zní to tak, jako že chceš vytvořit nějaký jednosměrný komunikační protokol za pomoci dvou kanálů RC soupravy, a to si myslím zdaleka nebudeš první, takže to už nejspíš je nějak dávno vyřešené)
Odpovědět