Vizitator stefaann Postat Iulie 11, 2014 Partajează Postat Iulie 11, 2014 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
unuldinei Postat Iulie 21, 2014 Partajează Postat Iulie 21, 2014 (editat) 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 Iulie 21, 2014 de unuldinei Link spre comentariu
Vizitator stefaann Postat August 12, 2014 Partajează Postat August 12, 2014 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum