Stránka 1 z 2

PIC16F628A

Napsal: 01 úno 2012, 01:38
od frantajetel11
Zdravím včechny bastlíře a bastlířku
Programuju takovej "hlásič" a potřeboval bych, aby měl tyto fce:
1) tři nezávislé vstupy (optočlen)
2) dva jumpery
3) tři výstupy jsou relé a jeden bzučák
Mělo by to dělat to, že pokud třeba na vstup1 přijde log.0, tak má x krát "bliknout" relé1 a zároveň x krát bzučák, potom bzučák přestane bzučet a relé zůstane sepnuté, dokud bude na vstupu log.0, po přivedení log.1 vypne . To samé na zbylých vstupech
4) počet x bliknutí se přepíná těma jumperama, takže tam jsou 4 možnosti

Programuju to v assembleru a nějak se do toho pořád zamotávám.
V příloze je ten můj patvar... je tam 100%spousta kopanců, protože se mi z kraje vůbec nedařilo to rozběhat s tímhle procesorem. Tak mě prosím nekamenujte hned.
Pokud by mi někdo byl schopen poradit, tak mu budu nesmírně zavázán.
Děkuji za odpověď

Napsal: 01 úno 2012, 04:31
od Chenzee
Zdarec, na první letmý pohled: co očekáváš od MAIN02 a co očekáváš od BLPIP části BTFSC IN1;NOP;BCF RELE1 ... BCF BUZZ? Krokoval jsi ten program? Počítáš se zákmity na vstupu?

Napsal: 01 úno 2012, 09:01
od frantajetel11
No já nevim, jestli jsem se nevydal blbym směrem... Spíš bych potřeboval poradit rutinu, která po aktivaci vstupu, párkrát sepne výstup (to párkrát umim) a pak ho nechá zapnutej a někde čeká na změnu (to nějak ještě neumim). Zákmity na vstupu jsem zatím neřešil, protože tam jsou optočleny, ale možná je bude potřeba vyřešit taky. Já to sem dal, jenom spíš na orientaci. Určitě by to celý šlo vyřešit jednoduššeji, ale jelikož jsem začátečník, tak bych spíš potřeboval nakopnout správnym směrem.
Díky
P.S. blpip, znamená blik+píp

Napsal: 01 úno 2012, 11:18
od Chenzee
OK, nejprve odpověz na moje otázky. 1) co očekáváš, že MAIN02 a BLPIP bude dělat nebo co mají dělat? 2) v čem program píšeš (MPLAB?) 3) optočlen myslím neřeší problém se zákmity ale zprvu to nebudeme řešit (třeba to ani nebude nutné) Pokusíme se zjistit, co je na tvém programu špatně a možná tím dojdeme k funkčnímu a očekávanému konci. Třeba taky dojdeme do (_._) (no ale to snad ne :-))

Napsal: 01 úno 2012, 11:52
od Chenzee
Musí být aktivní vždy a pouze jeden výstup nebo i více výstupů najednou? Když zmizí log. 0 na vstupu dříve, než se dobliká výstupem, má se blikání přerušit nebo dokončit? Jak rychle mají výstupy blikat? Bzučák bude pouze piezoměnič nebo přímo sirénka? Kolik těch bliknutí má být? Já jen aby bylo jasné zadání.

Napsal: 01 úno 2012, 12:08
od frantajetel11
Píšu to v mplabu, main2 blpip tam třeba ani nemusej bejt, vstupy by měly bejt na sobě nezávislý a může jich bejt aktivních víc najednou. Nikdy ale nesepnou ve stejnou dobu, takže vždycky ten co bliká stačí doblikat. Bzučák je sirénka. A pípání/blikání bude ON 1S, OFF 0,5S. Když zmizí log.0 ze vstupu, tak příslušnej výstup vypne hned.
P.S. omlouvám se, že reaguju zpožděně, jsem v práci :? A tohle je domu

Napsal: 01 úno 2012, 13:32
od frantajetel11
Ještě doplním: těch bliknutí/pípnutí bude podle dvou jumperů - 3, 10, 30, 90 blikpípů.

