Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Komunikacja przez USB pomiędzy atmega32 i asus

marcuss99 21 Kwi 2012 16:06 1359 4
  • #1 21 Kwi 2012 16:06
    marcuss99
    Poziom 6  

    Witam. Niedawno zacząłem się bawić programowaniem mikrokontrolera atmega32 zawartego w zestawie evb 4.3. Pojawił się problem w momencie, kiedy chciałem połączyć zestaw ze swoim laptopem.

    Kod dla mikrokontrolera:

    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>

    #include "lcd.h"

    void usart_init(unsigned int baud);
    void usart_transmit( unsigned char data);
    int usart_receive (void);


    int main(void)

    {   
       
       lcd_init();
       
       usart_init(9600);
       while(1)
       {
       
       usart_transmit('a'); //wyslij znak 'a'
       usart_transmit('0x0d'); //wyslij znak CR(enter)
       usart_transmit(0x0a); // wyslij znak LF(nowa linia)
       _delay_ms(1000);
       
       
       
       
       _delay_ms(1000);
       lcd_str(" ");
       
       }
    }


    void usart_transmit( unsigned char data)
    {
       while(!(UCSRA & (1<<UDRE)));
       
       
       UDR = data;
    }

    void usart_init(unsigned int baud)
    {
       UBRRH = (uint8_t)(baud>>8);
       UBRRL = (uint8_t)(baud);
       
       UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //enable receiver, enable transmitter
       
       UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // 2 bity stopu, 8bitow danych
    }

    int usart_receive (void)
    {
       while(!(UCSRA & (1<<RXC)));
       
       return UDR;
    }


    A to kod napisany w Dev cpp obslugujacy port COM3 od strony laptopa:

    Code:

    #include <windows.h>
    #include <stdio.h>
    #include <cstdlib>

    int main()
    {
       HANDLE hCom;    //uchwyt portu
       DCB dcb;        //konfiguracja portu
       BOOL fSuccess;  //flaga pomocnicza
       BYTE RS_buf;    //bufor danej
       DWORD RS_ile;   //ilosc bitow wyslanych
       
       //otwarcie portu COM1 z prawami RW
       hCom = CreateFile( TEXT("COM3"), GENERIC_READ | GENERIC_WRITE,




            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     
       if (hCom == INVALID_HANDLE_VALUE)
       {
            printf("CreateFile failed with error %d.\n", GetLastError());
         
            return 1;
       }

       //pobranie aktualnych ustawien portu
        fSuccess = GetCommState(hCom, &dcb);
        if (!fSuccess)
        {
          printf ("GetCommState failed with error %d.\n", GetLastError());
          return 2;
        }

       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_9600;     // predkosc transmisji
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = TWOSTOPBITS;    // dwa bity stopu

       fSuccess = SetCommState(hCom, &dcb);

       if (!fSuccess)
       {
          printf ("SetCommState failed with error %d.\n", GetLastError());
          return 3;
       }
       
       //wyslanie 1 bajta przez RS
     /* while(1)
      {
               RS_buf=1;
               //Sleep(30);
        fSuccess = WriteFile( hCom, &RS_buf, 1, &RS_ile, 0);
        if (!fSuccess)
        {
          printf ("WriteFile failed with error %d.\n", GetLastError());
          return 4;
        }
       
    }*/
       while(1)
       {           
            fSuccess = ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);
         
            if (!fSuccess)
            { 
                printf ("ReadFile failed with error %d.\n", GetLastError());
             
            }
         printf("%c", RS_buf);
           
           
       
       }
     
    }


    Niestety komunikacja nie działa. Proszę o pomoc

    0 4
  • #2 21 Kwi 2012 23:39
    hotdog
    Poziom 26  

    Popełniasz podstawowy błąd testując 2 rozwiązania ze sobą.

    Z takim podejściem szybko się podłamiesz. Nie wiesz co jest zepsute:
    - program na uC
    - program na PC
    - sprzętowy problem z uC

    A może i wszystko naraz. Musisz eliminować możliwe przyczyny czemu "nie działa".

    Urządzenie z mikroprocesorem przetestuj korzystając z terminala np. http://realterm.sourceforge.net/

    Jak okaże się że wszystko działa ok, to wtedy weź się za program na PC. Obsługa portu szeregowego, mimo że możliwa (bo sam ją wykorzystywałem) pod C++/C jest upierdliwa. Jak możesz to lepiej skorzystaj z C# lub C++ buildera. Mają kontrolki do tego.


    Pozdrawiam

    0
  • #3 23 Kwi 2012 08:25
    marcuss99
    Poziom 6  

    Bez wzlędu na to, co wysyłam, terminal odbiera same zera. Nie wiem, co może być nie tak..

    0
  • #4 23 Kwi 2012 10:49
    hotdog
    Poziom 26  

    Ustawiłeś w terminalu 2 bity stopu?

    0
  • #5 23 Kwi 2012 14:46
    marcuss99
    Poziom 6  

    Ustawiłem, to nie w tym problem

    0