|
|
  |
Простой вопрос по USART на attiny2313 |
|
|
Guest_@Ark_*
|
Aug 14 2010, 08:39
|
Guests

|
Цитата в даташите по tiny2313 такого варианта нет Так может ваша тинька не поддерживает такую скорость? И Вы зря мучеетесь? Проверьте все другие стандартные скорости по порядку, начиная медленных.
|
|
|
|
Guest_@Ark_*
|
Aug 14 2010, 09:03
|
Guests

|
Цитата Скорости до 1Мбит/с поддерживает. Да это все абстракция. Все зависит от конкретной частоты, и точности тактового генератора. И делителя в UART... В некоторых случаях на 115200 работает, а на 57600 - нет...
|
|
|
|
|
Aug 14 2010, 09:07
|

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

|
Цитата(Alt.F4 @ Aug 14 2010, 10:29)  Почему же он не работает на 57600 а только на 4800?  [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 их
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 14 2010, 09:30
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 14 2010, 09:31
|
Гуру
     
Группа: Участник
Сообщений: 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, то и эти строки не нужны.
|
|
|
|
|
Aug 14 2010, 09:49
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 14 2010, 09:52
|

Профессионал
    
Группа: Свой
Сообщений: 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 .............................................. Или через таблицу
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 14 2010, 10:09
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 15 2010, 12:39
|

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

|
Цитата(Alt.F4 @ Aug 15 2010, 14:10)  А каким образом можно полученные символы сохранять в таблицу описанную директивой .db? И затем сравнивать. Допустим если получили "hello", то сделать одно, если "bye", то другое? Сдедайте массив в SRAM и сохраняйте BUFDS: .byte 16 Вытаскиваете значения из Sram и сравниваете
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 15 2010, 13:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Вытаскивать получается командой ld ( ldd). А вот записывать какой? На Код st reg,Z; avr_studio ругается invalid register
Сообщение отредактировал Alt.F4 - Aug 15 2010, 13:09
|
|
|
|
|
Aug 15 2010, 15:10
|

Профессионал
    
Группа: Свой
Сообщений: 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 это для обоих случаев
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|