Страница 1 из 1

проблема с UART attiny2313

Добавлено: Пт май 09, 2025 17:32:48
%MUSHRUM
Помогите пожалуйста, пишу 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

send:
cbi PORTB, PB3


sbrs led, 7
cbi PORTB, PB0
sbrc led, 7
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 6
cbi PORTB, PB0
sbrc led, 6
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 5
cbi PORTB, PB0
sbrc led, 5
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 4
cbi PORTB, PB0
sbrc led, 4
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 3
cbi PORTB, PB0
sbrc led, 3
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 2
cbi PORTB, PB0
sbrc led, 2
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 1
cbi PORTB, PB0
sbrc led, 1
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 0
cbi PORTB, PB0
sbrc led, 0
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1


sbi PORTB, PB3
ret


Upd: Всем спасибо, проблема видимо действительно была из-за скобок!

Re: проблема с UART attiny2313

Добавлено: Пт май 09, 2025 19:47:48
Starichok51
в такой записи
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)

Re: проблема с UART attiny2313

Добавлено: Сб май 10, 2025 04:53:05
akl
Starichok51 Это не ошибки.
%MUSHRUM AT90S2313 и ATtiny2313 похожи, но имеют отличия. Поэтому, нужно инклудить точно. Как вариант...
Спойлер

Код: Выделить всё

.include "tn2313def.inc"
;.include "2313def.inc"

.equ	Fcpu=20000000

.equ	BAUD=31250

.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
ldi temp, (1<<PB0|1<<PB1|1<<PB3) ;PB0 - DO PB1 - sck PB3 - latch
out DDRB, temp

	SBI PORTB, PB3

	LDI	R22,HIGH(Fcpu/16/BAUD-1)
	OUT	UBRRH,R22
	LDI	R22,LOW(Fcpu/16/BAUD-1)
	OUT	UBRRL,R22
;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

	IN	R22,UDR	;псевдочтение для сброса RxC
;rjmp main

main:
	SBIS	UCSRA,RxC
	RJMP	MAIN

	IN	LED,UDR
	RCALL	SEND

	RJMP	MAIN
;sbic UCSRA, RXC
;rcall UART
;rjmp main

;UART:
;in temp, UDR
;mov led, temp
;sbrc temp, 7
;rcall send
;ret

send:
cbi PORTB, PB3

sbrs led, 7
cbi PORTB, PB0
sbrc led, 7
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 6
cbi PORTB, PB0
sbrc led, 6
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 5
cbi PORTB, PB0
sbrc led, 5
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 4
cbi PORTB, PB0
sbrc led, 4
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 3
cbi PORTB, PB0
sbrc led, 3
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 2
cbi PORTB, PB0
sbrc led, 2
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 1
cbi PORTB, PB0
sbrc led, 1
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1

sbrs led, 0
cbi PORTB, PB0
sbrc led, 0
sbi PORTB, PB0

sbi PORTB, PB1
cbi PORTB, PB1


sbi PORTB, PB3
ret
.EXIT

Re: проблема с UART attiny2313

Добавлено: Сб май 10, 2025 11:48:38
%MUSHRUM
akl, я проверял def файл, все регистры и биты совпадают. Вернее там некоторых небыло но я, дурак, сначала думал что файл кривой и все поправил.

Re: проблема с UART attiny2313

Добавлено: Сб май 10, 2025 11:56:16
Jack_A
Давненько не брался за АВР, но по-моему, это всё же ошибки. Если скобки не как у Starichok51, то результат м.быть х. зн. какой. Ведь оператор | приоритетней >> Можно прогнать через ассемблер тот и другой вариант и посмотреть - какая константа сгенерируется. Мне лень...

Re: проблема с UART attiny2313

Добавлено: Сб май 10, 2025 13:40:15
Starichok51
у меня уже была такая ошибка, поэтому я и написал, что это ошибка.
пока я не взял каждую часть выражения в скобки, не работало.

Re: проблема с UART attiny2313

Добавлено: Сб май 10, 2025 13:48:36
BOB51
Насчет скобок Starichok51 абсолютно прав.
8)
А вот сами *.inc (и их размещение в папках) зависят от того, какой компилятор ассемблера в проекте АВР студии на вкладке project -> assembler option -> AVR assembler указан avrasm(version 1) или avrasm2(version 2).
8)

Re: проблема с UART attiny2313

Добавлено: Вс май 11, 2025 04:58:56
akl
Проверил в студии все 3 записи. Всегда студия занесла в DDRB одно и тоже значение. :)

Код: Выделить всё

	ldi temp,1<<PB0|1<<PB1|1<<PB3 ;PB0 - DO PB1 - sck PB3 - latch
	out DDRB, temp
	ldi temp, (1<<PB0)|(1<<PB1)|(1<<PB3) ;PB0 - DO PB1 - sck PB3 - latch
	out DDRB, temp

ldi temp, (1<<PB0|1<<PB1|1<<PB3) ;PB0 - DO PB1 - sck PB3 - latch
out DDRB, temp

Re: проблема с UART attiny2313

Добавлено: Вс май 11, 2025 08:01:03
Starichok51
интересно, я сейчас тоже проверил, и тоже получил одинаковые значения.
а как же у меня тогда не работало, пока я не наставил скобок? наставил скобок и заработало.

Re: проблема с UART attiny2313

Добавлено: Вс май 11, 2025 11:11:15
Jack_A
Возможно, от компилятора зависит? Или от набора данных?
Во всяком случае, даже для наглядности и читаемости скобки - полезная вещь, организуют правильную мысль, не напрягая зря мозги: а что там за чем следует.
Я когда-то так в Дельфи лоханулся: не учёл, что or приоритетней операции сравнения и очень удивлялся: куда это моих ifов заносит?
Один умный автор иронично заметил: "Некоторые программисты считают, что мировой запас скобок ограничен и поэтому применяют их крайне редко".