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

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

Lukaszek_69 01 Mar 2010 21:50 1470 3
  • #1 7770920
    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:

    
    #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;
    			};
    	}
    }
    
  • #2 7771673
    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. :
    case 0x20:
      LED_ON;
      break;
    
    default:
      LED_OFF:
      break;

    Będziesz mieć wtedy 100% kontroli, nad tym co się dzieje.
  • Pomocny post
    #3 7771710
    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ń.

    
    #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.
  • #4 7771721
    Lukaszek_69
    Poziom 13  
    Ustawienie portu mam tutaj:
    
       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.
REKLAMA