Dušek Martin, Müller Tomáš, UREL, FEEC, VUT Brno
xdusek14stud.feec.vutbr.cz, xmulle15
stud.feec.vutbr.cz,
Mikrokontrolér Atmega16 může komunikovat s PC pomocí sériového rozhraní přes USART (Universal Synchronous Asynchronous Receiver Transmitter). Jelikož dnes nemají všechny PC vyvedený sériový port (COM), lze použít nejrozšířenější rozhraní USB (Universal Serial Bus), kterým jsou vybaveni všechny moderní PC. Protože zmíněná ATmega16 tímto rozhraním není vybavena, lze využít integrovaných obvodů od britské firmy FTDI (Future Technology Devices International Ltd.), které převádí data z USART na USB. Pomocí těchto integrovaných obvodů se pak zařízení připojené přes USB jeví z hlediska PC jako další sériový port (virtuální).
FT232R je převodník USB – USART disponující přenosovou rychlostí 300 Bd až 3MBd. Integrovaný obvod obsahuje také interní vyrovnávací paměť o velikosti 384B (PC › zařízení) a 128B (zařízení › PC). Komunikace pomocí RS 232 je pomocí tří hlavních vodičů RXD (příjem), TXD (vysílání) a společné zemi GND. FT232BM zpracuje i další signály pro plné hardwarové řízení (RTS, CTS, DTS, DTR, DSR, DCD). Obvod může pracovat jak s 5V tak i 3,3V logikou. Napájecí napětí je 4,35-5,25V a je možné ho napájet přímo z USB.
Na trhu jsou od firmy FTDI varianty FT23BM, FT232BL a FT232BQ, které se liší pouze typem pouzdra.
Nejnovější varianta tohoto čipu je prodávána pod názvem FT232R. Naproti předešlým typům má následující změny:
Zapojení jednotlivých vývodů FT232RL je dle [1] zobrazeno na Obr. 1 a popis je v Tab. 1.
![]() |
Obr. 1.Názvy a čísla vývodů obvodu FT232RL z [1] |
Nazev (pin/port): | Pin | Popis: |
VCC | 20 | Napájení obvodu 3,3 ÷ 5,25 V |
VCCIO | 4 | Napájení pro USART a CBUS výstupy, 1,8 ÷ 5,25 V |
GND | 7, 8, 21 | Zemníci piny |
AGND | 25 | Analogová zem – pro interní oscilátor |
3V3OUT | 17 | Výstup z interního stabilizátoru (připojuje se 100nF kondenzátor) |
RESET# | 19 | Pin pro reset, nemusí se využít (uvnitř připojen přes R na VCCIO) |
TEST | 26 | Pro připojení I.C testovací mód – v provozu se zemní |
OSCI, OSCO | 27, 28 | Pro připojení externího 12MHz krystalu, nemusí se využít |
USBDP, USBDM | 15, 16 | Data do USB rozhraní (P - plus, M - mínus), úroveň 3,3V |
TXD, RXD | 1, 5 | Vysílání (TXD) a příjem (RXD) dat po USART |
DTR#, RTS# | 2, 3 | Výstupní signály pro RS232 |
RI# ,DSR#, DCD#, CTS# | 6, 9, 10, 11 | Vstupní signály pro RS232 |
CBUS[0..4] | 23, 22, 13, 14, 12 | Port SBUS, lze jej nakonfigurovat plní více funkcí Výchozí(0-4): TXLED#, RXLED#, PWREN#, TXDEN,SLEEP# |
Pro prověření funkce čipu FTDI FT232R jsme si zvolili jednoduchou úlohu, kdy mikrokontrolér ATmega16 funguje jako měřidlo napětí 0 - 5V, které je snímané z jednoho zvoleného pinu příslušného portu. Jedná se tedy o A/D převod pomocí vnitřního A/D převodníku mikrokontroléru. Měřící systém je ovládán pomocí m-file a Matlabu. Hlavní výhodou Matlabu jsou jeho vnitřní matematické operace a nástroje pro grafické zobrazení průběhů.
Do obslužného programu se zadá číslo pinu, který chceme změřit a počet měření. Obslužný program tyto informace odešle do mikrokontroléru, který provede měření a navrátí jednotlivé naměřené hodnoty. Matlab tyto hodnoty příjme a zpracuje. Samotný čip FTDI FT232R má zmíněnou funkci převodu signálu UART na USB. Vzhledem k tomu, že používáme mutaci R, není potřeba žádných pomocných obvodů, protože má zabudovanou interní EEPROM o velikosti 1024 B.
Obr. 2. Realizovaný modul převodníku. |
![]() |
|
Obr. 3. Schéme modulu převodníku. |
![]() |
|
Obr. 4. Deska plošných spojů. |
Program se skládá z 3 funkcí a dvou obsluh přerušení:
Funkce main:/* Program, ktery po precteni dat z UARTu nastavi vstup a pocet mereni (konstantni rychlost vzorkovani) vysle po kazdem mereni data na UART. Po poslednim mereni vysle zakoncovaci kod. */ #include <avr/io.h> #include <avr/interrupt.h> // knihovna pro preruseni #define FOSC 8000000 // rychlost CPU #define BAUD 9600 // rychlost prenosu void nastav_pocet(uint8_t); //prototyp funkce pocet mereni void nastav_vstup(uint8_t); //prototyp funkce vyber kanalu ADC uint8_t pocet = 0; //def promenne uint8_t test = 0; //def promenne int i; //def promenne int main( void ) //hlavni program - zde nnaplnime registry a povolime preruseni { ADMUX=(1»REFS0|0»MUX0); //AD0 poevodník nastaveni vtupu ADCSRA=(1»ADPS2|1»ADPS1|1»ADPS0|1»ADATE|1»ADIE); //povoleni AD poev, a nastaveni preddelicky UCSRB=(1»TXEN|1»RXEN|1»RXCIE); // povoleni vysilani UART, UCSRC=(3»UCSZ0|(1»USBS)|1»URSEL); //8bit slovo, asynch prenos UBRRL=FOSC/16/BAUD-1; // NASTAVENI RYCHLOSTI prenosu reg1 UBRRH=((FOSC/16/BAUD-1)»8); // NASTAVENI RYCHLOSTI prenosu reg2 sei(); //povoleni preruseni while(1); //nekonecna smycka - pro vyplneni volnych chvil uP } ISR( ADC_vect ) // preruseni kdzy skonci AD prevod { i++; //pricte jednnicku k cislu vzorku loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=ADCH&0b00000011; //vysle prvni pulku dat loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=ADCL; // posila druhou pulku dat loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=i; // vysle cislo vyorku pocet--; //odecte jedno mereni if (pocet < 1) // je-li posledni mereni pocet=0 { ADCSRA&=~(1»ADEN); //vypne AD prevod loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=0x0A; // oprv ysle znak LF (ASCII) loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=0x0D; // opr vysle znak CR (ASCII) } } ISR( USART_RXC_vect ) //preruseni pri prijmu ramce USART { switch (test) { case 1: //je-li test=1 tj. pozadavek na vstup // nastav_vstup (UDR); // vyvola funkci nastaveni vstupu (bin data) nastav_vstup (UDR-48); // vyvola funkci nastaveni vstupu (ACII data-cislo) test = 0; // nulovani polozky TEST - default hodnota break; case 2: //je-li test=2 tj. poyadavek na pocet mereni nastav_pocet (UDR); // vyvola funkci pocet mereni test = 0; // nulovani polozky TEST - default hodnota break; default: switch (UDR) { case 'v': //prijde-li pozadavek na vstup test = 1; break; case 'p': //prijde-li pozadavek na pocet mereni test = 2; i=0; break; default: loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=0xf9; // kod chyba break; } break; } } void nastav_pocet(uint8_t poc) {if (UDR > 0) { pocet=poc; //prijme pocet mereni loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=pocet; // vysle zpet pocet mereni ADCSRA|=(1»ADEN|1»ADSC); // povoli a spusti AD prevodnik } } void nastav_vstup(uint8_t vstup) { if ((vstup<9)&&(vstup>0)) // cislo znaku musi byt mensi jak 8 { ADMUX=(1»REFS0|(vstup-1)»MUX0); // nastavi vstup AD prevodniku loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=ADMUX; // poznavaci kod pro odpoved na dotaz na port } else { loop_until_bit_is_set(UCSRA,UDRE); //ceka na povoleni vysilani UDR=0xf9; // kod chyba } }
Jak bylo zmíněno, pro software v PC jsme si vybrali prostředí Matlab. Komunikace pomocí Matlabu se skládá z několika kroků. Nejprve je třeba definovat port. To se provádí příkazem seriál.
s=serial('COM5','BaudRate',9600,'Parity','none','DataBits',8,'StopBits',1,'Terminator','');
První parametr definuje virtuální port, na který je zařízení připojeno (lze jej zjistit ve Správci zařízení – Porty (COM a LPT) – USB seriál Port (COMx)). Rychlost přenosu udává parametr BauRate, v našem případě 9600Bd. Dále se musí nastavit počet databitů, stopbitů a parita. Posledním a velmi důležitým parametrem je Terminátor, nastavení zakončovacích znaků. Zde je důležité zadat prázdné apostrofy. Jinak Matlab posílá zakončovací znaky a mikrokontrolér je pak považuje za užitečné informace.
Po zadání parametru se musí nejdříve port otevřít příkazem fopen(s). Poté lze z portu buď číst příkazem fread(s,proměná), nebo zapisovat příkazem fprintf(s,proměná). Po ukončení komunikace je velmi důležité port opět zavřít příkazem fclose(s). Pokud by toto nebylo provedeno, tak pak na port nemá žádný jiný program přístup (ani samotný Matlab ho podruhé neotevře).
Prvním krokem programu je zmíněné nastavení a otevření sériového portu. Po vyzvání funkcí imput() je třeba zadat pořadové číslo měřeného pinu a počet měření. Tyto informace jsou pomocí funkce fprintf() vysílány do mikroprocesoru, který na ně odpovídá. Pošle-li procesor kód chyby, zobrazí se chybová hláška. V druhém kroku Matlab čte data (hodnota měření a pořadové číslo), které se ukládají do matice. Po přijatí zakončovacích symbolů ( LF/CR) program zavře sériový port a přejde k vlastnímu zpracování, kde přijaté hodnoty přepočte na dekadické číslo a zobrazí v grafu.
clc; clear all; close all; s=serial('COM5','BaudRate',9600,'Parity','none','DataBits',8,'StopBits',1,'Terminator',''); % nastaveni serioveho vstupu a formatu ramce fopen(s); %otevreni serioveho portu while (1) a=input('zadej cislo vstupu(1 az 8): '); %zadani cisla mereneho vstupu vstup=char(a); %prevedeni yadaneho cisla na char fprintf(s,'v'); fprintf(s,vstup); vraceny_vstup=fread(s,1); if (vraceny_vstup~=249) break end 'spatne zadani' end k=input('zadej pocet mereni: '); %zadani cisla vstupu pocet=char(k); u=2; fprintf(s,'p'); fprintf(s,pocet); vraceny_pocet=fread(s,1) while (1) matice(u)=fread(s,1); if (matice(u)==13) & & (matice(u-1)==10) break; end u=u+1; end fclose(s); %zavreni serioveho portu i=2; while (1) a=matice(i+2); data(a)=(matice(i)*256+matice(i+1))*5/1023; if (i>u-5) break; end i=i+3; end data %stredni hodnota str=0; for i=1:a str=str+data(i); end str=str/i figure plot (data);
Na ukázku možné aplikace převodníku FTDI FT232R (USART na USB) jsme vytvořili jednoduchou aplikaci pro měření napětí pomocí mikrokontroléru ATmega16. Aplikace se skládá ze dvou programů pro mikroprocesor a jeho ovládání počítačem. Programy jsou sice jednoduché, ale názorně ukazují, jak lze komunikovat mezi Matlabem a mikroprocesorem.
Nejvíce času zabralo vyladění vlastní komunikace programem Matlab, kde jsme se potýkali s vysíláním nechtěných ukončovacích znaků, které bral mikroprocesor za užitečnou informaci. To jsme ošetřili příkazem Terminátor ve funkci seriál. Na zjištění funkčnosti a vyladění vlastního programu mikroprocesoru, jsme použili program Terminal. Díky Terminálu jsme zjistili, že chyba je v komunikaci Matlabem. Dalším počátečním problémem bylo, že jak Matlab tak Terminal vysílají čísla jednotlivě v datovém typu char (ASCII). To jsme ošetřili převodem dekadického čísla na jeden znak typu char.
Pro přípravek(ATmega16) v laboratoři jsme navrhli a zhotovili modul s FT232R, pro přenos dat mezi mikroprocesorem a USB. Celý projekt je k dispozici ZDE.
[1] | Datasheet mikrokontroléru ATmega16 od firmy Atmel. Dostupný na www: http://www.datasheetcatalog.org/datasheet/atmel/2466S.pdf. |
[2] | DUŠEK, M. Zpracování zázněje z Dopplerovského radarového senzoru. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií. Ústav radioelektroniky, 2009. 26 s. semestrální práce. Vedoucí práce: práce Ing. Michal Fuchs. |
[3] | MÜLLER, T. Digitální zapisovač dat. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií. Ústav radioelektroniky, 2009. 23 s.. Semestrální práce. Vedoucí práce: ing. Jan Diblík. |