Sari la conținut
ELFORUM - Forumul electronistilor

Comunicatie UART Atmega8


Vizitator stefaann

Postări Recomandate

Vizitator stefaann

Am o dilema.

Tot incerc de vreo doua zile sa transmit niste octeti catre PC prin UART din Atmega8.

Nu stiu dar ceva nu merge bine.

Am scris in UCSRA=0b0000.0000  - pun punct intre 4 biti ca sa vedeti mai bine

  UCSRB=0b000.11000 - deci am activ TX si RX

UCSRC =0b100.00000 - am setat asincron, no parity, 1 bit stop, 8N1

UBRRH = 0b000.00000- impreuna registrul H si L  am pus 25, pentru quart de 4MHz si viteza 9600bps.

UBRRL = 0b0001.1001

Am vazut ca UBRRH si UCSRC au in comun bitul7 care este URSEL

Cand scriu UBRRH, USEL este 0, cand scriu UCSRC, USEL este 1.

Stiu sa scriu in assembly, folosesc AVR Studio4.

Pentru inceput vreau sa fac numai TX UART, adica am pus activ TXEN, am setat cu ce imi trebuie, am pus un buton pe un pin,

Cand apas butonul de start si vreau sa trimit ceva catre pinul TX, trebuie sa pun in registrul UDR un octet, acesta trebuie sa fie trimis.

Testez flaguri din UCSRA, adica UDRE si TXC sa vad daca s-au transmis.

Am vazut ca AVR Studio 4 are o reprezentare cam abbigua pentru UBRRH si UCSRC in sensul ca nu prea iti dai seama cum sunt scrisi pentru ca au o adresa comuna,

in plus AVR Studio4 nu imi arata f clar cum trimite octetul la pinul TX si cum ar trebui sa apara schimbari la TXC ( TX complet) si UDRE.

Am incercat sa scriu de doua ori UBRRH si UCSRC in ideea ca bitul 7 trebuie gasit 0 sau 1 la scriere.

Testez biti...nu stiu ce sa-i mai fac...se comporta ca si cum nu ar fi setata viteza de transmisie, adicca UBRRH si UBRRL.

Poate trebuie o ordine speciala a scrierii sau citirii unor registri, dar parca n-am vazut nimic special in datasheet

Nici viteza nu este f importanta, pentru inceput folosesc un logic analyser sa vad ce trimite uC-ul spre pinul TX.

Apoi dupa aceea vreau sa pun aceeasi parametri si pe PC si sa receptionez in PC acei octeti.

Aici am scris ceva in assembly

 

stai_1: 

 ldi R16,0b00011000 ; enable TX RX out UCSRB,R16

 ldi R16,0b00000000 out UCSRA,R16 ldi R16,0b00000000   ; scrie UBRRH cand USEL=0=bit7 out UBRRH,R16

 ldi R16,0b00000000   ; scrie UBRRH cand USEL=0=bit7 out UBRRH,R16

 ldi R16,0b00011001 out UBRRL,R16

 ldi R16,0b10000110 ; scrie UCSRC cand usel=1= bitul7  cred ca USEL este acelasi in UCSRC si UBRRH, au ceeasi adresa. stabileste mod 8N1 out UCSRC,R16

 ldi R16,0b10000110 ; scrie UCSRC cand usel=1= bitul7  cred ca USEL este acelasi in UCSRC si UBRRH, au ceeasi adresa. stabileste mod 8N1 out UCSRC,R16

 

stai: 

 sbic PORTD,7  ; Testeaza ca butonul sa fie apasat rjmp staigata: sbis PORTD,7  ; Testeaza ca butonul sa fie eliberat rjmp gata

 ldi R16,0b00011000 ; enable TX RX out UCSRB,R16

asteapta: sbis UCSRA,5   ; Testeaza si asteapta UDRE pana transmisia se termina rjmp asteapta

 ldi R16,0b10101010 ; incarca buferul UDR out UDR,R16

asteapta_1: sbis UCSRA,5   ; Testeaza si asteapta UDRE pana transmisia se termina rjmp asteapta_1

 nop nop  ldi R16,0b00000000 ; Disable TX RX out UCSRB,R16 nop nop nop

 rjmp stai ; inapoi la inceputul programului.

 

 

 

 

 

 

 

Link spre comentariu
  • 2 săptămâni mai târziu...
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • unuldinei

    1

Top autori în acest subiect

Siii de ce nu folosesti exemplele asm de initializare din datasheet-ul lui Atmega8 ? https://github.com/mss/dmxpainter-datasheets/blob/master/atmel/doc2486.atmega8.pdf,

 

