Sida 1 av 2
UART i ATMEGA8535
Postat: 3 februari 2005, 21:28:19
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å.
Postat: 4 februari 2005, 15:35:24
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)

Postat: 4 februari 2005, 16:29:33
av PaNiC
Ja givetvis, det måste jag ju. Tänkte inte på det.
Men förklara
Om jag vill spara ett eget meddelande från data inkommande på UART då?
Varför *2?
Postat: 4 februari 2005, 18:28:25
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

Postat: 5 februari 2005, 14:15:21
av PaNiC
Skulle nog behöva ett skrivet exempel

.
När använder man X, Y eller Z? Vad är skillnaden på dem?
Postat: 5 februari 2005, 15:57:15
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.
Postat: 5 februari 2005, 16:16:12
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å.
Postat: 5 februari 2005, 16:54:01
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

.
Postat: 5 februari 2005, 17:00:39
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

Postat: 5 februari 2005, 17:12:23
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.
Postat: 5 februari 2005, 17:13:15
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.
Postat: 5 februari 2005, 17:40:04
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.
Postat: 5 februari 2005, 18:02:39
av ante
Btw, varför använder du UCRSB heter inte registret UCR?
edit: USART? .. det är en UART som 8535 har
Postat: 5 februari 2005, 18:27:01
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.
Postat: 5 februari 2005, 18:57:48
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