16F84: Problém s přerušením: Stiskem tlačítka zapnout LED

Dobry den chtel bych poprosit o radu s pic 16f84 beru v potaz to ze je to vykopavka ale mam jich spoustu a zdarma :slight_smile: takze k problemu vytvoril jsem si skusebni program pro funkci → stiskem tlacitka1 rozsvit led1 a druhym tlacitkem2 treba led2 pri opetovnem stisku by se mela vypnout. Toto je pouze cast z celeho programu tudiz potrebuji pro to pouzit funkci preruseni .
Avsak pri nahrani prislusneho programu ktery prikladam nize se deje to ze pri stisku treba tlacitka 1 se zapne dioda 2a3 nebo 12 nebo jina kombinace to same pri stisku ostatnich tlacitek …za radu predem dekuji !

:arrow_right: administrator: přejmenováno z “problem s prerusenim”
preruseni na portu b.asm (2.22 KB)
preruseni na portu b.asm (2.22 KB)

uhm, tak ze na vstupne porty privadzas +5V cez tlacitko, mas tie porty cez odpory stiahnute na zem?

Ja by som aktivoval pullup a tlacitka dal proti zemi, navyse zablokoval kondikom.

trochu jinak mam rezistory proti +5V konkretne 1Kohm a tlacitkem to uzemnuji a musim to takle zachovat z duvodu pripojeni ir snimace tsop cislo si ted nevzpomenu … ktery ma v klidovem stavu na vystupu +5V Jinak tim pullup rozumim spravne ze to jsou ty softwarove pripinatelny rezistory na port ? v optionu ? A jen tak pro poradek pouzivam prekladac picdev a programator winpic s jdm neni to nejakej znamej zadrhel techto aplikaci ? diky

Ach jo, kdy se lidi naučí používat interpunkci (když už tedy ne diakritiku)? Kdo má luštit smysl vět.

Bylo by vhodné k některým dotazům připojit schéma(pak je zcela jasné co je kam, a jak připojené).

Preji vsem krasny den. Doplnuji tuto diskusi o schema , omlouvam se za kvalitu ale horecka 38,5 mi jaksi neumozni trvale koukat do eagle dekuji za pochopeni :slight_smile: PS: na obrazku neni zakresleno napajeni IO ve skutecnosti ovsem pripojene je .
img076.jpg

pokud pouzivas 84 tak by si ji mel mit v kodu…

LIST P=16F627

jen sem to tak prolit ale nic zavaznyho sem nenasel, mylsim,
zacal bych postupne , rozchodit nejdriv LED1 + TL1 , pak postupne 2-3, a nakones opet postupne pridavat 1+2/1+2+3 … , taklhle zjistis kde je problem …,

kondik 100n + 10uf u nozicek mcu mas…, ty pull-uppy 1K ? neni to trochu malo ??

Jestli jsem Tvůj původní dotaz pochopil správně, tak chceš, aby mcu reagoval na stisky tlačítek pomocí přerušení. Pokud je to tak, musíš řešit zákmity tlačítek už v zapojení HW a ne až pomocí SW…

V příloze je připojení rotačního kodéru k mcu (což jsou vlastně jen 3 tlačítka). Tlačítko kodéru není ošetřené proti zákmitům, to řeší SW. Otáčení kodérem vyvolává přerušení, tudíž musí být zákmity ošetřeny. Tlačítka jsou na VCC připojeny přes interní pull-up rezistory mcu. Odpory u tlačítek jsou 68-100 ohmů, kondenzátory 10-100n. Funguje to naprosto bezproblémově.

P.S.: Pull-up rezistory můžeš dát 5-10k, případně je nedávat, pokud mcu umí zapnout interní pull-upy. Používám AVRka, tak nevím, jesti to PICy (resp. konkrétně ten Tvůj) umí.
Osetreni_zakmitu.png

Vice oci vice vidi diky ! Jo moje blbost LIST P=16F627 to by mohl byt problém :slight_smile:
Skusim si dat jeste praci s ochranou proti zakmitum a dam vedet :wink:

A ten postup skouset jedno tlacitko a jednu led to se mi neosvedcilo a to s timto vysledkem -> prerusenim od ktereho koli portu B 0 nebo 4-7 to s jednou led funguje, ovsem pripojenim kterekoli dalsi led vznika prvne popsany problem .

Blokovaci kondenzatory u IO mam .

Diky za dosud poskytnute rady.

skusil bych jeste PRERUS MOVF portb,w movwf POM BTFSC POM,7 CALL ONLED1 BTFSC POM,6 CALL ONLED2 . .
a smazat priznak preruseni az pred RETFIE

jinak zakmit jednoho tlacitka nemuze ovlivnit ostatni led ne … ? pokud ten zakmit neprenasi ruseni do napajeni pri tak nizkym pull-upu

Zkus to tohle:
main.asm (3.99 KB)

Sám o sobě ne, ale tady se povoluje další přerušení hned na začátku obslužné rutiny (tedy jestli správně chápu INTCON). Přitom se na začátku obsluhy něco uklízí a na konci zase obnovuje, takže pokud přijde zákmit (a tedy další přerušení) ještě před koncem zpracování jednoho, tak může nastat prů…r. Tím pádem přesun smazání příznaku až na konec rutiny těsně před návrat by mohlo pomoct.

A i kdyby se přerušení povolovalo až instrukcí retfie, stejně je nutné zákmity vyřešit, jinak bude docházet k několikanásobnému volání int rutiny při jednom stisku tlačítka.

jasne , tohle vim, mel sem na mysli to ze i kdyby se to preruseni vyvolavalo porad dokola nemuze ten zakmit na jednom tlacitku ovlivnit ostatni led, mel by vzdy ovlivnit pouze tu 1 led kterou ovlada takze tim ze osetri zakmity nevyresi problem

Dekuji za venovani se memu problemu, nerad bych abych pusobil ze jsem nasadil brouka do hlavy a nemel zajem se o to dale zajimat. Pouze mi to vyzkouseni chvili potrva mam narocne zamestnani dekuji za pochopeni :slight_smile:

Zdravim, opet me provazi jen neuspech :frowning: Otestoval jsem doporuceny soubor "main"asm od Standy33 kteremu bych chtel podekovat za profesionalni vykon avsak zapojeni se chova tak ze nesviti nic at mackam cokoli. Timto jsem se chtel zeptat jestli by se nasel jeste nekdo, kdo by mi to mohl prelozit do souboru hex.
Abych treba mohl vyloucit zavadu na prekladaci
nebo bych se chtel optat zda to nekdo jen tak ze sve iniciativy skousel a s jakym vysledkem dekuji .

skus tohle jestly to neco dela …, neni to s prerusenim, jenom na test
Snehulak.zip (743 Bytes)

Našel jsem PIC16F84 a zkusil to zapojit na nepáj.poli, vše OK, při stisku TLx se rozsvítí LEDx, při dalším stisku zhasne. Tady je zapojení i hex soubor.

Jediná změna proti původnímu programu je v zapnutí pull-up odporů na PORTB(4…7), ale správně fungují oba.
Test tlačítek.zip (15.1 KB)