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

ATMEGA8(L) komunikacja z PC przez RS232

31 Sie 2006 19:35 4549 9
  • Poziom 26  
    Witam

    Otóż kolejnym krokiem w moich postępach z uC jest komunikacja z PC poprzez RS232. Schemat połączenia poniżej.

    ATMEGA8(L) komunikacja z PC przez RS232

    Dodam, że mam zainstalowany program Advanced Serial Port Monitor 3.5.1 build 31, który monitoruje zamiany na porcie RS232 PC.
    Pytanie jakie się nasuwa to czym jest ten "baud" i jaką wartośc powinien przyjąć, aby poprawnie zainicjalizować port RS232??

    Dodano po 20 [minuty]:

    Właśne użyeł mfunkcji z manuala:
    Code:
    void USART_Transmit( unsigned int data )

    jako argument wpisałem "55"

    Kod się skompilował, ale po wysłaniu kodu do uC w oknie programu nic sie nie pojawiło:| - albo coś źle wysyłam z uC albo mam źle skonfigurowany ten program. Czy ktoś wie jak go skonfigurować ??
    Kod:

    Code:
    #include <avr/io.h>
    
    #include "priv.h"

    void USART_Init( unsigned int baud )
    {
    /* Set baud rate */
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Enable Receiver and Transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }

    void USART_Transmit( unsigned char data )
    {
       /* Wait for empty transmit buffer */
       while ( !( UCSRA & (1<<UDRE)) );
       /* Put data into buffer, sends the data */
       UDR = data;
    }

    unsigned char USART_Receive( void )
    {
       /* Wait for data to be received */
       while ( !(UCSRA & (1<<RXC)) );
       /* Get and return received data from buffer */
       return UDR;
    }

    int main (void)
    {
       delayms (10);
       USART_Init( 2 );
       delayms (10);
       USART_Transmit( 55 );
       delayms (10);
       return (0);
    }
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 14  
    witam

    BAUD to w skrócie prędkość transmisji. W datasheecie jest taki wzór, z którego wynika:

    UBRRH = (unsigned char)((USART_F/(16UL*USART_BAUD)-1)>>8);
    UBRRL = (unsigned char)(USART_F/(16UL*USART_BAUD)-1);

    gdzie:
    USART_F - taktowanie procka. np. 16MHz
    USART_BAUD - prędkość transmisji, czyli np. 9600 bps

    Korzystając z powyższego wzoru ustawiasz UBRR tak, aby odpowiadał pożądanej prędkości transmisji. Szczegóły zobacz w datasheecie.

    pozdrawiam
  • Poziom 26  
    Witam ponownie

    Otóż, skompilowałm poniższy kod i wsadziłem do do uC:

    Code:
    #include <avr/io.h>
    

    void USART_Init( unsigned int baud )
    {
       /* Set baud rate */
       UBRRH = (unsigned char)(baud>>8);
       UBRRL = (unsigned char)baud;
       /* Enable Receiver and Transmitter */
       UCSRB = (1<<RXEN)|(1<<TXEN);
       /* Set frame format: 8data, 2stop bit */
       UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }


    void USART_Transmit( unsigned char data )
    {
       /* Wait for empty transmit buffer */
       while ( !( UCSRA & (1<<UDRE)) );
       /* Put data into buffer, sends the data */
       UDR = data;
    }

    int main ()
    {
       USART_Init (9600);
       delayms (5);
       
       for (;;)
       {
          USART_Transmit( 69 );
          delayms (200);
       }
       
       return (0);   
    }


    Do monitorowania portu RS232 w PC użwam programu Advanced Serial Port Monitor.

    Program na wysyłanie danych odpowiada miganiem zielonej "diody" na dolnym pasku okna programu, ale nic poza tym......
    Jak nie trudno zauważyć, dane jakie są wysyłane pod RSie to liczba 69 czyli "E" - lecz ono się nigdzie nie wyświetla.

    Jak można przy pomocy tego programu wyświetlić wysłane dane z uC ??

    Dodano po 40 [minuty]:

    Dodam, że na dolnym pasku okna programu wświetlił się napis UART receiver error ;| - czyżby coś było nie tak ??
  • Poziom 27  
    A ustawiles tak jak kolega wczesniej wspomnial takie same predkosci transmisji?

    Z tego co pamietam Advenced Port Monitor nie wyswietli danych jesli sa nadawane z inna predkoscia.

    Odpal Hyper Terminal i zobacz czy odbiera poprawne dane czy jakies smieci.
  • Poziom 26  
    przemo.t napisał:
    A ustawiles tak jak kolega wczesniej wspomnial takie same predkosci transmisji?

    Z tego co pamietam Advenced Port Monitor nie wyswietli danych jesli sa nadawane z inna predkoscia.


    Prędkości są ustawione na jednakowe wartości - 9600 bps.
    Poza tym, to jak mam poprawnie skonfigurować ten program ??
    czy tak jest dobrze ??:
    ATMEGA8(L) komunikacja z PC przez RS232
    I co dalej ?? Przechwyć tekst, czy jak ??:)

    yyyy....tak sobie myśle czy po inicjalizacji, a przed wysyłaniem danych nie trzeba wysłać jakiejś rameczki ??
  • Poziom 14  
    Nie zmieniłeś kodu odpowiedzialnego za ustawienie UBRRH i UBRRL. Podałem ci wcześniej wzór jaki wiąże prędkość transmisji z UBRR.
    Do UBRR NIE WPISUJE SIĘ bezpośrednio BAUD.
    Do testów użyj raczej Hyper Terminal. Jest banalny w obsłudze. Wystarczy ustawić parametry transmisji.

    Jak chcesz to mogę ci wysłać moje funkcje do obsługi RS232.

    Pzdr

    Dodano po 26 [minuty]:

    w opisie kodu masz masz napisane:
    /* Set frame format: 8data, 2stop bit */

    czyli w programie musisz ustawić:

    prędkość: 9600
    bity danych: 8!!! (bo tyle ustawiłeś w kodzie)
    parzystość: brak
    bity stopu: 2 (bo tyle ustawiłeś w kodzie)
    sterowanie przepływem: brak

    Jeżeli masz kwarc 4MHz i baud (czyli prędkość transmisji) 9600, to do UBRR musisz wpisać liczbę dziesiętną 25 (UBRRH = 0; UBRRL = 25;). Można takie informacje w datasheet'cie znaleźć.
  • Poziom 26  
    tom_ny napisał:
    Jeżeli masz kwarc 4MHz i baud (czyli prędkość transmisji) 9600, to do UBRR musisz wpisać liczbę dziesiętną 25 (UBRRH = 0; UBRRL = 25;).


    czyli dla kwarcu 8MHz (bo taki mam załozony aktualnie) UBRRH =0 i UBBRL = 51 .....

    czyli rozumiem, że zamiast tego kawałku kodu:

    Code:

    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;


    pisze najzwyczajniej:
    Code:

    UBRRH = 0;
    UBRRL = 25;


    czy inaczej ?? bo nie rozumie tego fagmentu kodu:
    Code:
    (unsigned char)(baud>>8);
    
    (unsigned char)baud;

    Fakt że w pierwszej linijce jest zwykłe przesunięcie bitowe.....ale te nawiasy są dziwne ;/.....
  • Pomocny post
    Poziom 14  
    Na schemacie widziałem 4MHz dlatego tak napisałem. Jeżeli masz 8MHz to, tak: 51 wpisujesz do UBRRL. Ale lepiej posłużyć się wzorem, gdyż możesz wtedy łatwo, szybko i przyjemnie zmienić prędkość transmisji.

    (unsigned char)(baud>>8);
    (unsigned char)baud;

    baud ogólnie może być większe niż 256, wtedy kompilator zapisuje go jako liczbę 2bitową. Jeżeli zrobić baud>>8 to pozbędziesz się młodszych bitów i zapiszesz do UBRR tylko starsze bity liczby.
    (unsigned char) to jest tzw. rzutowanie - informujesz kompilator, że wyrażenie po nawiasie ma traktować jak liczbę 8bitową bez znaku.
  • Poziom 26  
    właśnie wkleiłem zmieniony kod:

    Code:
    #include <avr/io.h>
    

    void USART_Init( unsigned int baud )
    {
       /* Set baud rate */
       UBRRH = 0;
       UBRRL = 51;
       /* Enable Receiver and Transmitter */
       UCSRB = (1<<RXEN)|(1<<TXEN);
       /* Set frame format: 8data, 2stop bit */
       UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }


    void USART_Transmit( unsigned char data )
    {
       /* Wait for empty transmit buffer */
       while ( !( UCSRA & (1<<UDRE)) );
       /* Put data into buffer, sends the data */
       UDR = data;
    }

    int main ()
    {
       USART_Init (9600);
       delayms (5);
       
       for (;;)
       {
          USART_Transmit( 69 );
          delayms (200);
       }
       
       return (0);   
    }


    i w terminalu zaczęły sie pojawiać takie śmieszne znaki - jakby świeczki :)

    Dodano po 12 [minuty]:

    oto znaki wyświetlone od (char) 0 do 255 :D prze terminal:
    Code:

     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
    abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹ŚŤŽŹ�‘’“”•–—˜™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°
    ±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ


    także jest bajkowo :D.
    Dzięki za pomoc. Pozdrawiam.

    Dodano po 59 [minuty]:

    Dziękuje bardzo wszystkim za pomoc w tym temacie.
    USART działa poprawnie zarówno na odbiorze jak i nadawaniu :).
    Temat zamykam. Raz jeszcze pozdrawiam.