Собрал схему по рисунку из документации к 232 (стр 29). Драйвера и прочее установил. Для передачи символов использую стандартную winapi "TransmitCommChar".
Для мк написал програмку. Вот ее основная часть(сорри за плагиат):
Код: Выделить всё
.equ clock = 12000000 ;clock frequency
.equ baudrate = 9600 ;choose a baudrate
.equ baudconst = (clock/(16*baudrate))-1
---------------
********************
------------
USART_Init:
; Set baud rate
ldi r17,high(baudconst)
ldi r16,low(baudconst)
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<<USBS)|(3<<UCSZ0)
out UCSRC,r16
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
ldi r18,0 ;проверяем ошибки
sbic UCSRA, FE
ori r18,1
sbic UCSRA, DOR
ori r18,2
sbic UCSRA, UPE
ori r18,4
cpi r18,0
breq nex
;если ошибка приема
in r21, UDR
sts HexN,r21
ldi r16,$80
rcall LCD_Cmd
ldi r30,low(Error)
ldi r31,high(Error)
rcall LCD_WriteWord
ldi r16,$80
rcall LCD_Cmd
rcall LCD_WriteH
USART_Flush: ;подчистим буфер
sbis UCSRA, RXC
rjmp ok1
in r21, UDR
rjmp USART_Flush
ok1:
rjmp USART_Receive ;начнем с начала
;конец ошибки
nex: ;успешный прием
in r21, UDR
sts HexN,r21
ldi r16,$80
rcall LCD_Cmd
ldi r30,low(Okk)
ldi r31,high(Okk)
rcall LCD_WriteWord
ldi r16,$80
rcall LCD_Cmd
rcall LCD_WriteH
rjmp USART_ReceiveLCD - вывод на экран (ошибка или ок + что получил)
Но почему-то вся эта шарманка не играет - причем в протеусе все на ура(вместо 232 там терминал), а в реале - нет...
Фьюз деления частоты на 8 отключить не забыл, от внешнего затактировать не забыл, 232 чтоб выдавала 12МГц перепрошить не забыл...
Но что-то видимо все же забыл...
Вопрос - где косяк?
В протеусе все впорядке, в реале на экран выводит ошибку фрейма и естественно корявопринятый символ...
ПС Может поднимался вопрос - за ссылки спасибо. Реально пробовал и так и этак - символы не те...


