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

UART i ATMEGA8535

Inlägg av PaNiC »

Till mitt kommande TNC-bygge ska jag nyttja en M8535.
Det roliga är att jag inte ens får igång UARTen. Har läst i databladet och förstår skrämmande lite av hur jag ska gå till väga och vilket register som är till vad.

Det här är min kod:

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

;init UART:
	ldi temp, 3
	out UBRRL, temp
	clr temp
	sbi UCRSB, TXEN|RXEN

rjmp test

test:
	ldi temp, 'a'
	out udr, temp
	rjmp test	

back:
	ldi r30, 0x60
	ldi r31, 0x00
main:
	sbis UCSRA, RXC
	rjmp main
	in temp, UDR
	cpi temp, '$'
	brne store
	ldi r30, 0x60
	ldi r31, 0x00
read:
	lpm temp, Z+
	cpi temp, '$'
	breq back
	out UDR, temp
	rjmp read
store:
	
	st Z+, temp
	rjmp main
Tänkte att jag skulle testa att lagra data i SRAM också. Ni får gärna titta och se om där är några fel i den biten också.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Tja du måste vänta tills uarten är tom,

exempel

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:
	; Set baud rate
	ldi r17,	0x00
	ldi r16,	0x00
	out UBRRH,	r17
	out	UBRRL,	r16
	; Enable Receiver and Transmitter
	ldi	r16,	(1<<RXEN)|(1<<TXEN)
	out UCSRB,	r16
	; Set frame format: 8data, 2stop bit
	ldi r16,	(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
	out UCSRC,	r16
	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 :)\n", '0'
om du ska läsa från ram ska du använda LD och inte LPM då de läser i från Program minnet (Flash)

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

Inlägg av PaNiC »

Ja givetvis, det måste jag ju. Tänkte inte på det.

Men förklara

Kod: Markera allt

ldi ZH,      HIGH(str1*2) 
ldi ZL,      LOW(str1*2) 
Om jag vill spara ett eget meddelande från data inkommande på UART då?
Varför *2?
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Normalt används "addresserna" för funktion anrop och hopp och efter som AVR instrukrionena är 16bitar eller 32bitar så Program Conter pekar på två byte i taget, medan lpm peakar på en byte så en om vandling måste göras, delvis *2

När man är i ram minet är det "normalt"

typ ta imot från uarten står på sidan 152 i ATmega8535 datablad
och spara i ram minnet. typ ST, se Instruktion upp sättningen för AVR

Är någe oklart är det bara att fråga :)

Om du vill ha ett skrivet exempel så säg till :)
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Skulle nog behöva ett skrivet exempel :).
När använder man X, Y eller Z? Vad är skillnaden på dem?
Användarvisningsbild
ante
Inlägg: 107
Blev medlem: 21 juni 2003, 17:48:56

Inlägg av ante »

Tänk på att t.ex. atmega48 delar sin interna klocka med 8 som standard, så den blir på 1 MHz som man får använda för att räkna ut vilken baud man ska ha.
Förresten, du har inte satt nån baud rate alls :) Kolla på sidan 64 i databladet så har du en tabell på vanliga baudrates, sen använder du I/O UBRR.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

X, Y och Z är 3st 16bitars register. Eller egenltigen är de de 6 övre registren som är X, Y och Z.

HIGH() och LOW() är funktioner för att maska ut bitarna rätt. HIGH() kör de övre bitarna och LOW() de lägre.

ZL, ZH osv är high/log på registrena.

Exempel:
.equ DATA = 0x7a69

ldi ZL, LOW(DATA)
ldi ZH, HIGH(DATA)

Säger nog sig själv att den lagrar värdet DATA i Z. :-)

En sida jag kan rekomendera är avr-beginners.net. De har tutorials om går igenom de enklaste sakerna (bland annat uart och sram) och är lätta at förstå.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

ante: Ok, gör M8535 det också? Det gör den inte väl?
Jo jag känner till UBRR och hur man använder UART. USARTen på M8535 är däremot mycket mer komplicerad (iallafall i mina ögon ;))

chille: Så det är X man använder till SRAM? Z till flash-minnet (.db-strängar) och Y till? Tittade på avr-beginners och tror att jag förstår hur man nyttjar SRAM nu.

Men mysteriet med USART kvarstår :).
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Nä, vad jag vet är det bara 3 likadana register som man kan använda hur man vill. Dock finns det väl säkert instruktioner som är "hårdkodade" till ett visst register, så det kanske är som du säger. Har faktist inte tänkt på det. Får kolla i databladet sen :)
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jag läser vidare på avrbeginners nu. Man kan tydligen använda X, Y och Z allihop till samma saker. Däremot är det bara Z som kan nyttjas till flashminnet.
Användarvisningsbild
ante
Inlägg: 107
Blev medlem: 21 juni 2003, 17:48:56

Inlägg av ante »

panic: nej det gör den inte, den har visst inte nån intern oscillator över huvudtaget.
Uarten är likadan på alla avrer, inte så krånglig om man läser databladet ordentligt :)

Men hur snabb klocka har du? Att ha en klocka med högre felprocent än 1% är tydligen inte rekommenderat.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

USART och UART är långt ifrån likadana. Jag kör med 3,6864MHz som ger en obefintlig felprocent vid ganska många baudrates.
Användarvisningsbild
ante
Inlägg: 107
Blev medlem: 21 juni 2003, 17:48:56

Inlägg av ante »

Btw, varför använder du UCRSB heter inte registret UCR?

edit: USART? .. det är en UART som 8535 har
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

ante: Mega8535 ;). AT90s8535 har en vanlig UART ja. I 90s8535 heter registret UCR. Men i de med USART finns det två och de heter UCRSA och UCRSB.
Användarvisningsbild
ante
Inlägg: 107
Blev medlem: 21 juni 2003, 17:48:56

Inlägg av ante »

Aha, missade mega grejen :)
Trodde du menade en vanlig 8535, för den har UART.

Men då är det ju inga problem

Kod: Markera allt

ldi r16, 1<< RXCIE0 | 1<<TXEN0 | 1<<RXEN0
sts UCSR0B, r16

ldi r16, 3<<UCSZ00
sts UCSR0C, r16
interrupt för rx och tx
och ingen paritet med en stoppbit
Skriv svar