logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega 162][WinAVR]Problemy z USART-em.

Jac_en 18 Maj 2008 19:52 3641 11
REKLAMA
  • #1 5154319
    Jac_en
    Poziom 10  
    Witam. Na początku wypada wspomnieć że jestem początkującym elektronikiem.
    Problem wygląda następująco: podczas próby wysłania jakichkolwiek znaków do PC przy pomocy Atmegi 162 i nadajnika RS232 Maxima komputer nie odbiera żadnych znaków(tylko chaszcze, zera itp.) Zaznaczam że:
    1) Prędkość transmisji zarówno w kodzie jak i programie do przechwytu na PC(Realterm 2.0.0.57) jest taka sama;
    2)ilość bitów stopu i bitów danych jest ta sama;
    3)używam zewnętrznego kwarca 11,059MHz i następująco ustawiłem fusy - CKSEL 3:1 - "111" ; CKSEL0 - "0" ; SUT 1:0 - "10";
    4)między kwarcem i GND - kondensatory 22pF;
    5)fus "M161C" pozostawiam niezaprogramowany(w PonyProgu niezaznaczony);
    6)w WinAVR "Makefile" został odpowiednio skonfigurowany - dobra nazwa pliku, odpowiedni uC i kwarc;
    7)sam kod kompiluje się bez problemów;

    Jeśli chodzi o kod to został żywcem ściągnięty z noty Atmela. Sam nadajnik RS232 działa bez zarzutu ponieważ posiadam również zaprogramowaną przy pomocy podobnego kodu Atmege128 i jak tylko przełączę kabel na jej TxD - komputer odbiera wysyłane kody ASCII.

    
    #include <avr/io.h>
    #define FOSC 11059000// Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    
    void USART_Init( unsigned int ubrr )
    {
    /* Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    /* Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop bit */
    UCSR0C = (1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
    }
    
    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)));
    /* Put data into buffer, sends the data */
    UDR0 = data;
    }
    
    int main( void )
    {
    int n;
    USART_Init(MYUBRR);
    n=0;
    while(1) 
    {
     for(n=32;n<127;n++) 
     {
     USART_Transmit(n); 
     }
    }
    return 0;
    }
    


    Jeśli ktoś się zainteresuje to poniżej link do noty Atmeg-i 162:

    http://www.atmel.com/dyn/resources/prod_documents/doc2513.pdf
  • REKLAMA
  • #2 5160957
    Jac_en
    Poziom 10  
    Witam ponownie.
    Doszedłem do następujących rzeczy:
    1) jeśli ustawę prędkość transmisji BAUD na 9600 to Realterm poprawnie odbiera znaki dla zaznaczonej prędkości trans 1200
    2) jeśli ustawę prędkość transmisji BAUD na 1200 to Realterm poprawnie odbiera znaki dla zaznaczonej prędkości trans 150

    9600:1200=8
    1200:150=8

    Prędkość transmisji w terminalu musi być ustawiona 8 razy mniejsza aby komunikacja przebiegała bezproblemowo. O co choooo ???!!!
  • REKLAMA
  • #3 5161113
    adamusx
    Poziom 27  
    Witam.

    Wydaje mi się że dla zewnętrznego kwarcu większego od 8MHZ wszystkie CKSEL musza być niezaprogramowane (w PonyProg muszą być odznaczone ptaszki) natomiast CKOPT musi być zaprogramowanie (w pony prog ustawiasz ptaszek).


    Poza tym zawsze dobrze jest sprawdzic czy przypadkiem stworzona formulka do obliczana predkosci transmisji dziala poprawnie.
    Wpisz na stale:
    Dla kwarcu 11052000 i predkosci 9600:

    UBRR0H = 0;
    UBRR0L = 71
    
  • #4 5161542
    Jac_en
    Poziom 10  
    Niestety to nie to. W Atmega162 nie ma fusu CKOPT. A co do samej formułki obliczania prędkości to jest ona z noty katalogowej Atmela i działa dla Atmegi128 i Atmegi16 wiec powinna dla Atmegi162 również działać.. Próbowałem również wpisać odpowiednie wartości do UBRR, ale u mnie wyglądało to tak:

    
    UBRR0H = 0x07;
    UBRR0L = 0x01;
    


    Próbowałem w taki a nie inny sposób, ponieważ z tego co mi wiadomo w przypadku obliczenia dwucyfrowej wartości którą należy wpisać do rejestru UBRR -> MSB wpisujemy do UBRRH a LSB do UBRRL.

    Niestety nic się nie poprawiło...
  • REKLAMA
  • #5 5162218
    adamusx
    Poziom 27  
    Jac_en napisał:
    Próbowałem również wpisać odpowiednie wartości do UBRR, ale u mnie wyglądało to tak:

    
    UBRR0H = 0x07;
    UBRR0L = 0x01;
    


    Dla predkosci 9600 i kwarcu jak u Ciebie do rejestru UBRR0 trzeba wpisac wartość 72, więc dlaczego wpisujesz wartość 1793 ?? ( 0x07<<8 + 0x01)

    Niestety nic się nie poprawiło...
  • REKLAMA
  • #6 5162973
    Jac_en
    Poziom 10  
    Trzeba wpisać wartość 71. Nie ma takiego rejestru UBRR0. Jest albo UBRROH albo UBRR0L i do nich należy wpisać 71. Przyznam szczerze że nie wiem co oznacza zapis:
    
    UBRR0H = (unsigned char)(ubrr>>8);
    

    ale skoro chula dla Atmegi16, którą posiadam z tym samym kwarcem i był jednocześnie podany w nocie Atmegi162 nie bardzo rozumeim dlaczego miałby być błędny. Reasumując: nie wiem jak dokładnie wpisać wartość 71 do UBRR1H i UBRR1L :/
    
    UBRR1H = 0x00;
    UBRR1L = 0x47;
    


    Dla powyższego zapisu bez zmian - jeśli po stronie kopa jest 1200 to jest ok.
  • #7 5163488
    kamyczek
    Poziom 38  
    Kolega ćwiczy procesor na wewnętrznym oscylatorze RC albo ma ustawiony znacznik CKDIV8 który powoduje podział zegara systemowego przez 8. Proponuje poczytać o "fuse bitach"
  • #8 5163711
    Jac_en
    Poziom 10  
    Kolega nie ćwiczył procesora na wewnętrznym jak było napisane wcześniej, ale miał zaprogramowany CKDIV8. Zmiana tego fusa naprawiła wszystko. Dziękuję za pomoc.
  • #9 5470849
    kobr
    Poziom 11  
    Witam podczepię się pod ten wątek. Również mam atmege 162 oraz układ max232IN.
    atmega ma standardowe ustawienia. Wgrałem do niej kod Jac_ena zmieniając jedynie FOSC na 1000000. W terminalu ustawiłem
    Baudrate 9600
    Parity none
    Databits 8
    Stopbits 2
    Handshake none
    Emulation none.
    Co może być przyczyną tego, że w terminalu otrzymuje krzaki? Raczej wszystko dobrze polutowane zgodnie z pdfami.
  • #10 5471164
    snow
    Poziom 31  
    Prawdopodobnie to że kwarc 10MHz nie jest zalecany do transmisji po RSie
  • #12 5473784
    kobr
    Poziom 11  
    ale u mnie częstotliwość na 1Mhz jest standardowo, baud zmniejszałem i nic sie nie poprawiło natomiast sprzęt sprawdzałem kilkukrotnie i wszystko jest tak jak powinno być, ewentualnie kondensatory złe (są 1u) ale w pdfie pisało ze 1u i takie dałem
REKLAMA