реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Простой вопрос по USART на attiny2313
Guest_@Ark_*
сообщение Aug 14 2010, 08:39
Сообщение #16





Guests






Цитата
в даташите по tiny2313 такого варианта нет

Так может ваша тинька не поддерживает такую скорость? И Вы зря мучеетесь?
Проверьте все другие стандартные скорости по порядку, начиная медленных.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 14 2010, 08:53
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Скорости до 1Мбит/с поддерживает. Просто в таблицах даташита кварца 4,608 нет.
Попробую сейчас скорости поменять начиная с самой низкой.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Aug 14 2010, 09:03
Сообщение #18





Guests






Цитата
Скорости до 1Мбит/с поддерживает.

Да это все абстракция. Все зависит от конкретной частоты, и точности тактового генератора. И делителя в UART...
В некоторых случаях на 115200 работает, а на 57600 - нет...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 14 2010, 09:07
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Alt.F4 @ Aug 14 2010, 10:29) *
Почему же он не работает на 57600 а только на 4800? sad.gif
[attachment=46731:txd_rxd.txt]

Так. Передатчик USART работает с буфферизацией , поэтому первый посланный ему байт - пролетает мимо буфера , сразу в сдвиговый регистр и ждать освобождение UDR смысла нет он и так свободен. "Застрянет" в буфере только 2 байт.

Ваша программа сначала принимает символ - затем его отправляет , затем принимает и снова отправляет - по прикидкам UDR вообще проверять не нужно. Посланный Вами байт давно ушёл он даже в буфере не "застрял".
В чём проверяете программу и откуда получаете байт?

Специально скачал DS для 2313 для 4мгц запросто выставляется скорость UUSART 57600 правда ошибка -3,5 и сделайте в программе так
ldi temp,(SYSCLK)/((16*USARTSPEED)-1)
sts UBRR0L,temp
У Вас естественно out
где ,SYSCLK = 4608000 USARTSPEED=57600 в def их


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 14 2010, 09:30
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Проверяю в HyperTerminal.
Все заработало на скорости 2400бит/с! Мне в принципе достаточно.
Огромное спасибо всем откликнувшимся!
з.ы. в текст программы обязательно добавлять строки
Цитата
ldi temp,0x80 ;
out CLKPR,temp ;
ldi temp,0x00 ;
out CLKPR,temp ;
Не знаю зачем, но без них не работает.

Цитата
Специально скачал DS для 2313 для 4мгц
Огромное спасибо за помощь! Но у меня же кварц 4,608Мгц.

Сообщение отредактировал Alt.F4 - Aug 14 2010, 09:32
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Aug 14 2010, 09:31
Сообщение #21


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Alt.F4 @ Aug 14 2010, 12:24) *
Кварц 4,608Мгц,
Фьюзы установлены на внешний кварц (CKSEL3..0 - 1101, SUT1..0 - 10, SKDIV8 - 0).

А вот на кой черт SKDIV8=0 (вообще-то он CKDIV8, ну да ладно) ? Если 0, то делитель на 8 ВКЛЮЧЕН. Т.о. Частота опорника не 4.608 MHz, а в 8 раз меньше, и настроить UART на 57600 никак не получится...

Цитата(Alt.F4 @ Aug 14 2010, 13:30) *
Не знаю зачем, но без них не работает.

А это отключение прескалера. Если сделать CKDIV8=1, то и эти строки не нужны.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 14 2010, 09:49
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата
Если 0, то делитель на 8 ВКЛЮЧЕН
Если сделать CKDIV8=1, то и эти строки не нужны.
Спасибо! А все голову ломаю. Просто шью uniprof, а там галочка соответствует 1, а в даташите tiny2313 на русском не сказано нулем или единицей устанавливается CKDIV8

Еще хотел узнать, возможно ли как-то передавать символы ACSII просто написав допустим
ldi temp,'ABCDE' ;
out UDR,temp ;

Или надо на каждый символ создать таблицу в 16-ричном виде и просто адресовать используя Z?

Сообщение отредактировал Alt.F4 - Aug 14 2010, 09:50
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 14 2010, 09:52
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Alt.F4 @ Aug 14 2010, 13:49) *
Спасибо! А все голову ломаю. Просто шью uniprof, а там галочка соответствует 1, а в даташите tiny2313 на русском не сказано нулем или единицей устанавливается CKDIV8

Еще хотел узнать, возможно ли как-то передавать символы ACSII просто написав допустим
ldi temp,'ABCDE' ;
out UDR,temp ;