Napsal: 01 úno 2012, 19:09
od frpr666
ahoj,
předně skládám klobouk dolů, že jsi se pustil do kombinace PIC a asm. Tedy poměrně složitá kombinace. Podíval jsem se na tvůj .asm, nepřemýšlel jsem nad vším, ale napadly mě tyto věci:

1/ správně máš nekonečnou smyčku - což je podstata programu pro uC.
2/ chybí mě tam proměnná, která drží stav tvého jednoduchého stavového automatu. Tj. vidím čistě jen čtení vstupů a nastavování výstupů.
Zkus google: wiki stavový automat
3/ např. na papír si rozvrhni tvou úlohu na jednodušší části a nakoduj si to např. do jazyka C. Až potom si to přepiš do asm.
4/ výše se zde psalo o ošetření zákmitů vstupů. Já používám např. takovou šablonu:

Kód: Vybrat vše

#define SETPOINT 10

if (input_pin1!=0){
  if (cnt1<SETPOINT){
    cnt1++;
  }
  else {
    flag1=1;
  }
}
else{
  if (cnt1!=0){
    cnt1--;
  }
  else {
    flag1=0;
  }
}
// input_pin1 means some input
// flag1 means filtered input image
// cnt1 is temp. var.

Jsi schopen např. takový konstrukt přepsat do asm? Jinými slovy napsat větvení programu if{} else {} v assembleru?
5/ podívej se na internet, jak se píší podobné programy. Např. zde:
Dobrá stránka o PIC je třeba zde:
http://talkingelectronics.com/

Napsal: 01 úno 2012, 20:06
od frantajetel11
Díky za odkazy a rutinu. Trochu výš jsem psal, že v programování nejsem zrovna expert :cry: . Takže nějakej přepis z Cčka do asm, to fakt nehrozí...
Ten program je nedodělanej - vím to. Nějak jsem si vsugeroval, že když tam jsou na vstupu uP optočleny, tak nemusim řešit zákmity :lol: , tak ty asi budu řešit taky.
P.S. proš myslíš, že je PIC+ASM blbá kombinace?

Napsal: 01 úno 2012, 20:40
od Andrea
Ten PICassembler je už od pohledu fialovej hnus. :D

Napsal: 01 úno 2012, 20:53
od frpr666
RE:blbá kombinace. To bych netvrdil, že blbá, jen pro začátečníka složitá.
Microchip MPLAB IDE je skvělý soft zdarma. Já mám s Microchipem dobrou zkušenost.
Ještě jeden link o picech:
http://www.piclist.com/techref/piclist/begin.htm
edit1: popřemýšlej o tom, kolik vteřin času ti jako programátorovi zabere zapsat podmínku (if{}else{}). Zatímco v C je to pár vteřin, v asm to bude jistě více času a více popsaných řádků, které je třeba odladit. Microchip nabízí free C kompilátor zdarma. Podívej se po něm.

Napsal: 01 úno 2012, 21:11
od Chenzee
... co má za význam

Kód: Vybrat vše

BTFSC   IN1
NOP
BCF    RELE1
BTFSC   IN2
NOP   
BCF    RELE2

EDIT:
jinými slovy když je IN1 log.1, vykonej NOP a nastav RELE do 0., jinak nastav přímo RELE do 0

Napsal: 02 úno 2012, 05:27
od Chenzee
Koukni na toto. Mohlo by to chodit. Pro ostatní: neříkám, že je to nejlepší řešení. Vycházím pouze z toho, jaká byla původní konstrukce programu. Elegantněji by to šlo přes TMR a přerušení ale to zase až jindy :lol:

Napsal: 02 úno 2012, 15:15
od frantajetel11
Andrea píše:Ten PICassembler je už od pohledu fialovej hnus. :D

Myslela jsi ten muj rádobyprogram, nebo obecně? Pokud možnost A, tak bych si dovolil souhlasit.
Chenzee díky moc večer to vyzkouším :wink:

Napsal: 02 úno 2012, 16:55
od Andrea
Nehodnotila jsem program, ale assembler konkrétní rodiny procesorů.