MMIA - FTDI FT235

Dušek Martin, Müller Tomáš, UREL, FEEC, VUT Brno
xdusek14proti_spamu.png, 322Bstud.feec.vutbr.cz, xmulle15proti_spamu.png, 322Bstud.feec.vutbr.cz,

Obsah:

  1. Úvod
  2. FT232 KIT
  3. Počítačem řízeny A/D převodník
  4. Mikroprocesorová část softwaru
  5. Software pro PC
  6. Závěr
  7. Literatura

Úvod

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í).

FT232 KIT

FT232R

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.

img1.jpg, 14kB
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#
Tab. 1 Popis jednotlivých pinů/portů obvodu FT232RL dle datasheetu [1]

Počítačem řízeny A/D převodník

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.

IMG_4824.JPG, 41kB IMG_4825.JPG, 43kB
Obr. 2. Realizovaný modul převodníku.

Schéme modulu převodníku:

ftdi232-schema.gif, 8,0kB
Obr. 3. Schéme modulu převodníku.

Deska plošných spojů:

ftdi232conv2.gif, 10kB
Obr. 4. Deska plošných spojů.

Mikroprocesorová část softwaru

Popis programu:

Program se skládá z 3 funkcí a dvou obsluh přerušení:

Funkce main: Funkce nastav_počet: Funkce nastav_vstup: Obsluha přerušení AD převodníku: Obsluha přerušení při příjmu dat UARTem:

zdrojový kód:

    /* 
      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
          }                                   
     }

 

Software pro PC

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).

Popis programu:

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.

Výpis M-file:

  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);

Závěr

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.

Seznam literatury

[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.