Или надо на каждый символ создать таблицу в 16-ричном виде и просто адресовать используя Z?

ldi temp,'A' ;
out UDR,temp
ldi temp,'B' ;
out UDR,temp
..............................................

Или через таблицу


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Aug 14 2010, 10:09
Сообщение #24


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Alt.F4 @ Aug 14 2010, 13:49) *
Или надо на каждый символ создать таблицу в 16-ричном виде и просто адресовать используя Z?

Можно вот так:
CODE
;----------------------------------------------------------------------
; Программа выдачи сообщений
; Текст сообщения описывается директивами .db непосредственно после
; команды rcall Msg, признаком конца текста является байт 00.
; После выполнения программы управление возвращается на следующую за
; байтом 00 команду. Программа не портит регистры. Для выдачи текста
; используется команда rcall Print.
; Эта версия программы может использоваться только для микроконтроллеров
; с 16-разрядным счетчиком PC !!!
;----------------------------------------------------------------------

Msg:
push temp
in temp,SREG
push temp
push YH ; сохраним
push YL ; рабочие
push ZH ; регистры
push ZL
in YH,SPH ; адрес текущей
in YL,SPL ; позиции стека
ldd ZH,Y+7
ldd ZL,Y+8 ; адрес операнда в памяти
lsl ZL ; адрес для команды lpm
rol ZH
Msg1:
lpm temp,Z+ ; очередной байт
tst temp ; контроль на терминатор
breq Msg2 ; текст закончился
rcall Print ; вывод байта
rjmp Msg1
Msg2:
adiw ZL,1 ; коррекция для нечетного адреса
lsr ZH ; новый адрес возврата
ror ZL
std Y+7,ZH
std Y+8,ZL ; меняем адрес в стеке
pop ZL
pop ZH
pop YL
pop YH
pop temp
out SREG,temp
pop temp
ret


И вызов:
rcall Msg
.db "Hello, World !",13,10,0

А уж "Print" - это хоть напрямую вывод в UDR с превентивным контролем готовности, хоть в программный FIFO, хоть на LCD-индикатор или еще куда...

Сообщение отредактировал rx3apf - Aug 14 2010, 10:11
Go to the top of the page
 
+Quote Post
vvs157
сообщение Aug 14 2010, 10:45
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(Alt.F4 @ Aug 14 2010, 13:49) *
Еще хотел узнать, возможно ли как-то передавать символы ACSII просто написав допустим
ldi temp,'ABCDE' ;
out UDR,temp ;

Или надо на каждый символ создать таблицу в 16-ричном виде и просто адресовать используя Z?
Это же ассемблер AVR, а не x86 или z80. Посмотрите повнимательнее на описание ассемблерных инструкций.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 15 2010, 10:10
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



А каким образом можно полученные символы сохранять в таблицу описанную директивой .db?
И затем сравнивать. Допустим если получили "hello", то сделать одно, если "bye", то другое?

Сообщение отредактировал Alt.F4 - Aug 15 2010, 10:15
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 15 2010, 12:39
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Alt.F4 @ Aug 15 2010, 14:10) *
А каким образом можно полученные символы сохранять в таблицу описанную директивой .db?
И затем сравнивать. Допустим если получили "hello", то сделать одно, если "bye", то другое?

Сдедайте массив в SRAM и сохраняйте
BUFDS: .byte 16
Вытаскиваете значения из Sram и сравниваете


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 15 2010, 13:08
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Вытаскивать получается командой ld (ldd).
А вот записывать какой?
На
Код
st  reg,Z;

avr_studio ругается invalid register

Сообщение отредактировал Alt.F4 - Aug 15 2010, 13:09
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 15 2010, 15:10
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Alt.F4 @ Aug 15 2010, 17:08) *
Вытаскивать получается командой ld (ldd).
А вот записывать какой?
На
Код
st  reg,Z;

avr_studio ругается invalid register

Можно так :
ldwi Z,StartRAM085 где ldwi - макрос , раскрывается в ldi ZH,high(StartRAM085) и ldi ZL,low(StartRAM085)
sts (StartRAM085+ValPressH),temp прямая адресация к ячейке SRAM
a можно и так
ldi temp,high(408)
st Z+,temp
ldi temp,low(408)
st Z+,temp

.dseg
StartRAM085: byte 50
это для обоих случаев


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Aug 15 2010, 17:19
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Спасибо огромное! Буду разбираться.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 15:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016