ATmega16 jungimas su kompiuteriu (USB)

Pirmiausia pramokus šiek tiek kaip elgtis su LED’ais, mygtukais prijungtais prie ATmegos, greitai atsiranda noras surinkta informaciją atiduoti kompiuteriui arba iš kompiuterio pasiųsti tam tikras komandas, kad kontroleris galėtu jas vykdyti.

Taigi pirmasis bandymas buvo pasinaudojus MAX232 ir COM <-> USB perėjimu perduoti/priimti informaciją su kontroleriu. Nežinau tai buvo litavimo klaida, o gal sugebėjau kažkaip sugadinti MAX232, bet niekaip nepavyko priimti duomenų iš ATmegos. Išsiųsti sekėsi puikiai, kontroleris junginėjo LED’us pagal kompiuterio siunčiamas komandas.

Pasibaigus kantrybei buvo nuspręsta atsisiųsti jau pagaminta UART’ą. DealExtreme e parduotuvė čia puikiai pasitarnavo. Pajungus viskas iškarto veikė. Duomenys vaikščiojo į abi puses.

Linux’as įrenginį atpažysta taip:

[ 7884.863380] usbserial: USB Serial support registered for generic
[ 7884.864737] usbcore: registered new interface driver cp210x
[ 7884.864756] usbserial: USB Serial support registered for cp210x
[ 7884.864798] cp210x 2-5:1.0: cp210x converter detected
[ 7884.864951] usb 2-5: cp210x converter now attached to ttyUSB0

Pirma klaida dėl kurios galima ilgam strigti tai RX sujungimas su RX, o TX su TX. Teisingas jungimas būtų ATmegos16A RXD (14’ta koja) reikia jungti su UART’o TX’u, o ATmega16A TXD (15’ta koja) reikia jungti su UART’o RX’u. Reiktu neužmiršti sujungti ir trečiojo laido tai GND.

Kad būtų patogiau, panaudojau laidus iš kompiuterinio korpuso.

IMGP9853.PEF_MLSZSX

Testavimui susikompiliuoju tokį kodą:

// Kvarco taktinis dažnis
#define F_CPU 4000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

// Susijungimo greitis
#define USART_BAUDRATE 9600UL
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


void USARTInit(uint16_t ubrr_value)
{
   //Set Baud rate

   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*
   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit
   >> char size 8
   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);

   //Įjungiam gavima ir siuntimą
   UCSRB=(1<<RXEN)|(1<<TXEN);


}



//Funkcija naudojama duomenims nuskaityti
//Ši funkcija lauks tol kol atsiras kažkokie duomenys
char USARTReadChar()
{
   while(!(UCSRA & (1<<RXC)))
   {
      //Nieko nedarom
   }
   return UDR;
}

//Rašom duomenys į UART'ą
void USARTWriteChar(char data)
{
   while(!(UCSRA & (1<<UDRE)))
   {
      //Nieko nedarom
   }
   UDR=data;
}


void main()
{
   // Kintamasis
   char data;

   // Susijungiam
   USARTInit(BAUD_PRESCALE);

   // Amžinas ciklas
   while(1)
   {
      // Nuskaitom simbolį
      data=USARTReadChar();

      // Nuskaitytą simbolį gražinam atgal tik
      // jį apskliaudžiam laužtiniais skliaustais    

      USARTWriteChar('[');
      USARTWriteChar(data);
      USARTWriteChar(']');

   }
}

Rezultatas:
Ekranvaizdis - 2015.01.26 - 20:49:41

Leave a Comment

  Wordpress Theme Protected By Wp Spam Blocker

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close