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

Komunikacja Atmega16-PC po rs232

e-nDrju 19 Paź 2011 15:59 1332 3
  • #1 10043468
    e-nDrju
    Poziom 11  
    Witam
    Mam taki problem. Grzebiąc po archiwach elektrody znalazłem gotowe funkcje do inicjalizacji USART i transmisji danych. Niestety, w HyperTerminalu wyskakują mi "śmieci" zamiast tego, co chciałem przesłać. Domyślam się, że może być problem z dobraniem argumentów przy inicjalizacji. Dodam, że komunikacja odbywa się prawidłowo, gdy piszę w Bascomie, więc problemy natury elektronicznej odpadają. Korzystam z wewnętrznego oscylatora RC. Czy ktoś mógłby mnie naprowadzić na jakiś trop? Z góry dziękuję.

    #define BAUD 4800
    #define FOSC 1000000     // tu definiujesz wartość uzywanego kwarcu 
    #define MYUBRR FOSC/16/BAUD-1
    #include <avr/io.h>
    
    
    void USART_Init( unsigned int ubrr)
    {
    /* Set baud rate */
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    /* 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(void)
    {
    USART_Init ( MYUBRR );
    for(;;)
    {
    USART_Transmit(1234);
    }
    }
    
  • #2 10043542
    darek1632
    Poziom 15  
    Witaj, w funkcji wysyłania znaku deklarujesz argument jako unsigned char:
    
    void USART_Transmit( unsigned char data )
    

    zmienna unsigned char może przyjmować wartości od 0-255, wiec dlaczego wpisujesz do niej 1234 ? Poza tym jest to zmienna znakowa wiec możesz to zrobić tak.
    USART_Transmit( 'A' );
  • #3 10043716
    tmf
    VIP Zasłużony dla elektroda
    Po skompilowaniu tego programu ile masz warningów i gdzie? Odpowiedz sobie na to pytanie a znajdziesz jedną z możliwych przyczyn błędów w terminalu.
    Kolejna sprawa - wewnętrzny generator w ATMegach jest nie za bardzo dostosowany do taktowania USART - może działać lecz nie musi, a prawie na pewno będzie sprawiać kłopoty. Użyj XMega lub kwarcu.
    I kolejna rzecz - jak powielasz wzorce to staraj się powielać dobre, a o takie trudno. Po co ta cała gimnastyka z UBRR, skoro AVR-libc udostępnia gotowe i sprawdzone definicje odpowiedzialne za wyliczenie wartości tego rejestru?
  • #4 10064909
    pawel-jwe
    Poziom 30  
    Do deklaracji częstotliwości pracy mikrokontrolera używasz "FOSC 1000000", jeśli korzystasz z AVRStudio (który używa oznaczenia "F_CPU") to musisz jeszcze ustawić tą samą częstotliwość w opcjach kompilatora i powinno być ok (albo zmień nazwę oznaczenia, chociaż osobiście wolę ustawiać to w kompilatorze).
REKLAMA