ATmega128 USART problém se čtením - echo se většinou nevrátí

Vysílání mi funguje normalně ale se čtením jsou problémy pokud to chci testovat stylem while(true){ txd(rxd()); } tak se mi vrátí tak zhruba 30 ze 300 odeslaných je to jak kdy někdy se mi echo vrátí po 10 pokusech jindy po třech mám k tomu aji připojený SPI ale zkoušel jsem to bez něj a chování stejné takže tím to asi nebude a jiný HW problém když programování funguje bez problému tam asi taky nebude.
Kód:

#define F_CPU 16000000

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

#define USART_BAUD_0 57600ul
#define USART_UBBR_VALUE_0 ((F_CPU/(USART_BAUD_0<<4))-1)

....

void serialInit(void)
{
   UBRR0L  = USART_UBBR_VALUE_0; 
   UBRR0H  = (USART_UBBR_VALUE_0 >> 8); 
   UCSR0B |= (true << RXEN0) | (true << TXEN0);  
   UCSR0C |= (true << UCSZ0) | (true << UCSZ1);
}


void txd(uint8_t data)
{
  while ((UCSR0A & (true << UDRE0)) == false);
  UDR0 = data;
}



uint8_t rxd(void)
{

while ((UCSR0A & (true <<RXC0)) == false) ;
return UDR0;

}

....

int main(void)
{

   serialInit();

   while(true)
   {
	
	  txd(rxd());
   
   
   }
 
   return 0;
} 

:arrow_right: administrator: přejmenováno z "ATmega 128 USART problem se čtením"

by som povedal blbo zvolena prenosova rychlost alebo nenastavene U2x na 1, alebo si tam daj vhodny kristal… vid tabulka v datasheete

Rozhodně to při prvním testování zpomal.
True je obecně nenulová hodnota, proto ji nemůžeš takto používat (nehledě na to, že toto slovo dříve překladač neznal pokud nebylo definováno ručně). Na víc nemám nyní čas. Kdyžtak později. Vyzkoušej si taky loopback bez procesoru.

mno nezná ani teď true/false mám definovaný ručně (1/0) jinak já už si s tím hrál dost takže jsem zkoušel všemožné jiný baud atd…

void main (void)
{
   DDRC |= 1<<PC2;
   PORTC |= _BV(PC2) ;
   while(true){};
	  
  
}

a ledka bliká nemělo by se to zacyklit a ledka svítit? zkoušel jsem for ale stejné když jsem zkoušel smyčky do malého počtu opakování např. poslat 10x ‘a’ a pak ‘E’ tak bezproblému ale při větších rozsazích jako by se mu to nelíbílo a restartuje se. Zkoušel jsem použít _delay_ms(10); zavolat tuto funkci jednou až x krát po sobě ale ani prodleva mezi příjmáním zpráv a ani blikání ledky se neměnilo … z tadyma zjevně pramení problém s přijímáním ale netuším proč to dělá vždyť kdyby byl problém s oscilátorem vůbec by se mi nepodařilo číst na PC ze sériové linky ty správné hodnoty.

A co ten strednik za tou slozenou zavorkou?

tak jsem tedy po několika dnech to vyřešil problem byl v režimu m103 nevím proč ale mněl jsem za to že jak jsem nastavoval pojistky tak že sem ho vypl a ukázalo se že ne tak se tedy omlouvám za zbytečné téma a děkuji :smiley: