|
Простой вопрос по USART на attiny2313 |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 40)
|
Aug 12 2010, 20:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Ветка же AVR Цитата После инициализации на TxD будет высокий уровень Спасибо большое! Цитата Какие установите , такие и будут. USART он ведь сам по себе. Дадите команду работать , подключится и наплюёт на все установки порта , отключится вернутся установки порта. Установите порт как Вам нужно. А, то есть по тексту программы можно будет инициализовать? Или просто в подпрограмму запихнуть установку TXEN RXEN, затем передачу, и снятие флагов TXEN RXEN?
Сообщение отредактировал Alt.F4 - Aug 12 2010, 20:29
|
|
|
|
|
Aug 12 2010, 20:42
|

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

|
Цитата(Alt.F4 @ Aug 13 2010, 00:26)  Ветка же AVR Спасибо большое! А, то есть по тексту программы можно будет инициализовать? Или просто в подпрограмму запихнуть установку TXEN RXEN, затем передачу, и снятие флагов TXEN RXEN? Конечно, если Вы не включите USART - TXEN RXEN , то работаете с портом , как Вам угодно. Включили - два высоких. Единственно , подтягивающие не отключаются. Если подтянули к питанию , то всегда высокие . Кстати для входа - это полезно
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 13 2010, 05:29
|

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

|
Цитата(Alt.F4 @ Aug 13 2010, 08:42)  ILYAUL, огромное спасибо! Еще хотел уточнить, 1 бод/с = 8 бит/с или 10 бит/с? Передаю 8бит данных, битов четности нет, один стоповый бит, в асинхронном режиме. На эту тему можно долго дискутировать . Прнято считать (с азбуки Морзе) что он равен 1бит/cek.Но в модемных сетях , он может равнятся и 4 бит и 8 и 9 бит/сек. Вообщем-то самое простое пояснение - это передача одного символа полезной информации . Т.е , если например кодируете букву А 4 битами , то 1 бод = 4бит /сек 8-ю = 8 бит /сек
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 13 2010, 18:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
В общем долго мудрив со скоростями, пришел к выводу, что 1 бод/с = 1 бит/с Но проблема стала в другом. Написал прогу по которой tiny2313 должен слать по порядку весь алфавит по ACSII, в HyperTerminal'е же он слал только символ "А", хотя AVR Studio эмулировал все верно. Решил перепроверить отправляя обратно, что получил. И опять, tiny2313 либо отвечает символом "А", либо вообще молчит (в зависимости, что слать). Куда копать? Цитата ; Подпрограммы USART_transmit: sbis UCSRA,UDRE ;ждем пока UDR освободится rjmp USART_transmit ; out UDR,temp ;отправляем ret ;возврат из процедуры отправки USART_receive: sbis USR,RXC ;ждем приема символа rjmp USART_receive ; in temp,UDR ;читаем ret ;возврат из процедуры приема
; Основное тело программы Start: rcall USART_receive ; принимаем символ rcall USART_transmit ; отправляем этот символ rjmp Start
Сообщение отредактировал Alt.F4 - Aug 13 2010, 18:43
|
|
|
|
Guest_@Ark_*
|
Aug 14 2010, 07:20
|
Guests

|
Цитата Цитата(Alt.F4 @ Aug 13 2010, 08:42) Еще хотел уточнить, 1 бод/с = 8 бит/с или 10 бит/с? Передаю 8 бит данных, битов четности нет, один стоповый бит, в асинхронном режиме Здесь есть некоторая неточность. Ошибка - в обозначении бод/сек. Бод - это скорость передачи информации, измеряемая в символах в секунду. Если 1 символ = 1 бит, то 1 бод = 1 бит/сек.. В случае же какой-либо "хитрой" модуляции, 1 символ может передавать несколько бит. Тогда 1 бод больше 1 бит/сек. В случае RS232 всегда 1 бод = 1 бит/сек. 9600 бод = 9600 бит/сек . Но это скорость, с учетом всех бит, передаваемых по каналу: старт, стоп, четность. Например, если на скорости обмена 9600, используется формат передачи: длина слова - 8 бит; 1 старт-бит; 1 стоп-бит; четность не используется; то для передачи одного байта полезной информации (8 бит), потребуется передача 10 бит по каналу связи. "Полезная скорость", в этом случае, составит 960 байт в секунду или 7680 бит/сек (максимальная без учета пауз). Если будете использовать другой формат, например, с двумя стоп-битами и битом четности. То на скорости 9600, передача одного байта потребует уже передачи 12-ти бит по каналу. Скорость передачи "полезной" информации в этом случае упадет до 800 байт в секунду или 6400 бит в секунду.
|
|
|
|
Guest_@Ark_*
|
Aug 14 2010, 07:56
|
Guests

