UART
Re: UART
Ну,что-же,терпения и удачи.У меня есть книжка,тоже в бумаге.Очень рекомендую.
http://easyelectronics.ru/revich-prakti ... blera.html
http://easyelectronics.ru/revich-prakti ... blera.html
- Реклама
Re: UART
Спасибо!
Re: UART
Доброй ночи! Раскуриваю юарт на mega8. USB -> UART http://www.recursion.jp/avrcdc/ тини2313.
вот такое в терминале

Шлет очень много ошибок. Должен в функции USART_Receive ждать пока придет байт, но штампует "not ONE", ну или подобие етого - невзирая отправлено чтоли или нет(тоесть при проверке бит RXC постоянно стоит). Проводки(от юарт--юсб к контролеру) где-то 30-35см, все на макето-отладочной плате. Может провода должны быть скручены как у витой паре??? Предложения, пожелания?
Спойлер
Код: Выделить всё
.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
В общем случае формула неверна, вы не учитываете ошибку целочисленного деления.
Даже если результат будет, скажем, 145.99 - возвратится 145, а не 146
Чтобы вернулось 146, прибавляют половину делителя
equ errdivider = (16*baudrate)/2
Где-то так
Код: Выделить всё
.equ bauddivider = XTAL/(16*baudrate)-1Чтобы вернулось 146, прибавляют половину делителя
equ errdivider = (16*baudrate)/2
Код: Выделить всё
.equ bauddivider = ((XTAL+errdivider)/(16*baudrate))-1Re: UART
Проблема неправильной передачи решена путем введения небольшой задержки, после отправки каждого байта. Теперь все буква в букву.
но вот отправленую единицу игпорирует.
когда заходит в USART_Receive, RXC постоянно стои - почему...
Спойлер
Код: Выделить всё
.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 постоянно стои - почему...
ну так 8000000/(16*9600)-1=51,083.equ bauddivider = XTAL/(16*baudrate)-1
- Реклама
Re: UART
Чета ниче немогу понят. Поставил прерывание по прему - контролер сходит с ума.Показывает что постоянно что-то принимает даже при отключеном TX на передатчике 
Тактирование от внутр источника. Питание от зарядки на телефон.
Тактирование от внутр источника. Питание от зарядки на телефон.
Re: UART
Ага, точно RX, было гдето 0,51В. Поставил вод такую подтяжку

но только на сам RX, TX так стои. Пока вроде более-менее. При отправке одного символа все ок. Но если сразу пачку - терминал показывает местами(%20-25) не те символы. Видимо при отправке пачками, погрешность времени набегает и оно, так сказать "прыбрихуе", но вообщем я так думаю
. Темболее что тактирование от внутренего RC. Завтра поставлю вторую подтяжку - и там посмотрим.
А можете покать какую схему вы используете для USB --> UART. Я собрал преобразователь

но тока на getchipe написано что должен так работать(без подтяжок). Интересно, что же заставляет некоректно работать преобразователь?

но только на сам RX, TX так стои. Пока вроде более-менее. При отправке одного символа все ок. Но если сразу пачку - терминал показывает местами(%20-25) не те символы. Видимо при отправке пачками, погрешность времени набегает и оно, так сказать "прыбрихуе", но вообщем я так думаю
А можете покать какую схему вы используете для USB --> UART. Я собрал преобразователь

но тока на getchipe написано что должен так работать(без подтяжок). Интересно, что же заставляет некоректно работать преобразователь?
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: UART
при работе с уартом сразу забудь о внутреннем генераторе, только кварц.
Схема преобразователя -это... Хрену к ней не хватает (с)
Она сразу нарушает стандарты юсб. На данный момент много достаточно дешевых мк с аппаратным блоком юсб, на них ориентируйся. Лично я пользую микрочиповские мк - так исторически сложилось, что они мне ближе.
Схема преобразователя -это... Хрену к ней не хватает (с)
Она сразу нарушает стандарты юсб. На данный момент много достаточно дешевых мк с аппаратным блоком юсб, на них ориентируйся. Лично я пользую микрочиповские мк - так исторически сложилось, что они мне ближе.



