Mikro/atmega32/přerušení/tlačítka – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Mikro/atmega32/přerušení/tlačítka – Mikrokontroléry – Fórum – Programujte.comMikro/atmega32/přerušení/tlačítka – Mikrokontroléry – Fórum – Programujte.com

 

Jakub
~ Anonymní uživatel
905 příspěvků
30. 1. 2018   #1
-
0
-

Zdravim lidi, 

obracím se na fóra, protože si už nevím rady, nebudu tu rozebírat mojí úroveň v programování a půjdu k věci. Programuji termostat s pomocí vývojářského kitu EvB 4.3 s atmegou 32 a povedlo se mi zprovoznit samotnou funkci termostatu, ale teď mi jde o uživatelské prostředí,  zasekl jsem se u toho, že chci do interruptu dát jakousi if funkci, která mi dovolí např stisknout tlačítko pro set Temperature a dále si dalšími 2mi tlačítky načítat teplotu nahoru, nebo dolu. Poté například stisknout Back, nebo znovu Set a dostat se zpátky do nekonečné funkce while(1).. Nějaké rady, tipy a triky ? Programuji v AtmelStudiu 7.0. Díky za rady čus

Nahlásit jako SPAM
IP: 88.146.103.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2018   #2
-
0
-

#1 Jakub
Zalezi jake preruseni. Pokud chces pouzit externi preruseni nebo pin change (PCINT), tak to s tlacitkama moc nedoporucuju, jelikoz tlacitka maji tendenci chvili kmitat (zakmity).

Doporucuju spise preruseni casovace. Pokud to budes kontrolovat kazdych par milisekund, tak tak se s jednou bajtovou promennou da udelat filtr zakmitu (v anglictine takzvany debouncing). A pokud to pocitani nezastavis, da se tim udelat i opakovani pri drzeni tlacitka. Tj. provest akci pri napocitani 5 (pri timeoutu 2ms by to bylo 10ms zpozdeni a pak kazdych 512ms opakovani akce (dokud drzis tlacitko).

Zaroven se to pocitani nemusi delat ani v ISR handleru, muzes nastavit jen nejakou volatilni promennou a zpracovat v hlavni smycce.

Technicky vzato vlastne ani nemusis zapinat preruseni. Ty flagy se nastavuji tak jak tak, a daji se vzdy vynulovat zapisem logicke 1. Takze vlastne jen zapnes casovac a v hlavni smycce testujes, jestli Timer overflow flag je 1. Tim vis, ze mas neco zpracovat a jen ho pak musis vynulovat tim zapisem logicke 1.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
31. 1. 2018   #3
-
0
-

#2 KIIV
Co třeba po příchodu přerušení od tlačítka ho na 10 ms zamaskovat a pak zase povolit?

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
MilanL+1
Grafoman
31. 1. 2018   #4
-
0
-

#1 Jakub
ahoj,

myslím že stejný projekt tu byl řešen celkem nedávno.

Hlavně si pořádně prostuduj dokumentaci EvB - zapojení součástí na kitu, např tlačítka jdou proti zemi tzn vstupy musí být nastaveny jako pullUP a odpovídajícím způsobem testovány.

Nahlásit jako SPAM
IP: 91.139.9.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2018   #5
-
0
-

#3 Kit
taky moznost, jen to komplikuje to znovupovoleni. A pokud by chtel to opakovani pri drzeni, tak je to dalsi komplikace.

Ale kdyz by pouzil treba CTC mod (tj OCR1A jako top), tak pak jen otestuje  TIFR & _BV(OCF1A) a vynuluje ho pomoci  TIFR |= _BV(OCF1A); a pocitadla da uz nejak dohromady sam.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
31. 1. 2018   #6
-
0
-

#5 KIIV
Do doby, než povolí to tlačítko, by mohlo chodit přerušení od časovače.

Nebo přerušení jen od časovače v pravidelných intervalech, kontrolovat stav tlačítek a ignorovat zákmity.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
MilanL+1
Grafoman
31. 1. 2018   #7
-
0
-

Možností řešení a jejich kombinací je víc, od sledování ve smyčce s vyrovnávací pauzou, přes časovač po přerušení.

Jednotlivé věci jsou celkem jednoduché, jen je správně poskládat a na nic nezapomenout, např. pokud ten termostat má něco řídit, musí jeho kontrola běžet nepřetržitě v daných intervalech a nezávisle na stavu gui.

Nahlásit jako SPAM
IP: 91.139.9.–
Jerry
~ Anonymní uživatel
504 příspěvků
31. 1. 2018   #8
-
0
-

#1 Jakub
nedělej na to kod v assembleru a vem si radši hotovej enkoder třeba 74C922

https://www.soemtron.org/downloads/disposals/74c922.pdf

a jenom napiš obslužnou rutinu, která bude číst vstup třeba 30x za sekundu

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:75f6:...–
31. 1. 2018   #9
-
0
-

Pokud má "Evaluation Board", tak jsou zákmity kontaktů potlačeny kondenzátory. Doporučuji studovat dokumentaci použité desky.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
31. 1. 2018   #10
-
0
-

#8 Jerry
Na pár tlačítek tam cpát extra čip je nesmysl. Je úplně jedno, jestli každých 10 ms přečtu port nebo jestli každých 10 ms přečtu nějaký výstup z nějakého čipu ( = přečtu port). Navíc na desce, kterou má, by to k tomu musel nějak dobastlit.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2018   #11
-
0
-

#9 hlucheucho
U oficialnich evaluation boardu mozna, tady podle schematu nic neni:

Připojen obrázek.

Dobastlit by se to i dalo, jelikoz je to vse jen vyvedene na pinove listy a musi se to beztak pospojovat dratama k pinum.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jakub
~ Anonymní uživatel
905 příspěvků
31. 1. 2018   #12
-
0
-

Díky všem za pomoc, zkusím z těch informací něco dát dohromady, našel jsem na jednom fóru podobný dotaz a bylo tam i nějaké řešení, mimochodem s tim bastlením, já s tím kitem neplánuji termostat stavět, pouze na něm vyvýjím a testuji program, desku vytvářím vlastní 

Nahlásit jako SPAM
IP: 88.146.103.–
Jakub
~ Anonymní uživatel
905 příspěvků
31. 1. 2018   #13
-
0
-

Našel jsem tu na fóru od vás vlastně stejnou situaci popsanou, takže vás nebudu dál zdržovat a pročtu si ty reakce :) Já mam narozdíl od toho klučiny na program času ještě dost a ročníkovku nedělám na poslední chvíli :D 

