Sari la conținut
ELFORUM - Forumul electronistilor

Atmega8 si comunicare seriala.


Vizitator jbix77

Postări Recomandate

Vizitator jbix77

Buna ziua,Am si eu o problema cu un atmega8 si comunicatia seriala. Am un atmega care functioneaza pe oscilator intern la 8 mhz, si RxTx sint legate la un max232.Dupa lupte seculare, am reusit in sfirsit sa prind ceva caractere pe seriala (pb cu portul serial, a trebuit schimbat, acum merge printr-un converter serial-to-usb). Testez cu hyperterminal, de sub windows.Pe atmega ruleaza un program care face echo la caracterele receptionate pe seriala. Se pare ca functioneaza, dar la unele caractere nu se face echo corect. De exemplu in loc de 1 apare ?, 2,3,4,5 apar corect 9,0 nula fel si la tastele cu literele.Tastele care apar corect, apar tot timpul corect. cele care nu, alea nu apar corect niciodata.A mai intilnit cineva asa ceva? Am incercat sa schimb toate emulatiile hyperterminalului, dar nici un succes. Are cineva idee, unde ar putea sa fie problema?Va multumesc

Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • mitescu

    1

Top autori în acest subiect

Da.In cazul in care parametrii setati ai MC-ului si terminalului sunt identici cauza este de natura "producator"Se mai intampla cand oscilatorul intern RC, nu este calibrat corect.De obicei fenomenul apare la MC-urile ce sunt fabricate prin China , sau alte tari de tipul asta.Solutia ar fi ca la RESET sa umbli la OSCCAL , prin tatonari pana cand cazi pe frecventa corespunzatoare(vezi datasheet).Ciudat este faptul ca producatorul spune ca nu garanteaza rezultatul ptro abatere mai mare de 10% (WR/ EEPROM fail), in schimb vine direct din fabrica "matrasit".Eu am adoptat alta metoda, pentru a nu avea probleme cu scrierea in EEPROM.Am incarcat UBRR cu o valoare "corectata" fata de tabelele date de producator. Astfel ptr un oscilator intern de 8Mhz, in loc de valoarea 51 (ptr 9600 baud), am incarcat cu 54 (ceea ce insemna ca oscilatorul era mai sus de 8mhz)In cazul tau se poate sa nu existe aceeasi abatereSunt doua metode de a determina "corectia"prima - prin tatonari cu o valoare mai mare , apoi mai mica , pana cand vezi sensul abaterii. Apoi mergi in continuare in acelasi sens pana cand se "strica" din nou comunicatia. Valoare ce mai apropiata de cea corecta este undeva la mijlocdoi- daca ai doi pini disponibili a MC in montajul tau, scrii un programel ce reinitilizeza UBRR cu o valoare incrementata/decrementata functie de care din intrari o activezi (ex. pui doua push-uri pe ele). Concomitent comunici cu el prin intermediul unui terminal. La fel ca si in cazul de mai suste "opresti " la o valoare mediana fata de capetele unei comunicari corecte.

Link spre comentariu

La ce viteza merge seriala si cat de lungi sunt sarmele?Eu cred ca e mult mai simplu: ai verificat setarile serialei sa fia aceleasi la microcontroller si la calc?Viteza, nr biti, paritate, biti stop.

Link spre comentariu
Vizitator jbix77

9600, no flow control, 1 bit paritate.Cablul e destul de lung, cam 2 metri cablul usb2serial sin inca cam 2 metrii cablul celalalt (cablu de tastatura ps2, neecranat)Setarile sint aceleasi si pe microcontroler si pe calculator.

Link spre comentariu

Cablul nu mi se pare lung la viteza asta. Mai intai fa un loopback pe adatporul USB to RS232 (scoti firele seriale de la microcontroller si legi RX cu TX) si testeaza cu un Hyperterminal. Daca primesti exact ce trimiti inseamna ca sunt in regula cablurile. Pun pariu ca nu aici sunt necazuri."1 bit de paritate" ??? - paritatea poate fi lipsa, para, impara, mark sau space. Altfel decat un bit sau lipsa nu se poate. Alege dintre para sau impara, ce vrei tu. Pune peste tot acelasi fel de paritate.Nr de biti de date poate fi 5, 6, 7, sau 8. Pune la fel peste tot, iti recomand 8.Nr de biti de stop poate fi 1, 1.5, 2, pune peste tot la fel, iti recomand 1.

Link spre comentariu
Vizitator jbix77

Scuze, eram cam adormit, acu vad ce am scris :)De fapt e 9600, 8 biti date, parity none, 1 stop bit, flow control noneCablurile sint ok, le-am testat si direct pe mufa, si si loopback de la pinii microkontrollerului, si se pare ca si maxu isi face treaba.Problema e ca cu microcontrolerul nu vrea sa mearga, si pace :)Din cite pot spune eu, setarile sint identice atit in hyperterminal, cit si la microcontroller. Cind ajung acasa, o sa pun si codul.

Link spre comentariu
Vizitator jbix77

Aici este codul folosit pt comunicarea seriala:// serial port#define F_OSC 800000 /* oscillator-frequency in Hz */#define UART_BAUD_RATE 9600#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)void usart_putc(unsigned char c) { // wait until UDR ready while(!(UCSRA & (1 << UDRE))); UDR = c; // send character}void uart_puts (char *s) { // loop until *s != NULL while (*s) { usart_putc(*s); s++; }}void init_serial(void) { // set baud rate UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8); UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC); //UBRRH=0; //UBRRL=51; // Enable receiver and transmitter; enable RX interrupt UCSRB = (1<

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări