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

Problem z UART - z bitem UDRE1

Bartazi 07 Sty 2011 12:08 1007 2
REKLAMA
  • #1 8970886
    Bartazi
    Poziom 11  
    Witam.
    Próbuje uruchomić wysyłanie znaków do komputera za pomocą RS232 i mam problem, nie mogę nic wysłać. Korzystam z programatora skt200 i po dłuższej analizie przebiegu programu przy pomocy diody doszedłem do wniosku, że nie jest ustawiany bit UDRE1 czyli rejestr UDR1 niby jest zajęty. Moje doświadczenie z AVR nie jest duże ale z innymi peryferiami nie miałem problemu natomiast tutaj utknąłem. Próbowałem już różnych zmian w kodzie programu i żadnych rezultatów. Korzystam z ATmegi128 i USART1. Prędkość transmisji 19200 be bitu parzystości i jeden bit stopu, taktowanie uC 1MHz. Dodatkowo na linii do komputera mam umieszczoną kolejną diodę, jeśli zaszła by jakaś transmisja a Terminal na komputerze by nie pokazał to zauważył bym to na diodzie. Poniżej kod programu wraz z if który pomagał mi sprawdzać ustawienie poszczególnych bitów. Próbowałem również najpierw odczytywać z UDR1 żeby może jakoś tak go "zwolnić" ale nic nie pomagało.
    Jeśli ktoś ma jakiś pomysł będę wdzięczny za pomoc.



    #include <avr/io.h>
    #include <util/delay.h>
    
    void main( void )
    {	
    	DDRB = 48;
    	PORTB = 32;
    	int dioda1=16;
    	int dioda2=32;
    	char data = 0x51;		
    
    /* Set baud rate */
    UBRR1H = 0;
    UBRR1L = 2;
    /* Enable transmitter */
    UCSR1B =(1<<TXEN1);
    /* Set frame format: 8data, 1stop bit */
    UCSR1C = 0x06;      //(1<<UCSZ11)|(1<<UCSZ10);
    //data=UDR1;
    _delay_ms(1000);	
    if ((UCSR1A & 32))
    {PORTB |= dioda1;
    }
    //data = 0x51;
    
    while(1)
    {
    while ( !( UCSR1A & (1<<UDRE1)) );
    UDR1 = data;
    
    
    	PORTB |= dioda1;
    	_delay_ms(200);		
    	PORTB &=~ dioda1;
    	_delay_ms(200);
    }	
    }


    Edit: Dodałem brakujący średnik.
  • REKLAMA
  • #2 8971145
    dj_west
    Poziom 17  
    Ta część
    while ( !( UCSR1A & (1<<UDRE1)) ) 
    UDR1 = data;

    powinna być zapisana w taki sposób (dodanie jednego znaku do kodu)
    while ( !( UCSR1A & (1<<UDRE1)) ) ;
    UDR1 = data;


    Gdy bit UDRE1 nie jest ustawiony (czyli gdy rejestr danych nie jest pusty), to wykonuje się pętla nieskończona. Gdy bit ten zostanie ustawiony, to do UDR1 wpisywane są dane przeznaczone do transmisji. Ot co ;)
  • #3 8976000
    Bartazi
    Poziom 11  
    Faktycznie średnik gdzieś mi zaginął przy wklejaniu kodu do postu. Rolę bitu UDRE1 dokładnie znam, problem polegał na tym, że ten bit nie był ustawiany (informowała mnie o tym dioda -wykorzystanie instrukcji if do jej zapalenia). Ku memu zdziwieniu po różnych zabiegach takich jak czyszczenie pamięci uC czy resecie komputera nagle bit UDRE1 zaczął prawidłowo funkcjonować i jest ustawiany na wartość 1. Zatem problem z bitem się rozwiązał natomiast mimo tego dalej uC nie chce wysyłać znaków. Jeśli uda mi się postaram się użyć innego egzemplarza uC bo brakuje mi już pomysłów odnośnie tych dziwnych zachowań z USART1.
REKLAMA