Зарегистрирован: Пт май 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ов заносит? Один умный автор иронично заметил: "Некоторые программисты считают, что мировой запас скобок ограничен и поэтому применяют их крайне редко".
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения