logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
REKLAMA
  • #1 6269685
    dardzik
    Poziom 11  
    Witam!
    Przeszukałem chyba całe forum i nie znalazłem rozwiązania na mój problem.
    Próbuje uruchomić UART pomiędzy prockiem a komputerem. Działa mi wysyłania, nie działa mi odbiór.

    
    SIGNAL (SIG_UART0_RECV) // USART RX interrupt
    { 
    	while (UCSR0A & 0x80) 
    	c = UDR0;
    }
    
    void UART_Init( unsigned int ubrr)
    {
    	UBRR0H =0;  //(unsigned char)(ubrr>>8);
    	UBRR0L =11; // (unsigned char)ubrr;
    	UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1 << RXCIE0);	// Enable receiver and transmitter 
    	UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);					// Set frame format: 8data, 1stop bit 
    }
    
    void UART_Transmit( unsigned char data )
    {
    	while ( !( UCSR0A & (1<<UDRE0)) );	// Wait for empty transmit buffer 
    	UDR0 = data;
    }
    
    int main(void)
    {
    	DDRE&=~(1<<0); // Rx
    	DDRE|=(1<<1);  // Tx
    	SREG|= (1<<SREG_I); 
    	UCSR0B|= (1<<RXCIE0);	
    	UART_Init ( MYUBRR );
    	while(1)
    	{
    	}
    }


    Co trzeba jeszcze ustawić lub co jest źle ?
  • REKLAMA
  • #2 6269799
    gbr3
    Poziom 15  
    Witam, ja wzorowałem sie na tym https://www.elektroda.pl/rtvforum/topic763038.html.
    Musi działać ,pozmieniaj tylko nazwy bitów zgodnie z datasheetem m128 :) ,lub wywal ze swojego kodu
    "while (UCSR0A & 0x80) " i "DDRE&=~(1<<0); // RxDDRE|=(1<<1); // Tx"(tych portow nie trzeba ustawiac jezeli uzywasz usartu),powinno ruszyc.
  • REKLAMA
  • #3 6269832
    dardzik
    Poziom 11  
    Jakie zmiany bitów? Wydaje mi się że nazwy są zgodnie z ATmega128.
  • #4 6269846
    gbr3
    Poziom 15  
    Chodziło mi o nazwy w kodzie z linku one są ma m8.
    Tak w twoim kodzie sa poprawna dla m128.
  • REKLAMA
  • #5 6270312
    arturt134
    Poziom 27  
    Po co w przerwaniu linia
    while (UCSR0A & 0x80)
    ?
    Przecież przerwanie jest wtedy gdy odebrano znak. Wywal tą linię.
    Jak zdefiniowałeć zmienną c, do której ładujesz odebrany znak? Czy ma atrybut volatile?
    A poza tym skąd wiesz, że odbiór nie działa, przecież nic z tym odebranym znakiem nie robisz...
  • REKLAMA
  • #6 6270687
    dardzik
    Poziom 11  
    Zmienna c jest typu char.
    Nie umieszczałem całego kodu, tylko to co jest najbardziej istotne. Do przerwania mi wchodzi, ale w zasadzie jakieś śmieci odbieram albo nic. Wysyłanie działa, więc prędkości ustawione są dobrze. W Atmega16 UART mi działa bardzo ładnie, a w ATmedze 128 niestety nie. Zmieniły się tylko nazwy rejestrów.

    
    while (UCSR0A & 0x80) 
    

    Ten kod czy jest czy go nie ma nie wpływa na nic.
  • #7 6270698
    arturt134
    Poziom 27  
    volatile char?
  • #8 6272214
    dardzik
    Poziom 11  
    Używam unsigned char. Volatile char nie ma na to wpływu.
  • #10 6286566
    dardzik
    Poziom 11  
    Rzeczywiście program jest ok. Problem był w ustawieniach w AVRStudio.
REKLAMA