Sari la conținut
ELFORUM - Forumul electronistilor

Program comunicatie seriala ATmega8535


JQ

Postări Recomandate

Salutare, am si eu niste intrebari legate de comunicatia seriala pentru ATmega8535. M-am tot chinuit sa adaptez un program , am luat si portiuni din datasheet, insa tot are multe disfunctionalitati.1- daca pentru setarea baud rate-ului se seteaza valoarea dorita doar la UBBRH, UBBRL ce valoare trebuie sa aiba?2-procedura de "receive" trebuie neaparat accesata la inceputul vectorului, adica nu se poate pune un "rcall" in "main"?3-Si am mai incercat sa in troduc o procedura de comparare a datelor primite cu o valoare fixa , insa nu functioneaza.EX; cpi R16,5 breq aprinde......aprinde:sbi PORTC,1ret........PROGRAMUL ESTE URMATORUL:.include "m8535def.inc".def temp=R16.def contor=R18.org 0x00rjmp reset.org URXCaddrrjmp USART_Receive .cseg.org 0x15 reset: ;stivaldi temp,Low(Ramend)out SPL, templdi temp,High(Ramend)out SPH,tempUSART_Init:; Set baud rateldi R17,0out UBRRH, r17ldi R16,12out UBRRL, r16; Enable Receiver and Transmitterldi r16, (1<

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

Top autori în acest subiect

  • JQ

    4

  • mitescu

    3

Nu o sa o iau in ordinea logica ci in cea pusa de tine 1.****************cpi R16,5 breq aprinde ...... aprinde: sbi PORTC,1 ret ***************Unde RET ??? ca nu faci nici un CALLand ajunge la BREQ APRINDE, ajunge acolo si dupa aceease intoarce unde da dumnezeu , ca nu stii ce ai in stiva.2.*************************org 0x00 rjmp reset .org URXCaddr rjmp USART_Receive ************************vad ca vrei sa utilizezi vectorii de intrerupere pentru USARTdar nu initializeziRXCIE: RX Complete Interrupt EnableTXCIE: TX Complete Interrupt Enable3.ce clock are MC-ul? , pentru ca baudrate depinde de acest lucruUBRRL este incarcat , la tine cu valoarea 12, asta insemna :4800 la 1MHz9600 la 2Mhz19200 la 4MHz....apoi :************************USART_Init: ; Set baud rate ldi R17,0 out UBRRH, r17 ldi R16,12 out UBRRL, r16 ; Enable Receiver and Transmitter ldi r16, (1<

Link spre comentariu

Scuze ,dar desi am recitit datasheet-ul de cateva ori tot nu inteleg un lucru. Pe montaj e un Quartz de 8 Mhz, si as vrea un baud rate de 9600b/s.Cum setez modul de transmisie sincron/asincron,acel 2X?

Link spre comentariu

In primul rand , nu ai spus nimic despre postul anterior, ai rezolvat sau nu problema ?!!!Daca ai fi citit cu atentie datasheet-ul respectiv ai fi vazut ca modul de lucru cu USART-ul este destul de simpluCa sa o luam pe puncte:Modul de lucru sincron asincron se selecteaza din bitul UMSEL din registrulUCRSC : 0 - asicron , 1- sincron, valoarea dupa reset este 0 deci modul asincron*** OBSERVATIE : registrul UCRSC est "shadow" cu registrul UBRRH, daca ai sa te uiti atent ai sa observi ca cele doua registre au un bit comun, URSEL : cand acesta este 1 - se adreseaza registrul UCRSC, cand este 0 se adreseaza registrul UBRRH, la reset default-ul este 1 si deci UCRSC.ptr ca sa schimbi poti scrie o secventa de genul: in r16,UCRSC andi R16,0b01111111 out UCRSC,R16si am trecut in modul de adresare UBRRH, si invers in R16,UBRRH or R16,0b10000000 out UBRRH,R16si am revenit in modul de adresare UCRSC**************************Modul de lucru 2X se selecteaza din bitul U2X din registrul UCRSA 0- (default la reset) este normal si 1- double speedSi aici se cere a fi mentionata o observatie : Numai in modul ASINCRON se poate dubla viteza, in cel sincron bitul U2X TREBUIE sa fie 0In modul SINCRON sunt de remarcat urmatoarele stari:- starea master pinul XCK devine output si pe acolo iese clk-ul ptr slave-uri. - starea slave acest pin este input si de acolo isi ia USART-ul clk-ulModul sincron se utilizeaza in comunicatiile multiprocesor, acest mod de comunicatie se selecteaza din bitul MPCM din registrul UCRSADupa cum vezi, nu este cine stie ce fiolozofie.In ceea ce priveste quratz-ul de 8MHz pe care il ai , trebuie sa verificidaca din FUSE este setat pe oscilator extern high, si daca da, ptr unbaudrate de 9600 (vezi si datasheet) in UBRRL trebuie sa scrii valoarea 51.Asta ptr U2X=0, ptr U2X=1 valoarea este 103Totusi eu nu pricep de ce te complici cu toate aspectele astea.Avand in vedere ca producatorul a prevazut anumite valori de dupa reset aregistrelor, poti pur si simplu sa activezi USART-ul cu TXEN si RXEN si apoi sa scrii in UBRRL valoarea corespunzatoare a baudrate, si gata, merge !

Link spre comentariu

in sfarsit am reusit sa refac programul fara sa ma complic :), si face ceea ce voiam , transmite inapoi ceea ce primeste, doar ca, desi baud rate-ul e setat pentru 9600 el functioneaza pe 1200(folosesc bray terminal pentru comunicare).Care o fi problema?.include"m8535def.inc" .org 0x00rjmp reset reset: ldi r16,high(RAMEND) ; Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16,low(RAMEND) out SPL,r16 ; Enable Receiver and Transmitterldi r16, (1<

Link spre comentariu

Si mai am o intrebare , daca vreau sa compar datele primite de la PC cu o anumita valoare pentru a aprinde un led, cu ce o compar? o introduc in USART_Receive si o compar cu UDR sau R16?

Link spre comentariu

In ordine:1. Intradevar la un quartz de 8Mhz valoarea din UBRRL trebuie sa fie 51 - daca ai setat cu val 51 si merge cu 1200, insemna ca intradevar FUSEsunt scrisi ptr oscilator intern de 1MHz, (*vezi ca ti-am spus intr-un postanterior), solutii : ori schimbi valoarea din UBRRL cu 6 , ori setezi FUSEptr quartz high extern.2. !!!!!!

ldi R16, 0xFF ;set port D as inputs out DDRD, R16 out DDRC,R16 ldi R16, 0x00 ;enable pull-up out PORTD, R16 out PORTC,R16

este exact pe dos - 1 logic in DDRx face ca portul sa fie iesire- 0 logic in DDRx face protul intrare- 1 logic in PORTx cand este inrare face pull-up activCeea ce ai facut tu acolo ai facut porturile c si d iesire si le-ai adus in 03. nu inteleg de ce tii mortis sa lucrezi cu doi biti de stop, numai ca indatasheet este dat exemplul asta????4. O secventa pentru comparare ar fi un interpretor de comenzi de la UASRT, ea ar arata cam asa:Interp: rcall USART_Receive ; get chr from USART rcall USART_Transmit ; put echo ; in r16 am caracterul primit de la usartcdaa: cpi r16,'a' ; comanda a brne cdab ; not a jump to next test sbi portd,led1 ;else set led1 rjmp interp ; and againcdab: cpi r16,'b' ; comanda b brne interp ; not b jump to loop cbi portd,led ; else reset led rjmp interp ; and againled1 este un numar intre 0 si 7 si corespunde numarul bitului din portdla care a fost conectat ledul fizic (ex 5 care la ATMega8535 este pinul 19)secventa de mai sus face ca la comanda 'a' sa se aprinda ledul si la 'c' se stinge, orice alt caracter nu produce nici o schimbareSucces !
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