в оффтоп:
раз так отладить программу не получилось, я прошил контроллер и... оно не работает.
Код:
Спойлер
Код: Выделить всё
.DEVICE Atmega16
.def temp = R16
.def rx = R17
ldi R16, low(RAMEND) ;инициализация стека
out SPL, R16
ldi R16, high(RAMEND)
out SPH, R16
LDI temp, 0xFF
OUT DDRC, temp
LDI temp, 0x00
OUT DDRC, temp
rcall uart_init
main:
loop: rcall receive
ldi temp, 49
cp rx, temp
brne one
sbis PORTC, 0
sbi PORTC, 0
sbic PORTC, 0
cbi PORTC, 0
one: ldi temp, 50
cp rx,temp
brne two
sbis PORTC, 1
sbi PORTC, 1
sbic PORTC, 1
cbi PORTC, 1
two: ldi temp, 51
cp rx,temp
brne three
sbis PORTC, 2
sbi PORTC, 2
sbic PORTC, 2
cbi PORTC, 2
three: ldi temp, 52
cp rx,temp
brne four
sbis PORTC, 3
sbi PORTC, 3
sbic PORTC, 3
cbi PORTC, 3
four: ldi temp, 53
cp rx,temp
brne five
sbis PORTC, 4
sbi PORTC, 4
sbic PORTC, 4
cbi PORTC, 4
five: ldi temp, 54
cp rx,temp
brne six
sbis PORTC, 5
sbi PORTC, 5
sbic PORTC, 5
cbi PORTC, 5
six: ldi temp, 55
cp rx,temp
brne seven
sbis PORTC, 6
sbi PORTC, 6
sbic PORTC, 6
cbi PORTC, 6
seven: ldi temp, 56
cp rx,temp
brne loop
sbis PORTC, 7
sbi PORTC, 7
sbic PORTC, 7
cbi PORTC, 7
rjmp loop
; Internal Hardware Init ====================
; .equ XTAL = 8000000
; .equ baudrate = 10000
; .equ bauddivider = XTAL/(16*baudrate)-1
uart_init: LDI temp, 0 ;low(bauddivider) ; для тактовой частоты 8 МГц
OUT UBRRL,temp
LDI temp, 0b00110001 ;high(bauddivider) ;(49dec, 31h) и бодрейта 10000
OUT UBRRH,temp
LDI temp, 0 ; очищаем флаги
OUT UCSRA,temp
; Прерывания запрещены, прием-передача разрешен.
LDI temp, (1<<RXEN)|(1<<TXEN) ;|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB,temp
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC,temp
ret
receive: in temp, UCSRA
sbrs temp, RXC
rjmp receive
in rx, UDR
ret