Зарегистрирован: Пт май 09, 2025 17:03:41 Сообщений: 2
Рейтинг сообщения:0
Помогите пожалуйста, пишу midi синтезатор и пытаюсь разобраться с UART. Не принимает старший бит(всегда 0). По спецификации каждое сообщение состоит из нескольких байт: ведущий начинается с единицы, остальные с нуля, этот код выводит все подряд, но даже так светодиод моргает если в предыдущих байтах присутствовала единица. Смотрел вход RX - фронты не смазаны, поэтому с аппаратной частью все должно быть ок. Уже раз 10 перепроверил все настройки UART. Тактируется все от 20 МГц кварца, подключил еще сдвиговый регистр со светодиодами для отладки(функция send и регистр led для нее, с ней проблем нет, я проверял)
.include "2313def.inc"
.def temp = r16 .def led = r17
.org 0x0000 rjmp reset
reset:
ldi temp, RAMEND out spl, temp
sbi DDRD, PD6
ldi temp, (1<<PB0|1<<PB1|1<<PB3) ;PB0 - DO PB1 - sck PB3 - latch out DDRB, temp
ldi temp, 0 out UBRRH, temp
ldi temp, 39 out UBRRL, temp
ldi temp, (0b00000000) out UCSRA, temp
ldi temp,(1<<UCSZ1|1<<UCSZ0) out UCSRC, temp
ldi temp, (1<<RXEN) out UCSRB, temp
rjmp main
main: sbic UCSRA, RXC rcall UART rjmp main
UART: in temp, UDR mov led, temp ;sbrc temp, 7 rcall send ret
в такой записи ldi temp, (1<<PB0|1<<PB1|1<<PB3) в скобки нужно брать каждое выражение. должно быть так: ldi temp, (1<<PB0)|(1<<PB1)|(1<<PB3) и ниже ldi temp,(1<<UCSZ1|1<<UCSZ0) такая же ошибка. ldi temp,(1<<UCSZ1)|(1<<UCSZ0)
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Давненько не брался за АВР, но по-моему, это всё же ошибки. Если скобки не как у Starichok51, то результат м.быть х. зн. какой. Ведь оператор | приоритетней >> Можно прогнать через ассемблер тот и другой вариант и посмотреть - какая константа сгенерируется. Мне лень...
Насчет скобок Starichok51 абсолютно прав. А вот сами *.inc (и их размещение в папках) зависят от того, какой компилятор ассемблера в проекте АВР студии на вкладке project -> assembler option -> AVR assembler указан avrasm(version 1) или avrasm2(version 2).
интересно, я сейчас тоже проверил, и тоже получил одинаковые значения. а как же у меня тогда не работало, пока я не наставил скобок? наставил скобок и заработало.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Возможно, от компилятора зависит? Или от набора данных? Во всяком случае, даже для наглядности и читаемости скобки - полезная вещь, организуют правильную мысль, не напрягая зря мозги: а что там за чем следует. Я когда-то так в Дельфи лоханулся: не учёл, что or приоритетней операции сравнения и очень удивлялся: куда это моих ifов заносит? Один умный автор иронично заметил: "Некоторые программисты считают, что мировой запас скобок ограничен и поэтому применяют их крайне редко".
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения