Posílám data přes USART Atmega8, kom. ale funguje jen z 50%

Zdravim,

vyskytol sa mi jeden problem(som zaciatocnik). Mam mikrokontroler Atmega8 a komunikujem pomocou serioveho portu.

Problem je nasledovny: mam otvoreny Hyper terminal a posielam mu znaky. Stlacim na klavesnici 1 a HT mi vypise napr.3. alebo stlacim 2 a vypise mi 7. Obcas to ide  aj dobre je tam taka 50%pravdepodobnost. Mozete mi prosim nejako pomoct?

pouzivam externy krystal =7,3728 MHz, Baud rate 9600,UBRR=95(podla datasheatu error=0.0%)
v AVR studiu som nastavil SUT_CKSEL : Ext. Crystal/Resonator High Freq.;Start-up time 16k CK+64ms
zapnute(odfajknute) mam SPIEN a CKOPT

Za odpovede dakujem

:arrow_right: administrator: přejmenováno z “USART”

Na akej klavesnici stlacis 1? Na PC? A co by sa malo vyslat miesto 3 alebo 7?
Je to 3 / 7 v hexa tvare alebo binarny obsah bajtu? Kedy to nefunguje? Vzdy pri tych istych cislach?
Co znamena, ze to obcas (50%) nefunguje? To ze sa znak neprijme/nevysle, alebo ze pride iny znak?
Nebolo by lepsie miesto printscreenu nastavenia poistiek poslat obsah zdrojoveho kodu a napisat co to vlastne ma robit?
Nebolo by lepsie, keby si na zaciatok odvysielal pravidelne nejaku spravu, napr. ‘ABCDEFGHIJKLMNOPQ’ ?
Na zaklade toho lepsie uvidis co sa deje. Ako mas nastavenu komunikaciu cez UART? Mas napr.8N1 na oboch stranach? Alebo komunikujes cez sw uart?
Kedy zaciatocnici zacnu konecne pisat do prispevku popis problemu poriadne aby sa k tomu mohol niekto vyjadrit? :slight_smile:

Zdravim,

no mam jednoduchy program ktory cita to co zadam z klavesnice…tak som zacal pisat abecedu cize: ABCDEFGHIJK…a vypis bol nasledovny(vid priloha)

tu je kod je obycajny jednoduchy pre citanie znakov:

int main(void)
{

char cReadData;
int w;

USARTInit(95);//UBRR = 95 pre 7,3728 MHz external crystal ak U2X=1

while(1)
{

	w=USARTReadChar(w);
	USARTWriteChar(w);


}

}
abeceda.JPG

Neviem, co robia funkcie

USARTReadChar() a USARTWriteChar()

ale nejak mi tam chyba testovanie, ci je prijem cez RX ukonceny.
Ked tam nieco v slucke nacitavas, napriklad pocas rozpracovaneho prijmu, potom sa nediv (mne sa to tiez volakedy stalo :slight_smile: ) ze to i odvysielas - taky gulas.

Drz sa datasheetu, strana 137 a dalej

unsigned char USART_Receive( void );
void USART_Transmit( unsigned char data );

int main(void)
{
unsigned char i;
    while(1) {
       i = USART_Receive();
       USART_Transmit(i);
    }

}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

alebo si to mozes vpisat do jednej funckie, ako ti to bude lepsie vyhovovat

nebo pouzit preruseni RXComplete a v mainu spat :slight_smile:

zdravim,

no to testovanie som si tam uz dorobil(USART_Receive a USART_Transmit)
ale problem stale nieje vyrieseny.stale mi to nejde tak ako chcem…mate nejake dalsie napady…
dakujem za pomoc

a ten RXComplete je je na mna este trosku privela :unamused:

Ten martinuv kod by mel behat (chybi sice return v main, ale to ti prekladac nejspis rekne). Nemas dlouhej/spatnej kabel?
Zkusil sis udelat loopback? (na konci kabelu, kterej pripojujes k mcu propoj RX a TX)

no ten loopback som skusal. ked to tak prepojim tak sa mi zacnu na hyperterminaly vypisovat nezmyselne znaky…
a kabel myslim…ze je dobry akurat ma teraz napadlo ze ja mam RS232/USB konvertor…cize od atmegy8 mi ide RS232 a do PC mi ide uz USB…to nemoze byt problem???

nekdy to problem byt muze me takto napr. odmital komikovat programator na AVR (tak sem delal na USB)

takze myslim ze problem bude tu

Co je ten konvertor zac? pouzivam ftdi s VCP ovladaci a doposud bez nejmensich problemu…

Zdravim Vas,

no takze situlacia je nasledovna. Chcel som eliminovat chybu kabla tak som vsetko zapojil do PC so seriovym portom(cize RS232 zo schemy do RS232 k PC) A robilo to to iste ako ked som mal (RS232/USB konvertor) stlacal som na klavesnici znaky a vypis bol uplne iny…testoval som to na pismene A. 10xsom stlacil A a vypis na hyperterminaly bol asi nasledovny: AAGQAAAIZA
softver mi testoval kamos na jeho zariadeni a jemu vsetko funguje…takze soft je dobry.
ma prosim niekto nejake navrhy? Fakt sa neviem pohnut dalej.
Myslim ze chyba by mohla byt s mojim externym krystalom? Mam 7.3728 MHz. Neviem ci mam dobre ponastavovane fuses bity?
Myslite ze to moze byt problem?
Dakujem

Tak tomuto som absolutne neporozumel co si kde kedy komu kam pichol :slight_smile:

USB koniec prevodnika USB/RS232 si strc do USB a druhy koniec cez laplinkovy/nulmodemovy kabel (to je taky, kde su navzajom prekrizene piny 2 a 3, kedze z pinu 3 sa vysiela, je blbost ho pripojit na druhej strany do pinu 3, odkial sa tiez vysiela, musis ho preto pripojit na pin 2 cez ktory sa ocakava prijem znamku a to iste na druhej strane - skratka na jednom (nie na oboch :slight_smile: ) konektore prehod piny 2 a 3 )
zapoj do portu RS232 na tom istom PC. Spusti dva hyperterminaly, kazdemu prirad prislusny com port. Cez jeden zacni stlacanim klavesnice vysielat znaky a na druhom musis vidiet to, co si stlacil. Ak ano, potom mozes povedat, ze mas kabel v poriadku.

Ale da sa to aj omnoho jednoduchsie. Zapoj kabel do RS232 v PC. Na jeho druhom konci prepoj piny 2 a 3. To, co budes tukat do klavesnice sa Ti musi zobrazovat na obrazovke. Je to jednoduchsie a zrozumitelnejsie, ako to co som popisal vyssie. Sorry :slight_smile:
Daj vediet, ako si dopadol.

Ahojte,

martin dakujem spravil som to co si mi povedal a zistil som ze kabel je dobry…ked som len prepojil piny 2 a 3 vypisuje to co stlacam…
takze chyba nebude v kably…
MAX232 mam zapojenu nasledovne…to by malo byt dobre…
takze fakt neviem kde moze byt chyba…uz som to spominal ale stale si myslim ze by to mohlo byt tym krystalom…
zatial dakujem vsetkym a prosim este o pomoc.

Xtal to nebude. Sam takuto hodnotu pouzivam i s mega8. Okram toho, ak by to bolo Xtalom, tak by to blblo vzdy.

Sprav si program v mega8, ktory bude do PC iba vysielat stale dokola “1234567890”

Ak to nebude blbnut, potom sprav dalsi test, ak prijmes do mega8 znak ‘1’, rozsiet na malu chvilu nejaku led.

Urcite nie je chyba v hw (v jeho prapodstate). S mega8 beznekomunikujem k plnej spokojnosti. Daj sem zdrojaky, nech sa to da posudit.

dik martin,
tu je moj kod na ktrom to monemtalne testujem …funguje asi tak ze ked zadas male pismeno tak sa vypise velke pismeno …cize napisem ‘a’ a vypis na HT je ‘A’
kod:
#include <avr/io.h>
#include <inttypes.h>

void USARTInit(uint16_t ubrr_value)
{
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);

UCSRB =(1<<RXEN)|(1<<TXEN);
UCSRC =(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
UCSRA = (1<<U2X);

}

char USARTReadChar()
{
while(!(UCSRA & (1<<RXC)))
{
}
return UDR;
}

void USARTWriteChar(char data)
{
while(!(UCSRA & (1<<UDRE)))
{
}
UDR=data;
}

int main(void)
{

char cReadData;
int w;

USARTInit(95);		//UBRR = 95 pre 7,3728 MHz external crystal ak U2X=1

while(1)
{
	cReadData = USARTReadChar();
	if ((cReadData >= 97) && (cReadData <= 122))
	{
		w = (cReadData - 32);
		USARTWriteChar(w);

	}	

}

}

Znak prijimas do CHAR, a posielas z INT - 32,
“a” mas v DEC ako 97
“A” mas v DEC ako 65

97-32=65

kde bude asi chyba?

Zdravim,

no dakujem ti za upozornenie ale aj tak to robi to iste.
tu je moj vypis z hyperterminalu.stlacal som iba ‘a’ ale vypis bol nasledovny

Naprogramuj si v cykle iba vysielanie jedneho znaku z mega8 do PC. Uz sa vykasli na ten ping, ked ti nejde to poriesis v dalsom kroku.
Hlavne si skontroluj, ci mas rovnako nastaveny pocet datovych bitov, paritu a pocet stop bitov. To jednoducho musi sediet.
Potom sa ozvi

Zdravim vsetkych hlavne martina,

uz mi to vsetko slape…kod bol dobry…aj krystal aj vsetko.
problem bol v hardwery…s GND…

DAkujem za pomoc.