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
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?
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 ) 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
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
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???
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
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 ) 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
Daj vediet, ako si dopadol.
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.
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>
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