Vlastimil Krška, Rostislav Kerber, UREL, FEEC, VUT Brno
xkrska03stud.feec.vutbr.cz, xkerbe00
stud.feec.vutbr.cz
projekt zveřejněn také na www.pandatron.cz a www.hw.cz
Cílem tohoto projektu je využít obvod firmy Freescale k realizaci dotykových kapacitních tlačítek. Obvod MPR 084 je senzorový kontroler určený právě pro snímání dotekových kapacitních tlačítek.
Během projektu bude navrženo obvodové uspořádání, jeho realizace a návrh programového ovládání pomocí AVR kitu s kontrolerem ATmega16. Výsledkem projektu bude model schopný detekce
stisku tlačítka a jeho vypsání na znakový display.
Tento projekt bude realizován na vývojovém programovacím kitu s mikrokontrolerem ATmega16, který je zobrazen na následujícím obrázku. Veškeré programové ovládání je tedy testováno na tomto kitu.
Tento obvod pracující s napájecím napětím 1,8V až 3,6V při provozních teplotách -40°C až +85°C pracuje na principu zjišťování údálosti na tlačítkách. Při detekci této události (eventu) se generuje
signál přerušení pro spuštění obslužného programu.
Obvod MPR 084 pracuje se sběrnicí I2C a pomocí této komunikace také posílá data pro zpracovávání událostí zjištěných na tlačítkách.
Na následujícím obrázku je detailní zobrazení pinů obvodu i s jejich popisky.
Protože je I2C komunikace mimo aktivní provoz primárně na vysoké úrovni, je nutné piny SCL a SDA připojit na pull-up rezistory. Při psaní obslužných programů se nejprve předpokládalo s použitím vnitřních softwarových
pull-up rezistorů avšak poté bylo přistoupeno k použítí skutečných rezistorů s hodnotou 2,7kΩ, kterými se dodatečně připojilo napájecí napětí na tyto piny. V obrázku layoutu však tato dodatečná úprava není zakreslena.
Podle všech informací by však použití vnitřních softwarových rezistoru mělo odvést stejně dobrou práci. Poslední úprava, která není ve schématu ani v návrhu layoutu zakreslena je vyvedení pinu IRQ na z našeho pohledu
třetí vývod KD lišty od spodu. Zde je totiž v AVR kitu připojen vstup pro přívod zdroje signálu externího přerušení. Použití externího zdroje přerušení se totiž zavedlo až v průběhu práce.
Zdrojový kód z hlavní smyčky programu (tlacitka.c):
#include <avr/io.h> #include <avr/interrupt.h> //knihovna pro preruseni #include "lcd_c.c" //knihovna pro inicializaci znakoveho LCD #include "twimaster.c" //knihovna pro ovladani i2c komunikace (spolu s knihovnou i2cmaster.h ) #include <util/delay.h> //knhovna pro zavadeni zpozdeni #include "C_touch.c" //knihovna pro inicializaci obvodu a vycitani cisla tlacitka (spolu s knihovnou C_touch.h)
ISR(INT0_vect) //preruseni z externiho zdroje (z pinu IRQ) { unsigned char hodnoty [2]; unsigned char buffer [20]; Test_touch(); //vycitani hodnot stisknutych tlacitek a oprava chyby obvodu (popsano v C_touch.c) lcd_gotoxy(0,0); //pozice pro vypis na LCD sprintf(hodnoty,"%02x",Cislo_tl[0]); //prevod znaku na cislo lcd_puts (hodnoty); //vypsani cisla stisknuteho tlacitka na LCD }
int main (void) { unsigned char buffer [20]; unsigned char hodnoty [2]; unsigned char x = 0; Cislo_tl[9]=0;
lcd_init(); //inicializace LCD DDRC = 0b00000100; //zde se nastavuje I/O rezim a take se zde povoluji vyse zminene pull-up rezistory PORTC =0b00000000; i2c_init(); //inicializace I2C komunikace Touch_init(); //volani funkce Touch_init, ktera je umistena v C_touch.c a provadi reset MPR 084 a nastaveni jeho registru MCUCR=(1<<ISC01); //nastaveni preruseni INT0 na sestupnou hranu GICR=(1<<INT0); //nastaveni povoleni externiho preruseni _delay_ms(50); //zpozdeni 50ms
sei(); //globalni povoleni preruseni
while (1); } Výsek zdrojového kódu funkcí Touch_init() a Test_touch(),(C_touch.c):
void Touch_init(void) { i2c_start_wait(Tlacitka+I2C_WRITE); i2c_write(0x13); i2c_write(0x04); //Deaktivace a reset obvodu i2c_stop();
/*Nastaveni registru obvosu MPR084*/ i2c_start_wait(Tlacitka+I2C_WRITE); i2c_write(0x03); i2c_write(0x99); //Touch Pad Configuration Register i2c_write(0x09); //Sensitivity Threshold Registers 0 i2c_write(0x09); //Sensitivity Threshold Registers 1 i2c_write(0x09); //Sensitivity Threshold Registers 2 i2c_write(0x09); //Sensitivity Threshold Registers 3 i2c_write(0x09); //Sensitivity Threshold Registers 4 i2c_write(0x09); //Sensitivity Threshold Registers 5 i2c_write(0x09); //Sensitivity Threshold Registers 6 i2c_write(0x09); //Sensitivity Threshold Registers 7 i2c_write(0xFF); //Electrode Channel Enable Mask Register i2c_write(0x01); //Maximum Number of Touched Positions Register i2c_write(0x05); //Master Tick Period Register i2c_write(0x01); //Touch Acquisition Sample Period Register i2c_write(0x07); //Sounder Configuration Register i2c_write(0x00); //Low Power Configuration Register i2c_write(0x00); //Stuck Key Timeout Register i2c_write(0xF7); //Configuration Register i2c_stop(); } void Test_touch(void)
{
unsigned char hodnota=0,error=0,i=0;
while(hodnota != 0x40) //Cekani vyprazdneni registru
{
i2c_start_wait(Tlacitka+I2C_WRITE); //Adresace registru se stisknutou hodnotou
i2c_write(0x00);
i2c_start_wait(Tlacitka+I2C_READ); //Vycteni aktualniho stisku
hodnota = i2c_readNak();
i2c_stop();
i2c_start_wait(Tlacitka+I2C_WRITE); //Adresace chyboveho registru
i2c_write(0x01);
i2c_start_wait(Tlacitka+I2C_READ); //Vycteni chyby
error = i2c_readNak();
i2c_stop();
if(error != 0) //Test chyby obvodu
{
Touch_init(); //Reset obvodu a opetovna inicializace
goto Konec; // Uknceni vycitani
}
Cislo_tl[i] = (hodnota & 0x0F) + 1; //Zapis stisknute hodnoty tlacitka
hodnota &= 0xF0; //Maskovani stisku - vyuziti priznaku
i++; //Zviseni hodnoty bufferu vycitanych hodnot
}
Další uživatelsky důležitým souborem je knihovna C_touch.h. V této knihovně se totiž nastavuje adresa obvodu pro I2C komunikaci. Tuto hodnotu je nuné zjistit v Datasheetu použitého obvodu a zapsat ji sem bitově
posunutou o jeden bit doleva. Pro obvod je tato adresa adresou pro čtení, tedy 0x5D. Převedeno na binární soustavu 0b01011101. Bitově posunuto se pak bude jednat o číslo 0b10111010, tedy 0xBA hexadecimálně.
Program je schopen zpracovat oba druhy zápisu. Viz následující čás kódu z knihovny C_touch.h.
#define Tlacitka 0b10111010 //I2C adresa obvodu MPR 0x5D tedy, 0b01011101Na konec se pro zabránění náhodnému spojování kontaktů dotykové plošky přelepily lepící páskou, která má dostatečné izolační vlastnosti.
[1] Freescale, datasheet pro obvod MPR 084, cit. 22.5.2010, WWW:
&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation