Вобщем как-то пару месяцев назад игрался я с USARTом атмеги16 типа "первые шаги" и что самое удивительное припоминаю что у меня даже что-то получалось, т.е. принималось отправлялось, но потом как всегда бывает возникли задачи поважнее и я енто дело отложил. Сейчас имеется необходимость все закрепить и поиграться уже по взрослому. Короче пол дня уже сижу и так и эдак и ничего не получается, принять даж не получается ничего(( Кварц у меня 11,0592МГц (по ДШ без удвоения скорости в делитель UBRR нуна 11 записать)
Код
;
; +-------------------------------------------------------------------------+
; | инциализация USART |
; +-------------------------------------------------------------------------+
;
;
ldi temp1,0b10000110 ;устанавливаем регистр UCSRC
out UCSRC,temp1 ;7-URSEL = 1 (выбор регистра 0=UBRRH, 1=UCSRC)
; ;6-UMSEL = 0 (0=асинхр., 1=синхр.)
; ;5-UPM1 = 0 (выбор контроля четности
; ;4-UPM0 = 0 (нет контроля))
; ;3-USBS = 0 (кол-во стоп-битов (1=2 стоп-бита))
; ;2-UCSZ1 = 1 (количество бит (0-1-1=8бит),
; ;1-UCSZ0 = 1 см.UCSZ2 в рег.UCSRB)
; ;0-UCPOL = 0 (при синхр.передаче, см.ДШ)
ldi temp1,0b00000000 ;устанавливаем регистр UBRRH
out UBRRH,temp1 ;7-URSEL = 0 (выбор регистра 0=UBRRH, 1=UCSRC)
; ;6-NU
; ;5-NU
; ;4-NU
; ;3-UBRR11= 0 (установка битрэйта, старшая
; ;2-UBRR10= 0 тетрада UBRR)
; ;1-UBRR9 = 0
; ;0-UBRR8 = 0
ldi temp1,0b00001011 ;устанавливаем регистр UBRRL (57600кбод)
out UBRRL,temp1 ;UBRR7...0 = 11 (младший байт битрэйта)
ldi temp1,0b00000000 ;уст. регистр A упр. и статуса UCSRA
out UCSRA,temp1 ;7-RXC = 0 (флаг завершения приёма)
; ;6-TXC = 0 (флаг завершения передачи)
; ;5-UDRE = 0 (флаг освобождения регистра данных)
; ;4-FE = 0 (ошибка приёма (нет стоп-бита)
; ;3-DOR = 0 (флаг переполнения (при заполнении принят очередной старт-бит))
; ;2-UPE = 0 (ошибка условия четности, в ДШ название просто "PE")
; ;1-U2X = 0 (1=удвоение скорости)
; ;0-MPCM = 0 (1=многопроцессорный обмен (фильтруются посылки без адреса))
ldi temp1,0b11011000 ;уст. регистр B упр. и статуса UCSRB
out UCSRB,temp1 ;7-RXCIE = 1 (1=разр.прерывание USARTRXC)
; ;6-TXCIE = 1 (1=разр.прерывание USARTTXC)
; ;5-UDRIE = 0 (1=разр.прерывание USARTDRE)
; ;4-RXEN = 1 (1=разр.работу приёмника)
; ;3-TXEN = 1 (1=разр.работу передатчика)
; ;2-UCSZ2 = 0 (кол-во бит, см.рег.UCSRC)
; ;1-RXB8 = 0 (9ый бит приёма (при 9ти битах))
; ;0-TXB8 = 0 (9ый бит перед. (при 9ти битах))
;
А это у меня вектор по приему:
;
; +-------------------------------------------------------------------------+
; | Приём по USART завершен |
; +-------------------------------------------------------------------------+
USARTRXC:
in temp1,UDR
ldi ZH,1
ldi ZL,108
st Z,temp1
reti
Ну а дальше в основном теле я беру данные из этой ячейки SRAM и отправляю их на дисплей
Прибор уже полностью работает, осталось тока 485-интерфейс воткнуть с модбасом(
Ткните носом где я чего не так сделал, в симуляторе AVRStudio отследить ничего не получается
(исходные замечания: модуль работы с дисплеем работает 100%, преобразователь 232/485 тоже живой 100%, контактной болезни нет, процессор живой, программа для работы с com-портами тоже не раз пользованая, явно что-то в программе не то делаю)
Сообщение отредактировал rezident - Aug 3 2010, 11:07
Причина редактирования: Оформление цитаты исходника.