Nahlásit jako SPAM
IP: 88.146.103.–
Jerry
~ Anonymní uživatel
504 příspěvků
1. 2. 2018   #14
-
0
-

hele ten váš pan učitel je asi pěknej blbec protože tohle vám měl vysvětlit
jak se to dělá a o co de. Je to holt těžký když má titul mgr. z university
pro modelky a má v hlavě sračky že.

se ti to pokusim vysvětlim metodou "for dummies"

takže když má procesor tak ty jeho piny sou sdružený do bran obvykle po 8 pinech
značený Px.0 až Px.7, kde x je brána třeba A nebo B - viz obrázek níže
každý pin se dá nastavit jako vstupní nebo výstupní nebo jiný stav (třeba stav
vysoké impendace). na to abys mohl vytvořit klávesnici která má 16 kláves
si vyčleníš jeden celý port třeba A který má 8 pinů. port rozdělíš na pul
po 4 pinech a první 4 piny použiješ jako přijímače a druhý 4 piny jako vysílače

to jestli je pin vysílač (rozuměj výstupní) nebo přijímač (rozuměj vstupní)
se nastavuje v registrech procesoru algoritmem a lze to měnit. když nastavíš pin
jako výstupní tak se přepne do modu otevřený kolektor a může přijímat proud
a můžeš k němu připojit diodu (anodou) a ona svítí - viz obrázek níže.
K diodě se obvykle přidává odpor podle typu diody 270-390 ohmu (i když stav
pinu "open collector" neboli výstupní to nevyžaduje). pokud je takto port
nastavený tak když ho čteš v assembleru tak vždy přečteš nulu (u některých procesorů
to jde změnit). když na pin připojíš přímo kablík GND neboli zem tak se nic nestane
a když tam připojíš +5 tak dojde ke zkratu a procesor ti vyhoří :))))
Druhá možnost je že přepneš stav pinu do vstupní a pak tento pin může detekovat
nějaký binární vstup. Jinými slovy když k němu připojíš drátek GND tak pak
můžeš v assembleru na daném pinu přečíst hodnotu 0 a když drátek odpojíš tak
hodnotu 1. u některých procesorů je nutné si stav 1 vynutit přidáním externího
rezistotu tzv. pull-up rezistor připojený na +5 a má třeba 1.2kOhmu.

procesor vzorkuje vstupy i výstupu v určitých časových intervalech. časový interval
je daný frekvencí taktování procesoru (krystal, RC dekáda, externí čas. zdroj)
pokud na pinu který je vstupní je po určitou minimální dobu připojen signál
(rozuměj drátek GND) tak procesor přečte hodnotu 0 po dobu, kdy tam byl
signál připojen.

Takže na obrázku dole jsou vstupní piny PA0..3 a výstupní PA4..7.
Takže piny PA4..7 jsou vysílače a PA0..3 jsou přijímače signálu.
Na obrázku dolejsou klávesy označené jako 01 .. 16 zelenou barvou


Algoritmus pro obsluhu klávesnice se dělá takto:

1/ všechny piny PA0..7 nastav jako vstupní (přijímač) t.j. piny budou mít hodnotu 1

2/ pin PA.7 nastav jako výstupní (vysílač) - bude mít hodnotu 0
3/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 01
4/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 02
5/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 03
6/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 04
7/ pin PA.7 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1

8/ pin PA.6 nastav jako výstupní (vysílač) - bude mít hodnotu 0
9/  jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 05
10/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 06
11/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 07
12/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 08
13/ pin PA.6 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1

