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

ATMEGA32 USART RS232 "krzaki"

Md87 14 Mar 2010 15:34 3073 10
  • #1 7828777
    Md87
    Poziom 10  
    Witam. Na początku zaznaczę, że jestem początkujący i dopiero zaczynam programować AVRy. Próbowałem napisać program do obsługi RS232, który będzie wysyłał znak z uc na komputer. Niestety w terminalu zamiast wysłanego znaku widzę jakieś krzaki. Siedzę nad tym drugi dzień i nie mogę odkryć co robię nie tak. Układ który wykorzystuję to kupiony zestaw uruchomieniowy więc błąd leży pewnie po stronie programowej. Dodam jeszcze, że korzystam z adaptera USB-RS232 YT-105.
    Poniżej zamieszczam kod i screen z terminala(może błąd tkwi w jego konfiguracji bo nigdy tego nie robiłem). Będę wdzięczny za pomoc.
    Kod:
    
    #include <avr\io.h>
    
    
    
    #define CPU_Hz   8000000         
    #define BAUD   9600           
    #define MYUBRR  CPU_Hz/16/BAUD-1 
    
    
    
    
    // **** fukcje dla RS232 ****
    void USART_init(unsigned int ubrr)     
    {
       UBRRH = (unsigned char) (ubrr>>8);   
       UBRRL = (unsigned char) ubrr;
       UCSRB = (1<<RXEN)|(1<<TXEN);         
       UCSRC = (1<<URSEL)|(3<<UCSZ0);     
    } 
    
    int rs_put(char znak)
    {
     //oczekiwanie aż bufor nadajnika jest pusty
     while (!(UCSRA & (1<<UDRE))){}; 
     UDR = znak;
     return 0;
    }
    
    unsigned char rs_get (void)    // odebranie znaku
    {
       while (!(UCSRA & (1<<RXC)));
       return UDR;
    } 
    
    
    int main (void)
    {
     
      USART_init(MYUBRR); 
     
      char temp;
      temp='k'; //znak który ma być wysłany
      
      
     
    		for(int i=0;i<2;i++)
    		{
    			rs_put(temp); 
    		}
      
    	
    
    }
    

    screen:
    ATMEGA32 USART RS232 "krzaki"
  • #2 7828794
    LiMuBai
    Poziom 15  
    Nie analizowalem Twojego kodu, ale pierwsze co rzucilo mi sie w oczy to "adapter USB<>RS232" - z tym wlasnie czesto sa problemy.
    Postaraj sie podlaczyc bezposrednio do portu RS232 jesli masz taka mozliwosc.
    *(Screen'a nie widac)

    Co do kodu - poszukaj na elce - jest tego troche + google

    ---

    (moge sie mylic ale chyba cos namieszales przy ustawieniach USARtu - na poczatku kodu)
  • #3 7828831
    Md87
    Poziom 10  
    Cytat:
    Postaraj sie podlaczyc bezposrednio do portu RS232 jesli masz taka mozliwosc.


    Z tym może być problem, bo nie mam takiego portu (programuję na laptopie). Mój znajomy korzystał z tego samego adaptera i u niego wszystko działało, więc może to coś innego.
    Cytat:
    *(Screen'a nie widac)
    Screen to miniaturka trzeba kliknąć a będzie większy.
  • #4 7828850
    tadzik85
    Poziom 38  
    Mi tez wydaje się ze nie masz pełnej konfiguracji UARTU.
  • #6 7828962
    LiMuBai
    Poziom 15  
    Md87 napisał:
    Cytat:
    Postaraj sie podlaczyc bezposrednio do portu RS232 jesli masz taka mozliwosc.


    Z tym może być problem, bo nie mam takiego portu (programuję na laptopie). Mój znajomy korzystał z tego samego adaptera i u niego wszystko działało, więc może to coś innego.
    Cytat:
    *(Screen'a nie widac)
    Screen to miniaturka trzeba kliknąć a będzie większy.


    W momencie jak patrzylem na post - miniaturki nie bylo - najwyrazniej JESZCZE nie bylo (:

    Sluchaj sie RObaka - Robak dobrze mowi :D
  • #7 7829352
    l3sz3k
    Poziom 18  
    Md87 napisał:

    Poniżej zamieszczam kod i screen z terminala(może błąd tkwi w jego konfiguracji bo nigdy tego nie robiłem). Będę wdzięczny za pomoc.
    Kod:
    
    #define MYUBRR  CPU_Hz/16/BAUD-1 
    



    Być może źle wyliczasz UBRR, chodzi o kolejność działań.
    Zamień na :
    #define MYUBRR (CPU_Hz / (16 * BAUD))-1

    dla Fzeg = 8MHz i 9600b/s UBRR = 51 . sprawdź czy tyle Ci wylicza.

    No i upewnij się, że procesor pracuje na 8MHz, gdyż producent domyślnie ustawia zegar wew. 1MHz.
  • #8 7829779
    Md87
    Poziom 10  
    Cytat:
    dla Fzeg = 8MHz i 9600b/s UBRR = 51 . sprawdź czy tyle Ci wylicza.


    Nie wiem czy dobrze odczytuje to wartość UBRR, ale zrobiłem to w ten sposób:
    Następnie przeliczam sobie wartość z binarnych na dziesiętne. Problem w tym ze wychodzą jakieś głupoty bo UBRR=98 z czego wynikałoby, że proc nie ma 8MHZ tylko jakieś nietypowe 15 z hakiem jeśli dobrze liczę. Jak mogę sprawdzić jaka jest prawdziwa częstotliwość?
  • #10 7832238
    l3sz3k
    Poziom 18  
    Md87 napisał:
    Cytat:
    dla Fzeg = 8MHz i 9600b/s UBRR = 51 . sprawdź czy tyle Ci wylicza.


    Nie wiem czy dobrze odczytuje to wartość UBRR, ale zrobiłem to w ten sposób:
    Następnie przeliczam sobie wartość z binarnych na dziesiętne. Problem w tym ze wychodzą jakieś głupoty bo UBRR=98 z czego wynikałoby, że proc nie ma 8MHZ tylko jakieś nietypowe 15 z hakiem jeśli dobrze liczę. Jak mogę sprawdzić jaka jest prawdziwa częstotliwość?


    Kolego, a o czymś takim jak debugger słyszałeś? Jeśli nie to proszę poczytaj o tym i zacznij używać.
    Zegar możesz sprawdzić po lock bitach lub programowo zmieniając stan linii portu z opóźnieniem 1 sekundy.
  • #11 7833582
    Md87
    Poziom 10  
    Problem rozwiązany. Zaprogramowałem jeszcze raz fuse bity na wewnętrzny kwarc 8MHz i zadeklarowałem stałą 16 we wzorze na UBRR jako unsigned long int czyli 16ul. Dzięki wszystkim za pomoc.
REKLAMA