Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATmega32, ATmega8 i UART -transmisja dwukierunkowa

Robiot 02 Kwi 2008 11:47 1075 0
  • #1 02 Kwi 2008 11:47
    Robiot
    Poziom 12  

    Witam,
    Proszę o pomoc w uruchomieniu transmisji UART w procesorach ATmega. Chodzi konkretnie o podłączenie procesora ATmega32 oraz ATmega8.
    Transmisja ma odbywać się w dwóch kierunkach wg następującego schematu:
    1. Atmega32 wysyła bajt do ATmega8
    2. ATmega8 odsyła bajt do ATmega32
    3. ATmega32 sprawdza czy to co wysłał zgadza się z tym co odebrał
    -jeśli NIE to wróć do 1
    -jeśli tak to dalej
    4. wysyłanie kolejnego bajtu.

    W wersji ostatecznej ATmega32 będzie wysyłał bajty do 6 innych procesorów ATmega8 ale na razie zatrzymałem się na połączeniu tylko 2 mikrokontrolerów.

    Oto to co mam w tej chwili:
    Do obu podłączyłem kwarce 11.059MHz i procesory skonfigurowałem tak by były taktowane właśnie z tych kwarców.

    Program wysyłania bajtu:

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define FOSC 11596201
    #define BAUD 19200
    #define MYUBRR FOSC/16/BAUD-1

    void uart_init(unsigned int ubrr)
    {
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char) ubrr;
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<TXCIE);
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }

    int main(void)
    {
    DDRC=0x00;
    uart_init(MYUBRR);
    sei();
    UDR=PINC;  //<do tego moje drugie pytanie
    while (1);
    }

    ISR (USART_TXC_vect)
    {
    UDR=PINC;
    }


    oraz program odbierania Bajtu:

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define FOSC 11596201
    #define BAUD 19200
    #define MYUBRR FOSC/16/BAUD-1

    void uart_init(unsigned int ubrr)
    {
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char) ubrr;
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }

    int main(void)
    {
    DDRB=0xFF;
    uart_init(MYUBRR);
    sei();
    while (1);
    }

    ISR (USART_RXC_vect)
    {
    PORTB=UDR;
    }

    Układ podłączyłem na płytce stykowej przewodami w następujący sposób:
    ATmega8:
    -kwarc na piny 9 i 10 (bez kondensatorów)
    -piny PINB0...5 przez rezystory 1k do masy (PIN6 i 7 to XTAL)
    - RESET podciągnięty przez rezystor 1k do VCC
    ATmega32:
    -kwarc na piny 12 i 13 (bez kondensatorów)
    - piny PORTC podłączone do masy lub do zasilania (abym miał możliwość testowania. Nie mogłem zostawić ich w powietrzu bo procek wysyłał przekłamane informacje)

    Przewody TxD oraz RxD są oczywiście skrzyżowane.

    PYTANIE:
    1. Jak zrealizować komunikację dwukierunkową wykorzystując przerwania (koniecznie !!). Według schematu komunikacji jak napisałem - zależy mi na 100% poprawności przekazywanych informacji bo procesory będą sterować położeniem silników. Brakuje mi już sił na wymyślanie tego. Może ktoś ma już coś takiego gotowego?

    2. Pierwsze próbne wysyłanie bajtu jest konieczne czy to jest jakiś błąd?? Chodzi o to że z początku procesor nie ma ustawionego bitu potwierdzenia wysłania i się "zawiesza". Jak to zrobić fachowo tak jak należy?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME