Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega32 na ZL3AVR i nie działający USART

12 Sty 2010 17:24 1449 5
  • Poziom 2  
    Poniżej wklejam kod najprostszego programu jaki można sobie wyobrazić do wysyłania czegokolwiek przez USART. Program ten jest wynikiem mojej desperacji. Od wielu wielu dni testuje programy swojego autorstwa i sciągnięte z neta gotowce (wg ich opisu i komentarzy działające bez zarzutu) i nie mogę uzyskać jakiejkolwiek komunikacji przez USART. Potrzebuję komunikacji dwustronnej, ale obecnie będę zadowolony jeżeli odbiorę chociaż jeden znak. Czy ktoś ma jakikolwiek pomysł dlaczego to nie działa? Pracuje na zestawie jak w temacie (ZL3AVR), programator działą, Atmega działa. Mam drugi taki zestaw, więc mogę to sprawdzać. Na samym dole zamieszczam screen fusów z Pony Prog.

    Uprzedzając pytania: zapoznałem się z datasheetem do Atmegi, do zestawu ZL3 i przeszukałem całe forum elektrody i pokaźną część internetu w poszukiwaniu odpowiedzi na moją bolączkę. To wcale nie wyklucza, że mamy do czynienia z błahym problemem, bo nie mam specjalnie dużego doświadczenia w programowaniu AVR.

    Code:
    #include <avr\io.h>
    
    #define xtal 16000000L
    #define baud 9600

    void main(void)
    {
       // Calculate UBRR correctly using large temp variables
          uint32_t temp;
          temp = (xtal/(16 * baud))-1;
          UBRRH = (temp >> 8);
          UBRRL = (temp & 0xFF);

       // Initialize UCSRB
          UCSRB= (1 <<RXEN | 1 << TXEN );
       
       // Initialize UCSRC cprrectly
          UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
       
       while(1)
       {
          // Loop until UDR register is empty
             while((UCSRA & (1 <<UDRE)) == 0);
         
          // Transmit letter a
             UDR = 'a';
       };
    }


    Atmega32 na ZL3AVR i nie działający USART
  • Pomocny post
    Poziom 18  
    Może masz gdzieś linie TXD i RXD niepotrzebnie (nie)skrosowane?
  • Poziom 2  
    To nie to. Sprawdzałem.
  • Pomocny post
    Poziom 18  
    Ja mam u siebie troche inaczej. Ale najlepiej skorzystać z datasheeta bezczelnie kopiując kod.
    Po co Ci to L po określeniu taktowania? Piszesz w WinAVR czy czymś innym?

    Init:

    Code:
    #define FOSC 8000000// Clock Speed
    
    #define BAUD_GPS 9600
    #define MYUBRR_GPS FOSC/16/BAUD_GPS-1
    //////////////////////////////////////////////////////
    void USART_Init( unsigned int ubrr)
    {
    /* Set baud rate */
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    /* Set frame format: 7slowo, 2stop bit, Odd Parity */
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    }


    Wysyłanie:

    Code:
    void USART_Transmit(char data )
    
    {
    /* count for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */

    UDR = data;
    }

    void USART_Transmit_Word(char *slowo)
    {
       int n=0;
       while (slowo[n])
       {
         USART_Transmit(slowo[n]);
        n++;
       }
    }



    Odbiór:

    Code:
    SIGNAL (SIG_UART_RECV) 
    
    {
      odebranyZnak = UDR;

    }


    Aktywacja megaZorda:

    Code:
    USART_Init (MYUBRR_GPS);
    
    sei();


    Ten kod śmiga na 100% pod atmega32. niedawno na nim pracowałem.

    Warto także odbiór dać w przerwaniu - wtedy pewniej działa.

    Pozatym do komunikacji polecam program Bray Terminal. Z innymi bywa bardzo różnie. Podłącz także lampki na wyjścia uartu i zobacz czy migają chociaż trochę podczas transmisji. Jeśli się nie zapalą to coś jest po stronie łącza. Pamiętaj o skrosowaniu Tx z Rx.

    Dodano po 4 [minuty]:

    sprawdź jeszcze czy po stronie PC wszystko działa. Zewrzyj Tx i Rx UARTU w komputerze i zobacz czy odbierasz to co wysyłasz. Dopiero potem próbuj z uC.
  • Poziom 15  
    Może MAX232C jest uszkodzony?
  • Poziom 2  
    Użyłem prawie identycznego kodu jak ten tutaj przytoczony, z użyciem przerwań. I test był pozytywny. Widziałem jak to działa u znajomego na kompie. Wróciłem do siebie i nie działa. Nie będę Wam zaprzątał tym głowy, poszukam u siebie przyczyny. Na razie wniosek taki: Atmega działa, program działa, max działa, komunikacji nie ma ;) Jak znajdę przyczynę na pewno napiszę, więc póki co tematu nie zamknę. Dziękuję za odpowiedzi.

    Dodano po 51 [minuty]:

    Przyczyna znaleziona. Miałem walnięty kabel. Prozaiczna przyczyna. Temat zamykam. Jeszcze raz dziękuję za pomoc.