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

[ATmega 8][C] USART zle odczytywanie

webmortiz 24 Sie 2008 14:41 1562 2
REKLAMA
  • #1 5469495
    webmortiz
    Poziom 20  
    Wiem że temat ten byl wałkowany wielokrotnie ale nie znalazłem rozwiązania. Chodzi mi o to czy ktoś może przetestować kod na jakimś sprawdzonym układzie pod kątem odbierania bajtu. Atmegę łączę bezpośrednio z ukłądem FPGA ale przeważnie odbieram liczbę 130. Jedyne na czym mogę podejrzeć odebrany bajt to wyświetlenie na kolorowym wyświetlaczu pixeli i prawie zawsze pixela wyświetlana jest na wspolrzednych 130x130 (znakxznak), niezależnie od tego jaki bajt wyślę. W FPGA tak podzieliłem zegar żeby uzyskać baud 9600 (3,6864MHz na liczniku liczącym do 384) a avr skonfigurowany jak w kodzie. Atmega smiga na kwarcu zewnetrznym(z kondensatorami) 4MHz. Fuse bity mam ustawione(ISP PROGRAMMER Adama Dybkowskiego)(czy dobrze je ustawilem?):
    1 BODLEVEL
    1 BODGEN
    1 SUT1
    0 SUT0
    1 CKSEL3
    0 CKSEL2
    1 CKSEL1
    0 CKSEL0
    1 RSTDISBL
    1 WDTON
    1 CKOPT
    1 EESAVE
    0 BOOTSZ1
    0 BOOTSZ0
    1 BOOTRST

    Na razie interesuje mnie odebranie 1 bajtu tak wiec nie zwracajcie uwagi na indeksowanie tablicy. Niestety nie mam możliwości jak na razie podejrzenia transmisji na PC czy wyświetlaczu alfanum. co przyszło, a szybko chciałbym rozwiązać ten problem. Transmisja ma być jednostronna FPGA(3,3V) -> Atmega(5V). Sprawdziłem i mega poprawnie odbiera poziom 3,3V.

    
    int main (void)
    {
    
    	LCD_init();
    	USART_initialize(9600);
    	
    	waitms(500);
    	LCD_put_clear(WHITE);
    	
    	unsigned char znak;
    	int index=0;
    
    	while(1)
    	{
    	
    		if (readbyte(&znak))//pobranie jednego znaku
    		{
    			LCD_put_pixel(BLACK,znak,znak);
    			mem[index]=znak;//zapisz znak do tablicy
    			if (index<MAX) index++;
    		}
    	}
    }
    
    
    void USART_initialize(long int baud)
    {
    	UCSRB = (1<<RXEN)|(1<<TXEN); // Set RXEN and TXEN enable 00011000
    	UCSRC = 0x06; // Set to 8 bit, NP, 1 stop bit
    
    	if (baud==2400)
    	{
    		UBRRL = 0x67; // set Buad Rate
    		UBRRH = 0x00; // set Buad Rate
    	} else	
    	if (baud==4800)
    	{
    		UBRRL = 0x33; // set Buad Rate
    		UBRRH = 0x00; // set Buad Rate
    	} else
    	if (baud==9600)
    	{
    		UBRRL = 0x19; // set Buad Rate
    		UBRRH = 0x00; // set Buad Rate
    	} else
    	if (baud==19200)
    	{
    		UBRRL = 0x0C; // set Buad Rate
    		UBRRH = 0x00; // set Buad Rate
    	}
    }
    
    unsigned char readbyte (unsigned char *data)
    {
    // non blocking routine..checks Receive complete bit, returns 0 if nothing available
    // returns 1 if data available
    	if (UCSRA & 0x80) {
    		*data = UDR;
    		return 1;
    	} else {
    	return 0;
    	}
    }
    
  • REKLAMA
  • Pomocny post
    #2 5469712
    BoskiDialer
    Poziom 34  
    Zapisując do UCRSC musisz ustawiać najwyższy bit (URSEL) - UCRSC oraz UBRRH zajmują ten sam adres, to do którego dane trafią zależy właśnie od wartości najwyższego bitu podczas wpisywania.
  • #3 5472488
    webmortiz
    Poziom 20  
    Hmmm. To samo wyczytalem w datasheet. Kod z ktorego korzystam napisalem kiedys na atmege 128 i tam smigal(mega - pc). A przetestowalem mege8 i zrobilem petle. To co wysylam trafia spowrotem do megi i to juz nie ta sama liczba. Probowalem tez z URSEL i bez i inicjalizowanie tych rej przed wpisanien do ubbr i po i jakos nie dziala ;/ Znajac moje szczecie to pewnie jakis maly pierdolek na ktory nie zwrocilem uwagi. Ma ktos jeszcze jakis pomysl?

    ----

    Ok. Problem rozwiazany ;) Tak jak myslalem - pierdolka. Zeby nie uszkodzic FPGA zastosowalem diody i w atmedze w fazie testow zweralem piny nie w tym miejscu ;/
REKLAMA