14/ pin PA.5 nastav jako výstupní (vysílač) - bude mít hodnotu 0
15/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 09
16/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 10
17/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 11
18/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 12
19/ pin PA.5 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1

20/ pin PA.4 nastav jako výstupní (vysílač) - bude mít hodnotu 0
21/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 13
22/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 14
23/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 15
24/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 16
25/ pin PA.4 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1

26/ všechny piny PA0..7 nastav jako vstupní (přijímač) t.j. piny budou mít hodnotu 1


na obrázku dole ta červená čára vysílá signál z pinu PA.7 na pin PA.0 když
je stisknutá klávesa 0. Tenhle algoritmus ti zajistí, že bude detekován
stisk jedné jediné klávesy. musíš ho spustit alespoň 6-10x za sekundu
protože stisk klávesy trvá obvykle 20ms.

v případě, že chceš detekovat stisk více kláves, pak musíš použít dva 8 mi bitové
registry (pojmenujme je např. A a B) nebo 16 bitů v paměti RAM (což se používá
častěji a označme tuto část paměti taky AB) kam se bude hodnota stisknutých kláves
ukládat a změna v těchto registrech se dělá instrukcí OR vzhledem k poslední hodnotě,
což je logické.

tento mechanismus má jednu velkou nevýhodu a to že ti muže detekovat stisk
klávesy vícenásobně, což je hloupé. protože body 2..26 proběhnou třeba za 25 nanosekund
a stisk klávesy trvá 0.2 sek tak by se ti takhle načetla hromada stejnejch znaků
záleží na tom jak máš naprogramovanej zbytek kodu.

taky stisk klávesy nebejvá ideální a tak trochu to mezi těma kontaktama jiskří
a takže z pohledu procesoru to vypadá že se klávesa spíná a zase rozepíná
takže aby si tomu zamezil, tak si musíš doprogramovat
část, která detekuje ze klávesa, která již byla zmáčknuta byla také uvolněna
ale až za jistý min. časový interval   
jinými slovy k novému nastavení bitu 1 v registru AB dojde jen tehdy, pokud
momentálně má hodnotu nula jinak se nic nestane a tohle se děje jen v určitém
časovém intervalu.  můžeš si taky doprogramovat bit, který ti určí, že došlo
ke změně stisku kláves. metod existuje hromada.

přesun přečteného znaku z registru AB k dalšímu zpracování se dělá v určitých
časových intervalech. takže jak vidíš, čtení klávesnice a zápis přečtené
zmáčknuté klávesy se může dělat aj 100x za sekundu ale čtení registu AB,
kam se uložila stisknutá klávesa (nebo víc stisknutých kláves) se může
číst jen 10x za sekundu. Klávesnice by se neměla dávat jako zdroj přerušení
protože když procesor např. vysílá data po sběrnici a má k tomu
jen omezené časové okno, tak přerušení od klávesnice by toto okno mohlo
narušit, takže procesor čte stav klávesnice ale nikoliv opačně. Jako řídící prvek
klávesnice můžeš udělat i malý procesor z řady ATtiny a připojit ho na hlavní
procesor přes sběrnici SPI apod.

Připojen obrázek.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:a48b:...–
1. 2. 2018   #15
-
0
-

#14 Jerry
Uniklo ti zadání: předpokládá tlačítka SET, +, - a BACK. Takže ta složitost kolem maticové klávesnice je zbytečná, stačí mu na to 4 vstupy s pull up odporama 10k a tlačítkama na zem, na kontakt tlačítka paralelně kondenzátor 100nF. Pak může používat on pin change interrupt a jde tak i detekovat uvolnění tlačítka. Autoinkrement hodnoty pak může udělat časovačem, který spustí při obsluze přerušení při stisku a zastaví při uvolnění. Možná to najde i v App. Note teď už u Microchipu (dřívě to byl Atmel).

(Možná zbytečná) pozn.: Pokud by chtěl mít maticovou klávesnici, tak stačí si vybrat mikrokontrolér, který má Keyboard Interface (KBI). Nedávno jsem to dělal s membránovou klávesnicí 4x4 a přerušeníma a je to velice jednoduchý. Není nutný skenovat po jednotlivých řádcích a sloupcích, jde to udělat na 2 skeny, zjednodušeně:
1. nastavím sloupce na 0 a přerušení od řádků, čekám na přerušení
2. při obsluze přerušení zakážu přerušení od klávesnice a stav klávesnice ignoruji, spustím časovač který vyčká na ustálení
3. po vypršení časovače opět nastavím přerušení od řádků
4. přerušení nastane ihned, přečtu řádky (čtu registr příznaků)
5. nastavím řádky na 0 a přerušení od sloupců, čekám na přerušení (příjde okamžitě po návratu z obsluhy přerušení)
6. přečtu sloupce (čtu registr příznaků)
7. jedničky v řádcích a sloupcích určují stisknuté klávesy, tento stav současně se použije pro nastavení úrovně na kterou KBI reaguje.

Je třeba nastavovat úroveň na kterou přerušení KBI reaguje. Dá se tak dosáhnout i odezvy na jakoukoliv změnu stavu klávesnice.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý