UART i ATMEGA8535

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Nu har jag följande kod och kör med

Kod: Markera allt

.include "m8535def.inc" 

.def temp=r16 

;Initiera stackpekaren: 	

   	ldi temp, HIGH(RAMEND) 
   	out sph, temp 
   	ldi temp, LOW(RAMEND) 
   	out spl, temp 

reset: 
   	rcall USART_Init 
back: 
   	ldi ZH, HIGH(str1*2) 
   	ldi ZL, LOW(str1*2) 
main: 
   	lpm temp,   Z+ 
   	cpi temp,   0x00 
   	breq back 
   	rcall USART_Transmit 
   	rjmp main 


USART_Init: 
   	ldi temp, 23
	out UBRRL, temp
	clr temp
	out UBRRH, temp

	ldi temp, (1<<RXEN)|(1<<TXEN)
	out UCSRB, temp

	ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
	out UCSRC, temp
	ret

USART_Transmit: 
   	; Wait for empty transmit buffer 
   	sbis UCSRA,   UDRE 
   	rjmp USART_Transmit 
   	; Put data (r16) into buffer, sends the data 

   	out UDR,   r16 
   	ret 

str1: 
   	.db   "Hello :)",'0'
Jag får bara en massa @ ut. Framsteg jämfört med att ingenting alls hände innan förvisso. Med en klockfrekvens på 3,6864 ger väl UBRR=23 en baudrate på 9600? Med en nolla på slutet av str1 som det står i koden får jag inte ut något alls. Skippar jag den så jag har endast .db "Hello :)" får jag ut @en. Eller gradtecken lite beroende på vilken baudrate jag har.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Du har inget oscilloskop?

Om du har det, skicka samma tecken om och om igen (gärna 0xaa eller 0x55, det är bra bitmönster) och kolla på det som kommer ut. Då vet du säkert vad den skickar och hur snabbt.

Jag vet inget om AVR, men jobbiga försök till seriell kommunikation har jag mycket erfarenhet av :)

Edit: en tanke till, beroende på vilken nivå TX-pinnen hade innan du initierade UARTen så kan kanske hända att mottagaren tolkar det som data innan du skickat nåt. Testa att lägga in en delay på typ 20 bit-tider eller mer mellan init och skicka första datan.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jovisst har jag skop.

Detta får jag när jag kör koden i mitt förra inlägg:
Bild
Det ser inte ett dugg rätt ut. 5msec/div.

Detta är 0xaa:
Bild
500uS/div.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Antar du stängt av den interna klockan?
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Melker: Uhm.. Detta är pinsamt. I'll get right on it ;).

Edit: Såja, då fungerar det hela. Hade ingen aning om att den interna oscillatorn var på från början. Dumt i min mening. Men iallafall, tack Melker för att du är vaken, och alla andra för all annan hjälp.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Dumt att den är igång?

Vi säger såhär då... du har en konstruktion som ska använda den interna klockan...!? Då måste du först slänga på en extern för att kunna programmera den och tala om att du vill köra intern... :)
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

murphy... :doubt:
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

chille skrev:Dumt att den är igång?

Vi säger såhär då... du har en konstruktion som ska använda den interna klockan...!? Då måste du först slänga på en extern för att kunna programmera den och tala om att du vill köra intern... :)
Jo jag kom på det sedan :).
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Då har jag ett litet prog klart. Det fungerar som så att man hälsas av "Hello :)", sedan skriver man in text, avslutar med utropstecken och skickar '$' för att få tillbaka texten.

Kod: Markera allt

.include "m8535def.inc" 

.def temp=r16 

;Initiera stackpekaren: 	

   	ldi temp, HIGH(RAMEND) 
   	out sph, temp 
   	ldi temp, LOW(RAMEND) 
   	out spl, temp 

reset: 
   	rcall USART_Init 
	rjmp back

back: 
   	ldi ZH, HIGH(str1*2) 
   	ldi ZL, LOW(str1*2) 

again:
	lpm temp, Z+
	cpi temp, 0xff
	breq zero
	rcall USART_Transmit
	rjmp again

zero:
	ldi ZH, 0x00
	ldi ZL, 0x60

main:  
   	sbis UCSRA, RXC
   	rjmp main 
	rcall sram_do
	rjmp main


sram_do:
	in temp, UDR
	cpi temp, '$'
	brne sram_save
	rcall sram_read
	ret

sram_save:
	st Z+, temp
	rjmp main

sram_read:
	ldi ZL, 0x60
	ldi ZH, 0x00
next:
	ld temp, Z+
	cpi temp, '!'
	breq getback
	rcall usart_transmit
	rjmp next
getback:
	ldi ZH, 0x00
	ldi ZL, 0x60
	ret


USART_Init: 
   	ldi temp, 3
	out UBRRL, temp
	clr temp
	out UBRRH, temp

	ldi temp, (1<<RXEN)|(1<<TXEN)
	out UCSRB, temp

	ldi r16, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS)
	out UCSRC, temp
	ret

USART_Transmit: 
   	; Wait for empty transmit buffer 
   	sbis UCSRA,   UDRE 
   	rjmp USART_Transmit 
   	; Put data (r16) into buffer, sends the data 
   	out UDR, temp 
   	ret 


str1: 
   	.db   "Hello :)"
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Stacken kommer att växa sej för stor efter lite tag...

Kod: Markera allt

sram_do:
   in temp, UDR
   cpi temp, '$'
   brne sram_save
   rcall sram_read
   ret

sram_save:
   st Z+, temp
   rjmp main <- ska vara ret
ett lite tips bara :)
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Ahh, så klart :).
Skriv svar