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

[Attiny2313][C] Brak połączenia z RS232

Lukaszek_69 01 Mar 2010 21:50 1212 3
  • #1 01 Mar 2010 21:50
    Lukaszek_69
    Poziom 13  

    Witam!
    Ostatnio próbuje wysłać jakąkolwiek informacje przez RS232 na mikrokontroler Attiny2313 i niestety nie ma żadnych efektów. Generalnie chodzi mi żeby po wciśnięciu liczby jednocyfrowej na klawiaturze została ona pokazana na wyświetlaczu siedmiosegmentowym. Program kompiluje w WinAvr a do wysyłania informacji korzystam z Hyper Terminala. Cały układ z MAX232 działa poprawnie ponieważ został sprawdzony, także wyświetlacz został uprzednio przetestowany innym programem. Poniżej zamieszczam kod źródłowy w którym zapewne znajduje się błąd, którego nie udało mi sie ustalić, tak więc proszę o przeanalizowanie i ewentualne zastrzeżenia co do jego poprawności:

    Code:

    #include <avr/io.h>
    #include <util/delay.h>

    #define F_CPU 1000000 // zegar
    #define BAUD 9600     // szybkosc transmisji
    #define MYUBRR F_CPU/(16*BAUD) - 1  // ustawienie zegara dla przesylu asynchronicznego normalnego

    void USART_init(unsigned int ubrr, unsigned char mode) // inicjalizacja USART; mode = 0 odbieranie
    {
       // ustawienie preskalera
       UBRRH = (ubrr>>8);
       UBRRL = ubrr;
       
       // wlaczenie odbierania lub nadawania
       if (mode)
       {
       UCSRB = (1<<TXEN);
       }
       else
       UCSRB = (1<<RXEN);
       
       // format ramki: 8data, 2stop
       UCSRC = (1<<USBS) | (1<<UCSZ0) | (1<<UCSZ1);
    }
    unsigned char USART_receive(void) // funkcja odbierajaca dane
    {
       // oczekiwanie na zakonczenie odbierania
       while(!(UCSRA & (1<<RXC)));
       
       // zwrocenie otrzymanej wartosci
       return UDR;
    }

    int main(void)
    {
       unsigned char dana;

       DDRB = 0xFF; // port B wyjscie; wyswietlacz siedmiosegmentowy
       PORTB = 0xFF;
       
       USART_init(MYUBRR, 0);

       while(1)
       {
          dana = USART_receive();
          
             switch(dana)
             {
                case 0x30 : PORTB = 0xC0;
                         break;
                case 0x31 : PORTB = 0xF9;
                         break;
                case 0x32 : PORTB = 0xA4;
                         break;
                case 0x33 : PORTB = 0xB0;
                         break;
                case 0x34 : PORTB = 0x99;
                         break;
                case 0x35 : PORTB = 0x92;
                         break;
                case 0x36 : PORTB = 0x82;
                         break;
                case 0x37 : PORTB = 0xF8;
                         break;
                case 0x38 : PORTB = 0x80;
                         break;
                case 0x39 : PORTB = 0x90;
                         break;
             };
       }
    }

    0 3
  • #2 02 Mar 2010 00:22
    nenpa8lo
    Poziom 17  

    Nie pisałem nic na ATtiny, ale w każdym procku trzeba było skonfigurować port najpierw: wejście/wyjście.
    Jeżeli to masz zrobione i dalej nie działa, to sprawdź najpierw czy twój wyświetlacz w ogóle działa, i zrób sobie jeszcze w swoim switch np. :

    Code:
    case 0x20:
    
      LED_ON;
      break;

    default:
      LED_OFF:
      break;

    Będziesz mieć wtedy 100% kontroli, nad tym co się dzieje.

    0
  • Pomocny post
    #3 02 Mar 2010 00:36
    OlekM
    Poziom 17  

    Moja uwaga, to również nic pewnego - ale może pomoże...

    Proponuję zakończyć stałe dużą literą L, żeby kompilator wiedział z jakiego typu ma korzystać podczas wykonywania obliczeń.

    Code:

    #define F_CPU 1000000L // zegar
    #define BAUD 9600L     // szybkosc transmisji


    Być może przyczyną braku komunikacji jest po prostu źle ustawiona prędkość UART'u.

    0
  • #4 02 Mar 2010 00:51
    Lukaszek_69
    Poziom 13  

    Ustawienie portu mam tutaj:

    Code:

       DDRB = 0xFF; // port B wyjscie; wyswietlacz siedmiosegmentowy
       PORTB = 0xFF;


    Wyświetlacz też działa na 100% bo testuje go co jakiś czas innym programem. Próbowałem nawet na niego wysyłać bezpośrednio daną instrukcją:
    PORTB = dana;
    i nic...

    Z tego co udało mi się ustalić to program prawdopodobnie zatrzymuje się na pętli w funkcji USART_receive, co wskazywałoby że w ogóle nic nie może odebrać. Początkowo myślałem jeszcze że może to być spowodowane dużym błędem transmisji bo aż 7% ale po obniżeniu BAUD na 2400(oczywiście Hyper Terminal za każdym razem konfigurowałem) problem dalej taki sam.

    Już całkiem nie wiem co z tym nie tak...

    Dodano po 8 [minuty]:

    OlekM masz u mnie piwo. Dzięki!
    Widać na więcej razy będę musiał się z kompilatorem obchodzić jak z dzieckiem.
    Problem rozwiązany, temat zamknięty.

    0