UART

Обсуждаем контроллеры компании Atmel.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: UART

Сообщение Vov123 »

Ну,что-же,терпения и удачи.У меня есть книжка,тоже в бумаге.Очень рекомендую.
http://easyelectronics.ru/revich-prakti ... blera.html
Реклама
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: UART

Сообщение Slavast »

Спасибо!
Реклама
alexi$
Родился
Сообщения: 14
Зарегистрирован: Вт окт 30, 2012 23:34:54

Re: UART

Сообщение alexi$ »

Доброй ночи! Раскуриваю юарт на mega8. USB -> UART http://www.recursion.jp/avrcdc/ тини2313.
Спойлер

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

.include "m8def.inc"	
#define F_CPU (8000000)	
.equ 	XTAL = F_CPU
.equ 	baudrate = 1200 
.equ 	bauddivider = XTAL/(16*baudrate)-1
.dseg
.cseg
		 .ORG $0000      ; (RESET)
         RJMP   Reset
 
		.ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний

.macro ua_send
	ldi r16,@0
	rcall USART_Transmit
.endm

Reset:
ldi	r16, LOW(RAMEND)
out	spl, r16
ldi r16, HIGH(RAMEND)
out	sph, r16


uart_init:	LDI 	R16, low(bauddivider)
			OUT 	UBRRL,R16
			LDI 	R16, high(bauddivider)
			OUT 	UBRRH,R16
 
			LDI 	R16,0
			OUT 	UCSRA, R16
; Прерывания запрещены, прием-передача разрешен.
		LDI 	R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
		OUT 	UCSRB, R16	
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
		LDI 	R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
		OUT 	UCSRC, R16
main:
	ua_send '1'
	ua_send ' '
	ua_send ' '
	ua_send '3'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec

got_byte:
	LDI 	R16,0
	OUT 	UCSRA, R16
	rcall USART_Receive
	cpi r16,'1'
	breq byte_is
	ua_send 'n'
	ua_send 'o'
	ua_send 't'
	ua_send ' '
	ua_send 'O'
	ua_send 'N'
	ua_send 'E'
	ua_send ' '
	ua_send ' '
	ua_send ' '
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec
	rjmp got_byte
byte_is:
	ua_send 'G'
	ua_send 'o'
	ua_send 'o'
	ua_send 'd'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec	
	rjmp main
;=============
debug_wait_1_sec:
	push r16
	push r17
	push r18
	ldi r18,$aa
	ldi r17,$b0
	ldi r16,$28
L_D_1:
	dec r18
	brne L_D_1
	dec r17
	brne L_D_1
	dec r16
	brne L_D_1
	pop r18
	pop r17
	pop r16
ret
;=============
USART_Transmit:
	; Wait for empty transmit buffer
	sbis UCSRA,UDRE
	rjmp USART_Transmit
	; Put data (r16) into buffer, sends the data
	out UDR,r16
	ret
;=============
USART_Receive:
	; Wait for data to be received
	sbis UCSRA, RXC
	rjmp USART_Receive
	; Get and return received data from buffer
	in r16, UDR
	ret
;=============
вот такое в терминале
Изображение
Шлет очень много ошибок. Должен в функции USART_Receive ждать пока придет байт, но штампует "not ONE", ну или подобие етого - невзирая отправлено чтоли или нет(тоесть при проверке бит RXC постоянно стоит). Проводки(от юарт--юсб к контролеру) где-то 30-35см, все на макето-отладочной плате. Может провода должны быть скручены как у витой паре??? Предложения, пожелания?
Вложения
uart.asm
(3.92 КБ) 184 скачивания
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: UART

Сообщение urry »

В общем случае формула неверна, вы не учитываете ошибку целочисленного деления.

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

.equ    bauddivider = XTAL/(16*baudrate)-1
Даже если результат будет, скажем, 145.99 - возвратится 145, а не 146
Чтобы вернулось 146, прибавляют половину делителя
equ errdivider = (16*baudrate)/2

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

.equ    bauddivider = ((XTAL+errdivider)/(16*baudrate))-1
Где-то так
Реклама
Эиком - электронные компоненты и радиодетали
alexi$
Родился
Сообщения: 14
Зарегистрирован: Вт окт 30, 2012 23:34:54

Re: UART

Сообщение alexi$ »

Проблема неправильной передачи решена путем введения небольшой задержки, после отправки каждого байта. Теперь все буква в букву.
Спойлер

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

.include "m8def.inc"	
#define F_CPU (8000000)	
.equ 	XTAL = F_CPU
.equ 	baudrate = 9600 
.equ 	bauddivider = XTAL/(16*baudrate)-1
.dseg
.cseg
		 .ORG $0000      ; (RESET)
         RJMP   Reset
 
		.ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний

.macro ua_send
	ldi r16,@0
	rcall USART_Transmit
	rcall debug_wait_0_1_sec
.endm

Reset:
ldi	r16, LOW(RAMEND)
out	spl, r16
ldi r16, HIGH(RAMEND)
out	sph, r16


uart_init:	LDI 	R16, low(bauddivider)
			OUT 	UBRRL,R16
			LDI 	R16, high(bauddivider)
			OUT 	UBRRH,R16
 
			LDI 	R16,0
			OUT 	UCSRA, R16
; Прерывания запрещены, прием-передача разрешен.
		LDI 	R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
		OUT 	UCSRB, R16	
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
		LDI 	R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
		OUT 	UCSRC, R16
main:
	ua_send 'm'
	ua_send 'a'
	ua_send 'i'
	ua_send 'n'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec

got_byte:
	LDI 	R16,0
	OUT 	UCSRA, R16
	rcall USART_Receive
	cpi r16,'1'
	breq byte_is
	ua_send 'n'
	ua_send 'o'
	ua_send 't'
	ua_send ' '
	ua_send 'O'
	ua_send 'N'
	ua_send 'E'
	ua_send ' '
	ua_send ' '
	ua_send ' '
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec
	rjmp got_byte
byte_is:
	ua_send 'G'
	ua_send 'o'
	ua_send 'o'
	ua_send 'd'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec	
	rjmp main
;=============
debug_wait_1_sec:
	push r16
	push r17
	push r18
	ldi r18,$aa
	ldi r17,$b0
	ldi r16,$28
L_D_1:
	dec r18
	brne L_D_1
	dec r17
	brne L_D_1
	dec r16
	brne L_D_1
	pop r18
	pop r17
	pop r16
ret
;=============
debug_wait_0_1_sec:
	push r16
	push r17
	push r18
	ldi r18,$aa
	ldi r17,$11
	ldi r16,$4
L_DD_1:
	dec r18
	brne L_DD_1
	dec r17
	brne L_DD_1
	dec r16
	brne L_DD_1
	pop r18
	pop r17
	pop r16
ret
;=============
USART_Transmit:
	; Wait for empty transmit buffer
	sbis UCSRA,UDRE
	rjmp USART_Transmit
	; Put data (r16) into buffer, sends the data
	out UDR,r16
	ret
;=============
USART_Receive:
	; Wait for data to be received
	sbis UCSRA, RXC
	rjmp USART_Receive
	; Get and return received data from buffer
	in r16, UDR
	ret
;=============
СпойлерИзображение
но вот отправленую единицу игпорирует.
когда заходит в USART_Receive, RXC постоянно стои - почему...
.equ bauddivider = XTAL/(16*baudrate)-1
ну так 8000000/(16*9600)-1=51,083
Реклама
alexi$
Родился
Сообщения: 14
Зарегистрирован: Вт окт 30, 2012 23:34:54

Re: UART

Сообщение alexi$ »

Чета ниче немогу понят. Поставил прерывание по прему - контролер сходит с ума.Показывает что постоянно что-то принимает даже при отключеном TX на передатчике :?
Тактирование от внутр источника. Питание от зарядки на телефон.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: UART

Сообщение urry »

.equ baudrate = 1200


посмотри подтяжку на rx - там постоянно должна быть 1 без приема
alexi$
Родился
Сообщения: 14
Зарегистрирован: Вт окт 30, 2012 23:34:54

Re: UART

Сообщение alexi$ »

Ага, точно RX, было гдето 0,51В. Поставил вод такую подтяжку
Изображение
но только на сам RX, TX так стои. Пока вроде более-менее. При отправке одного символа все ок. Но если сразу пачку - терминал показывает местами(%20-25) не те символы. Видимо при отправке пачками, погрешность времени набегает и оно, так сказать "прыбрихуе", но вообщем я так думаю :)) . Темболее что тактирование от внутренего RC. Завтра поставлю вторую подтяжку - и там посмотрим.
А можете покать какую схему вы используете для USB --> UART. Я собрал преобразователь
Изображение
но тока на getchipe написано что должен так работать(без подтяжок). Интересно, что же заставляет некоректно работать преобразователь?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: UART

Сообщение urry »

при работе с уартом сразу забудь о внутреннем генераторе, только кварц.
Схема преобразователя -это... Хрену к ней не хватает (с)
Она сразу нарушает стандарты юсб. На данный момент много достаточно дешевых мк с аппаратным блоком юсб, на них ориентируйся. Лично я пользую микрочиповские мк - так исторически сложилось, что они мне ближе.
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: UART

Сообщение radio-kot »

Браво!
Будете проходить мимо- проходите!
Ответить

Вернуться в «AVR»