adica

USART_Init:; Set baud rateout UBRRH, r17out UBRRL, r16; Enable receiver and transmitterldi r16, (1<<RXEN)|(1<<TXEN)out UCSRB,r16; Set frame format: 8data, 2stop bitldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)out UCSRC,r16ret

daca vrei cu 1stop bit ... cauti ce face UCSZ si cu

USART_Transmit:; Wait for empty transmit buffersbis UCSRA,UDRErjmp USART_Transmit; Put data (r16) into buffer, sends the dataout UDR,r16ret

iar la receptie

USART_Receive:; Wait for data to be receivedsbis UCSRA, RXCrjmp USART_Receive; Get and return received data from bufferin r16, UDRret

Nu va mai complicati viata inutil ! Datasheet-ul e baza in orice proiect!

uite ca am gasit ceva cand ma jucam in asm

;       MIDI THROUGH pentru ATMEGA8;-------------------------------.def i=r16.def temp=r18.def buffer=r19.def re=r29.dsegmidi_vect: .byte 3.cseg  .org $000rjmp main;$0 .org URXCaddrrjmp rx_usart;$016 ;-------------------------------main:;init stackldi temp,HIGH(RAMEND)out sph,templdi temp,LOW(RAMEND)out spl,temp; Initializare port Cldi R16,0xFFout DDRC,R16ldi R16,0xFFout PORTC,R16rcall INIT_USART;----------------------------------------- loop:rcall rx_usartrcall tx_usart;loop foreverrjmp loop /* ;--------------------------------USART_RXC:clipush iin i,SREGpush iin i,UDR   ; ce intramov re,i;-------------------------------- ready:sbis UCSRA,UDRErjmp ready*/;------------------------------; conditiicpi re,$FE  ;elimina 0xFE Active Sense breq maincpi i,$90 ; compara r16 cu 0x90breq flagnotaON ; daca e egal  mergi si seteaza flagulcpi r20,$FF ; daca notaON flag set aduna notabreq aduna_notapush rercall tx_usartreti;------------------------------ ;--------------------- flagnotaON: ser r20 ;r20=0xFF reti;-------------------------------aduna_nota:; aduna sau scade ;dec redec redec reclr r20 ; r20=0x00reti;------------------------------------------------- INIT_USART:;init usart for 31250bps baud;F_CPU is 16MHz;8bit data, noparityldi i,0out UBRRH,ildi i,31out UBRRL,ildi i,(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)out UCSRC,ildi i,(1<<RXCIE)|(1<<RXEN)|(1<<TXEN)out UCSRB,iseiret;------------------------------------------------tx_usart:push r16; Wait for empty transmit buffersbis UCSRA,UDRErjmp tx_usart; Put data (r16) into buffer, sends the dataout UDR,r16retrx_usart:; Wait for data to be received;sbis UCSRA, RXCrjmp main ;rx_usart; Get and return received data from bufferin r16, UDRpush r16ret/*out UDR,re ;  TX USARTpop reout SREG,repop reseiret */

poate te inspira

 

iar ceea ce imi place cu adevarat la asm e hex-ul rezultat ...

:020000020000FC:020000000BC033:100016002BC024E02EBF2FE52DBF0FEF04BB0FEF43:1000260005BB13D021D01BD0FDCFDE3F91F30039A5:1000360029F04F3F29F0DF9312D018954FEF18950E:10004600DA95DA95DA954427189500E000BD0FE1B8:1000560009B90EE800BD08E90AB9789408950F9326:100066005D9BFDCF0CB90895D4CF0CB10F930895C5:00000001FF
Editat de unuldinei
Link spre comentariu
  • 4 săptămâni mai târziu...
Vizitator stefaann

Multumesc f mult pentru raspuns, am rezolvat problema aproape de data cand am postat si chiar am folosit exact sintaxa din datasheet dar n-a mers.

Acum fac TX/Rx  si vad ca functineaza bine. AVR Studio are o prolema cu reprezentarea registrului UCSRC si UBRRH, in sensul ca au aceeasi adresa, iar reprezentarea in dubuger mod este ciudata iar citirea celor doua registre este cam complicata. Atmega a incercat sa mentina numarul registrelor I/O la max 64. Pentru 65 de registre au considerat ca trebuie sa dea aceeasi adresa la exact UCSRC ssi UBRRH...ca dee, nu mai aveau spatiu de adresa. Hi! Artificii Atmel.

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