Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Несчастный УАРТ

Непрочитано 08.02.2011, 00:12  
jakuchma
Частый гость
 
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
jakuchma на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Хорошо давайте с начала.
У меня есть устройство. Мне надо сделать запрос 01 A1, оно мне отвечает пакетом в 30 байт весь пакет мне не надо. Нужны данные с 15 по 21 байт включительно.
Запрос делаю так:
Код:
ldi   resive,01		
rcall uart_snt
ldi   resive,A1		
rcall uart_snt	
........
uart_snt:	                
sbis  UCSRA,UDRE	 
rjmp  uart_snt 	    
out   UDR, resive	
ret
Получаю пакет 0D 0E 01 02...........15 16 17 18 19 20 21............35 36.
Как правильно обработать? У меня как писал выше прием идет. Только если пакет приходит ровно 38 байт, то проблем нет. А если мой контролер получает на байт меньше или на байт больше, то тут и проблема. Можно конечно ждать начало в моем случае 0D 0E и от него скакать, а как еще и конец обрезать, чтобы обрезать и получать ровно 38 байт? Как сформировать RX Complete?
Реклама:
jakuchma вне форума  
Непрочитано 08.02.2011, 00:36  
Passer__by
Прохожий
 
Регистрация: 06.02.2011
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Passer__by на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от jakuchma Посмотреть сообщение
Хорошо давайте с начала.
У меня есть устройство.
...
А Вы знаете, что такое конечный автомат или машина состояний?
От Вашего ответа на этот вопрос зависит дальнейшая помощь.
Passer__by вне форума  
Непрочитано 08.02.2011, 00:59  
jakuchma
Частый гость
 
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
jakuchma на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Не, не, не. Я не ракету запускаю, мне по боку что получет контролер. Он всего лишь температуру читает причем довольно таки быстро. И если получит мусор какой, то ничего страшного. Главное чтоб контролер не завис. Получил свои 38 байт и больше не ждал, я их уже обработаю сам.
jakuchma вне форума  
Непрочитано 08.02.2011, 00:59  
kittec
Гражданин KAZUS.RUN
 
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
kittec на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Вы можете создать на приёмной стороне буфер, байт 60, и записывать туда принятые байты не разбираясь, затем в буфере найти свой маркер OD OE и от него уже считать.
А Вы уверены, что в Вашей посылке не будет другого OD OE кроме маркера?
kittec вне форума  
Непрочитано 08.02.2011, 01:17  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от jakuchma Посмотреть сообщение
Получил свои 38 байт и больше не ждал, я их уже обработаю сам.
1) Принимаете по прерыванию, в нем же сбрасываете счетчик. В теле программы счетчик инкременируете. Когда счетчик переполнился - значит все данные приняты, пора разбирать.
2) Лучше запустить это все на втором прерывании по таймеру.
3) А еще лучше, второе прерывание поднимает флаг, что пора инкременировать счетчик. В теле работаете с флагами. Если флаг поднят, работаете с его процедурой т.е. инкременируете счетчик, проверяете переполнение, выходите.
В последнем случае можно выполнять больше 10 задач одновременно.
Easyrider83 вне форума  
Непрочитано 08.02.2011, 01:18  
jakuchma
Частый гость
 
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
jakuchma на пути к лучшему
По умолчанию Re: Несчастный УАРТ

да именно 0D 0E, и если я читаю весь, пакет почему нельзя писать в память именно то, что нужно?
jakuchma вне форума  
Непрочитано 08.02.2011, 02:00  
jakuchma
Частый гость
 
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
jakuchma на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от Easyrider83 Посмотреть сообщение
1) Принимаете по прерыванию
мне всего то и надо как на ассемблере принять по прерыванию?
jakuchma вне форума  
Непрочитано 08.02.2011, 02:03  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от jakuchma Посмотреть сообщение
как на ассемблере принять по прерыванию?
понятия не имею
на асме пишу только короткие вставки, когда в этом есть необходимость
Easyrider83 вне форума  
Непрочитано 08.02.2011, 02:30  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от Easyrider83 Посмотреть сообщение
на асме пишу только короткие вставки, когда в этом есть необходимость
и то для PIC. Это AVR.
Сообщение от jakuchma Посмотреть сообщение
мне всего то и надо как на ассемблере принять по прерыванию?
А вот тут язык программирования не важен. Логика работы одинакова.
Сообщение от jakuchma Посмотреть сообщение
почему нельзя писать в память именно то, что нужно?
Почему нельзя? Кто запретил-то?
- Есть время приёма пакета? Значит организуете TimeOut.
- Есть маркер начала пакета? Значит известен номер байта от начала. Известна длина информационной части.

переменные:
1.счетчик принятых байтов.
2.байт хранения предыдущего принятого байта.
3.Буфер для приёма 7ми информационных байтов.
4.Флаг старта приёма полезной информации.
5.Флаг окончания приёма.
6.Счётчик для отсчёта Таймаута. Таймер для собственно отсчета.

По прерыванию проверяете, который по счёту вход, если первый запускаете отсчёт таймаута.
Ждете прихода маркера начала приёма - "0D 0E". Для этого и нужен(2.байт хранения предыдущего принятого байта.)
Пропускаете все ненужные байты до 15.
Принимаете в буфер информационную часть. Ставите флаг окончания приёма.
Пропускаете всё остальное до таймаута. По нему сброс всех переменных и флагов.
Если таймаут случился до установки флага окончания приёма - значит посылка ошибочна.

Примерно так. Кодируйте.
omercury вне форума  
Непрочитано 08.02.2011, 02:46  
Someone
Гражданин KAZUS.RUN
 
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Несчастный УАРТ

Сообщение от jakuchma Посмотреть сообщение
да именно 0D 0E,
А если посмотреть на реальное содержимое пакета (что-то мне подсказывает, что там будут байты от 0х20 и выше) и немного подумать, то скорее всего окажется, что 0х0Е это маркер начала пакета, а 0x0D это конец пакета.
Someone вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто по дзс1768 поможет? уарт не пашет индюк Микроконтроллеры, АЦП, память и т.д 0 14.01.2011 02:31


Часовой пояс GMT +4, время: 11:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.