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

<SOLVED> AVR UART wysyła 7 bitów danych zamiast 8

cszawisza 15 Mar 2012 22:23 1477 6
REKLAMA
  • #1 10682809
    cszawisza
    Poziom 10  
    Witam.
    Dzień cały męczę się żeby zrobić głupią komunikację opartą na RS232->PC gdzie nadajnikiem jest uC amtega8-8pu i nie mogę dojść co robię nie tak...

    oto mój kod (mocno skrócony ale nadal nie działający tak jak powinien)

    
    #include <avr/io.h>
    #include <stdio.h>
    
    #define BAUD 9600
    #define MYUBRR  F_CPU/BAUD/16-1
    
    void USART_init(unsigned int myubrr)
    {
      /* Ustala prędkość transmisji */
      UBRRH = (unsigned char)(myubrr>>8);
      UBRRL = (unsigned char)myubrr;
    
      /* Włącza nadajnika */
      UCSRB = (1<<TXEN)|(1<<RXEN);
    
      /* Format ramki: 8 bitów danych, 1 bit stopu, brak bitu parzystości */
      UCSRC = (1<<URSEL) | (1<<UCSZ0 ) | (1<<UCSZ1) ;
    }
    
    
    /* Wysyła znak do portu szeregowego */
    static int USART_Transmit(char c, FILE *stream)
    {
      while(!(UCSRA & (1<<UDRE)));
      UDR = c;
    
      return 0;
    }
    
    
    /* Tworzy strumienia danych o nazwie 'mystdout' połączony
        z funkcją 'USART_Transmit' */
    static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit, NULL, _FDEV_SETUP_WRITE);
    
    int main(void)
    {
      USART_init(MYUBRR);
      stdout = &mystdout;
      uint8_t i=0xa4;
     while(1)
        {
    printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
          while(i){
          printf("Testowanie funkcji UART_putint()");
          printf("\n");
          i--;
          }
    
          printf("\n");
          printf("Testowanie funkcji UART_getchar() i UART_putchar()");
          printf("\n");
          printf("Wyslij cokolwiek z terminala, znak \"t\" konczy...");
          printf("\n");
          printf("Testowanie funkcji UART_getstr() i printf()");
          printf("\n");
          printf("Wyslij cokolwiek z terminala i nacisnij ENTER");
          printf("\n");
    
          }
    
    }
    


    i teraz zauważyłem że UART działa lepiej jak ustawie w odbiorniku 7 bitowe słowo danych
    PRÓBKA
    
    aaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji URT_putint()
    Testowanie funkcji UART_putint()
    Testowanie funk UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testownie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowaniefunkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testoie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putin()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_utint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowafunkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Teanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putintestowanie funkcji UART_putint()
    

    a jeśli jest 8 bitów to wtedy
    
    aaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Testowanji UART_putint()
    T\0xe5stowanie funkcji UART_putint()
    Testowa\0xeeie funkcji UART_putint(\0xa9
    Testowanie funkcji UART_putint()
    Testowanie fART_putint()
    Testowanie fu\0xeekcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_puti\0xeet()
    Testowanie fun\0xebcputint()
    \0xd4estowanie funkcji UART_putint()
    Testowanie funkcji UAR\0xa8)
    Testowanie funkcji UART_putint()
    Testowa\0xeeie funkcji U\0xc1RT_pu\0xf4itowanie f\0xf5nkcji UA\0xd2T_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie f\0xf5nkcji UART_putint()nie funkcji UART_putint()
    Testowani\0xe5 funkcji UART_puti\0xeet()
    TestoART_putint()
    Testowanie funkcji UART_\0xf0utint\0xa8)
    Testowanie funkcjitint()
    Testowanie funkcji UART_putint()
    Testowanie\0xa0funkcji UART_cji UART_p\0xf5tint()
    Testowa\0xeeie funkcji UART_p\0xf5tint()
    Testowanie fufunkcji UART_puti\0xeet()
    Testowanie fun\0xebcji UART_putint()
    Testow\0xe1nie funkcji UART_p\0xf5tint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testowanie funkcji UART_p\0xf5tint()
    Testo\0xf7anie funkcji UART_putint()
    Testowanie funkcji UART_putint()
    Testo\0xf7anie funkcji UART_putint()
    Testowani\0xe5 funkcji UART_putint()
    Testowanie fu\0xeekcji UART_putint()
    Testowanie funkcji UAR\0xd4_puti\0xeet()
    Testowanie fu\0xeekcji UART_putint()
    Testowanie funkcji UAR\0xd4_putint()
    Testowanie funkcji UART_putint()
    


    już dość długo nad tym siedzę i nie wiem czym to może być spowodowane... Do przesyłania sygnały wykorzystuję parę skrętki o długości 1,5 m (no może 2 ale wątpię) cały czas korzystam z linuxa i programu cutecom (jak dotąd działał OK) próbowałem już przesyłać wykorzystując przerwania, z tym samym skutkiem. Prędkość >19200 jest praktycznie nieosiągalna, na mniejszych jakoś działa, aczkolwiek również są błędy, pamiętam że jeszcze całkiem niedawno temu testowałem uart i działało to bardzo dobrze na tej samej konfiguracji i z dużo większymi prędkościami.
    Może mam gdzieś błąd w kodzie którego nie potrafię zlokalizować...
    Pozdrawiam zawisza
  • REKLAMA
  • #2 10682992
    mattsk
    Poziom 13  
    błędu nie widze ale może spróbuj z tak napisanym programem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    na atmedze 16 i 32 działa bez problemu nawet z 57600, na atmedze8 też pownno śmigać (jeżeli błąd jest gdzieś w sofcie a nie w hardwerze ;p)
    ;)
  • REKLAMA
  • #3 10683100
    cszawisza
    Poziom 10  
    Cytat:
    #define F_CPU 16000000UL


    nie mam kryształku... Tylko wewnętrzny oscylator
    F_CPU mam ustawione na 8000000 i podaje tą wartość w lini poleceń
  • REKLAMA
  • #4 10683158
    janbernat
    Poziom 38  
    No to musisz dostroić wewnętrzny oscylator albo jednak zaiwestować w kryształek.
    11059200 będzie dobry.
  • REKLAMA
  • #5 10683207
    cszawisza
    Poziom 10  
    Jeżeli to kwestia dostrojenia, to dlaczego odbierając 7 bitów zamiast 8 mam dane "poprawniejsze" niż jak odbieram normalnie 8? I drugie pytanie w jaki sposób dostroić ten oscylator? (w sensie żeby dojść czy mam za wysoką częstotliwość czy za niską niż wymagana do transmisji)
  • #6 10683267
    janbernat
    Poziom 38  
    No bo 7 bitów jest nieco krótsze niż 8.
    Wtedy ramka się nieco mniej rozłazi- mimalnie mniej ale jednak.
    Znajdź rejestr OSCCAL i tam można sobie dostrajać.
    Ale wraz ze zmianą temperatury czy napięcia zasilania to sie jednak rozłazi.
    Jednak kwarc jest lepszy niż generator RC.
  • #7 10683720
    cszawisza
    Poziom 10  
    no 7 bitów jest krótsze, ale ja jednak zmieniam to tylko po stronie odbiorczej, więc nadal wysyłam bitów 8 i nie rozumiem w jaki sposób ten ostatni się nie gubi :) dziś kupię kwarc i zobaczę jak zmieni się zachowanie uart'a
    Pozdrawiam zawisza

    //Pomogło ;) dzięki
REKLAMA