Sida 2 av 2
Postat: 5 februari 2005, 23:42:16
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.
Postat: 5 februari 2005, 23:59:18
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.
Postat: 6 februari 2005, 00:15:09
av PaNiC
Jovisst har jag skop.
Detta får jag när jag kör koden i mitt förra inlägg:

Det ser inte ett dugg rätt ut. 5msec/div.
Detta är 0xaa:

500uS/div.
Postat: 6 februari 2005, 00:24:31
av Melker
Antar du stängt av den interna klockan?
Postat: 6 februari 2005, 00:31:29
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.
Postat: 6 februari 2005, 04:37:35
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...

Postat: 6 februari 2005, 06:15:34
av evert2
murphy...

Postat: 6 februari 2005, 11:34:30
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

.
Postat: 6 februari 2005, 23:07:32
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 :)"
Postat: 7 februari 2005, 08:35:12
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

Postat: 7 februari 2005, 12:17:07
av PaNiC
Ahh, så klart

.