|
Прием данных USART, пропускаю данные из за переполнения |
|
|
|
Jan 18 2012, 13:43
|
Местный
  
Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457

|
Цитата(Палыч @ Jan 18 2012, 16:27)  Данные принимаются с ошибкой. Да.. горит переполнение буфера приемника- данные вовремя не забрали, но почему?
|
|
|
|
|
Jan 18 2012, 15:30
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(messenger @ Jan 18 2012, 17:43)  Да.. горит переполнение буфера приемника- данные вовремя не забрали, но почему? Как Вы определили, что "Data OverRun" ? Такой же эффект может быть и при "Frame Error". Попробуйте временно комментировать строку Код TIMSK=(1<<TOIE1); // разрешить прерывание от счетчика № T1 и передать 22 символа. Что будет возвращено?
|
|
|
|
|
Jan 18 2012, 20:42
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(messenger @ Jan 18 2012, 20:54)  TIMSK=(0<<TOIE1); //запретить прерывание от счетчика № 0 Сомнительное действие: написано вроде так "//запретить прерывание от счетчика № 0" но комментарий неверный, т.к. TIMSK=(0<<TOIE1); эквивалентно TIMSK=0, что означает запрет врех прерываний разрешаемых через TIMSK, в том числе и от таймера T0 (для Atmega64/128). Правильно так: Код TIMSK&=~(1<<TOIE1); // и на выходе TIMSK|=(1<<TOIE1); Проблема наверно не в этом, но потенциально - это грабля.
|
|
|
|
|
Jan 19 2012, 05:26
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(messenger @ Jan 19 2012, 08:00)  ...успела ли посылка набрать 22 символа. Хотя это не решит проблему, но: Ваша программа принимает только 20 символов из 22. for (temp_1_i=0;temp_1_i< 20 ;temp_1_i++) Цитата(messenger @ Jan 19 2012, 08:00)  а как нужно синхронизировать?у меня нет ,наверно, синхронизации. Сброс флага TOV (это - Вы добавите) и регистра TCNT (это - уже есть) в функции READ_MASS_RS_1 перед ожиданием прихода в USART символов и будет синхронизацией.
|
|
|
|
|
Jan 19 2012, 08:07
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(messenger @ Jan 19 2012, 04:00)  а как нужно синхронизировать?у меня нет ,наверно, синхронизации. Просто жду по таймеру много больше. Это же не критично?
RxTimOvf проверяю дважды. Первый раз что бы не повиснуть, второй что бы понять успела ли посылка набрать 22 символа. 1. Проверяете вы трижды: в операторе while, операторе if, и ещё раз в операторе if. 2-я и 3-я проверки бесполезны и даже вредны, поскольку в 1-ой проверке таймаута не было, принятый байт вы считали, но таймер1 тикает дальше и таймаут может наступить и вы запишете ошибку приёма, хотя никакой ошибки не было. 2. Синхронизировать нужно и вот почему. Вы запускаете программу в МК, запускается таймаут помимо всего прочего, затем вы нажимаете кнопку на ПК и начинаете передачу вашего пакета. Таймaут у вас заканчивается то раньше, то позже, отсюда все ваши беды. Уберите таймаут из цикла вообще, примите весь пакет, затем проверьте, был ли таймаут или нет. Засинхронизировать просто - примите 1-й байт от ПК, после него запустите таймаут. 3. Вообще, какая-то логика программы у вас странная. По программе, передав 123456, вы должны бы получить в буфере 120006, а вы пишете, что приняли 126, так не должно быть. Похоже, после приёма первых 2-х символов у вас пресловутый таймаут и наступает.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|