|
Цитата Почему же он не работает на 57600 а только на 4800? Какая тактовая частота процессора? Аппаратный модуль UART обычно получает рабочую частоту для обмена ее делением. Допустимая ошибка по частоте для RS232 - не более 1-2% (примерно). Нужно для каждой конкретной скорости вычислять ошибку. Иногда бывает, что на большей скорости ошибка меньше... Смотрите документацию на ваш МК - там обычно указываются допустимые скорости для UART, в зависимости от тактовой частоты процессора. ... Еще, конечно, зависит от самого тактового генератора. Его возможная ошибка по частоте будет влиять обязательно. На одной и той же частоте - от кварца может все работать, а от внутреннего RC - может и не работать. Все нужно считать. Или смотреть готовые таблицы в документации, если они там, конечно, есть...
|
|
|
|
|
Aug 14 2010, 08:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Кварц 4,608Мгц, в даташите по tiny2313 такого варианта нет, но нашел таблицы, где такой есть. Да и по формуле все сходится. Перепаивал кварц, думал, может он частоту плохо держит - не помогло. Фьюзы установлены на внешний кварц (CKSEL3..0 - 1101, SUT1..0 - 10, SKDIV8 - 0). з.ы. заметил глюк в avr_studio, как только происходит запись 0х06 в регистр UCSRC, сразу же это число записывается в UBBRH. Пробовал оставлять как есть, пробовал UBRR прописывать в самом конце - связь не удалось наладить.
Сообщение отредактировал Alt.F4 - Aug 14 2010, 08:39
|
|
|
|
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? 
txd_rxd.txt ( 2.19 килобайт )
Кол-во скачиваний: 184Так. Передатчик 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 это для обоих случаев
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 5 2010, 17:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Из-за нехватки памяти программ, приобрел ATmega48. Запустил в симуляторе программу и наткнулся на ошибку: error: Operand 1 out of range: 0xc0 в функции USART_transmit. Причем она скопирована с даташита. Поиск ни к чему не привел... Код USART_transmit: sbis UCSR0A,UDRE0 ; <--error: Operand 1 out of range: 0xc0 rjmp USART_transmit; out UDR0,temp ; <--error: Operand 1 out of range: 0xc6 ret ; В чем может быть дело? Спасибо.
Сообщение отредактировал Alt.F4 - Sep 5 2010, 17:04
|
|
|
|
|
Sep 5 2010, 17:49
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Alt.F4 @ Sep 5 2010, 21:41)  Правильно написал? Вроде да, хотя правильнее использовать не номер бита, а символическое имя. Пардон, а сохранять temp перед поллингом статуса кто будет ? А то так и будет передавать вместо требуемых данных содержимое UCSR0A... Цитата з.ы. в даташите приведены неверные примеры  Да, но там есть и сноска, что при обращении к портам в расширенном пространстве i/o надо заменить in/out на lds/sts.
Сообщение отредактировал rx3apf - Sep 5 2010, 17:51
|
|
|
|
|
Sep 6 2010, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Код USART_receive: lds temp2,UCSR0A ; sbrs temp2,(RXC0) ;ждем приема символа (установка RXC) rjmp USART_receive ; lds temp,UDR0 ;читаем ret ;возврат из процедуры приема Прогоняю в avr_studio и данные из UDR0 не копируются в temp. После lds temp,UDR0; temp и UDR0 сбрасываются в 0х00. В чем может быть проблема? Спасибо.
|
|
|
|
|
Sep 11 2010, 09:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Снова косяк c USART: cимволы из одной таблицы памяти программ МК почему-то передает неверно, причем только половину. Другие же таблицы передаются без ошибок. Может это в адресации? Т.к. если таблица написана так: Код .db 'R','e','z','h','i','m',0x20,'"','O','h','r','a'; .db 'n','a','"',0x20,'a','k','t','i','r','o','v','a'; .db 'n','.' ; то в HyperTerminal'е наблюдаю: Rezhim "OhАEЫ›ААP0ч*™*˜ А если так: Код .db 'R','e','z','h','i','m',0x20,'"','O','h'; .db 'r','a','n','a','"',0x20,'a','k','t','i'; .db 'v','i','r','o','v','a','n','.' ; то уже почему-то RezhАEЫ›ААP0ч*™*˜B™B˜ з.ы. и еще понять не могу, почему когда загружаю прошивку в UniProf, он в окне EEPROM грузит какие-то данные и шьет их в МК. Ведь эта же память по программе пуста! Спасибо.
Сообщение отредактировал Alt.F4 - Sep 11 2010, 09:16
|
|
|
|
|
Sep 21 2010, 14:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Код Start: ldi temp,0b00011000; установка TXEN RXEN sts UCSR0B,temp; USART вкл rcall 123; там мы отправляем по USART 123 .......... тут мы принимаем по USART и передаем, все работает. затем нажали на кнопку и выключаемся .......... end: clr temp; снятие TXEN RXEN sts UCSR0B,temp; USART выкл rjmp Start Проблема: символы 123 отправляются не с первого раза! Необходимо сначала посетить "end" и только со второго "Start" символы 123 передаются. Хотя и с первого раза в середине программы USART работает. В чем может быть проблема? Еще прикол с таблицами из поста 39 остался. Может это avr_studio зажигает? Спасибо. Нашел причину: необходимо сначала принять хотя бы один символ, только после этого МК будет осуществлять передачу. Почему так?
Сообщение отредактировал Alt.F4 - Sep 21 2010, 15:19
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|