Easyelectronics.ru

Электроника для всех
Текущее время: 27 май 2017, 18:46

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат. Примерные цены: 10 штук 2-слоя 100*100mm 8.21$ или около ~470 рублей
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 18 май 2017, 20:19 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Да, по хорошему надо перед чтением UDRn читать UCSRnA и проверять флаги FEn, DORn и UPEn(если используется). Можно наложением маски с проверкой на ноль. Если есть ошибки - то зависит от ситуации - может придётся браковать принимаемый ответ и делать запрос повторно. Ну или хотя бы записать ошибку в лог. Но, наверное, потому что такие ошибки бывают редко (на правильно сделанном железе конечно) этим мало кто заморачивается...
Переполнение приёмного кольцевого буфера легко определить в прерывании(но тогда оба индекса придётся делать volatile) и в основной программе в принципе можно (простым счётчиком, сбрасываемым по окончанию приёма строки, если работа со строками). Если есть память, то для AVR лучше использовать размер 256 для кольцевого буфера. Если меньше то возможны проблемы с атомарностью(маска), а если больше 256, то ещё больше потенциальных проблем с атомарностью(регистры восьмибитные плюс маска). Ну это если заморачиваться надёжностью.
С передающим - тоже легко проверять в функции отправки (при набивке в буфер), но что делать если всё же заполнился - вот в чём проблема... Можно конечно тупить в цикле пока не отправятся данные(из прерывания), но это не всегда возможно. Зависит от задачи и архитектуры программы, простого ответа тут не вижу.
Вот небольшой возможный код для приёма:
Show код приёма


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 03:57 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
Что-то ерунда какая-то с проверкой переполнения. Пока в обработчике прерывания (по приходу из терминала в UDR) не включаем проверку на предмет переполнения wr_err, всё отлично работает - Мега принимает из терминала команды и выполняет. Как только включаешь, всё заканчивается, причём весьма загадочно. Почему-то UDR_to_RX_Ring начинает возвращать в обработчик прерывания признак переполнения кольца, тот в свою очередь ровно 4 раза выводит в терминал сообщение о переполнении, сколько бы символов ни было в посылке в Мегу, после чего в массив tmp из кольца оказываются перегруженными всегда только первые три символа посылки. Точнее их всегда три, если послал три и больше, если меньше, то сколько послано, столько и в массив попало. Бред какой-то, явно какая-то тупая и простая ошибка, но за 6 часов так и не нашёл. Гляньте свежим глазом, пожалуйста. В спойлере кольцевой буфер на приём, обработчик прерывания и несколько строк из main, в которых вывод на lcd принятой команды из терминала. Всё с пояснениями. Обработка команд из кольца идёт в 2с паузах между посылками на lcd строк с результатами измерений. Кольцо 256 байт, маску не используем.

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 05:06 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Я бы сказал (на первый взгляд) что тут много ошибок... и вообще странно написано - зачем-то лишние функции типа UDR_to_RX_Ring которые вызываются из прерывания и запутывают всё ещё больше.
Вижу явную ошибку при обработке FE0 - регистр UCSR0A читается после UDR0, а должен до(об этом я, кстати, писал). Но это не из-за неё такое поведение.
При 256 байт кольце, функция RX_IndexNumber заменяется одной строчкой: RX_IndexIN - RX_IndexOUT, но это не ошибка.
Возможно, для RX_IndexOUT нужно volatile, но не уверен что такое из-за этого. Но можно попробовать.
И вообще здесь так странно используется кольцевой буфер, что лучше бы его не использовать - без него в этом конкретном случае было бы проще, как мне кажется.
Завтра ещё посмотрю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 06:32 
Свой человек

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 35
Самое главное в кольцевых буферах - в момент изменения счетчика кол-ва данных - запрещать прерывания...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 10:31 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
h4lf писал(а):
Я бы сказал (на первый взгляд) что тут много ошибок... и вообще странно написано - зачем-то лишние функции типа UDR_to_RX_Ring которые вызываются из прерывания и запутывают всё ещё больше.
Вижу явную ошибку при обработке FE0 - регистр UCSR0A читается после UDR0, а должен до(об этом я, кстати, писал). Но это не из-за неё такое поведение.
При 256 байт кольце, функция RX_IndexNumber заменяется одной строчкой: RX_IndexIN - RX_IndexOUT, но это не ошибка.
Возможно, для RX_IndexOUT нужно volatile, но не уверен что такое из-за этого. Но можно попробовать.
И вообще здесь так странно используется кольцевой буфер, что лучше бы его не использовать - без него в этом конкретном случае было бы проще, как мне кажется.
Завтра ещё посмотрю.

Про обработку FE0 учту, сейчас он не при делах.
UDR_to_RX_Ring переносит байт из UDR в кольцо, поэтому и вызывается из прерывания. Вот из неё-то в вызывающий её обработчик почему-то возвращается 2, хотя переполнения быть не может.
RX_IndexOUT делал volatile, не помогло.
RX_IndexNumber[/color] заменить одной строчкой RX_IndexIN - RX_IndexOUT нельзя, получим отрицательное число при переходе RX_IndexIN через 255.
Без кольцевого буфера в этом упрощённом варианте можно, но потом в реальной работе с СИМ без него никак, надо освоить сейчас.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 10:39 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
aav8 писал(а):
Самое главное в кольцевых буферах - в момент изменения счетчика кол-ва данных - запрещать прерывания...

Счётчик кол-ва данных RX_IndexNumber сам по себе не меняется, он просто вычисляет разницу между индексами RX_IndexIN и RX_IndexOUT. Или вы имеете в виду запрет прерываний при каждом инкременте RX_IndexIN и RX_IndexOUT ? Почему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 11:15 
Свой человек

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 35
Я для кольцевых буферов завожу 3 штуки переменных:
указатель начала
указатель конца
счетчик кол-ва

Обработчик прерывания по приему складывает данные в буфер
по адресу указателя начала и увеличивает счетчик кол-ва.

В основном цикле просто смотрим на счетчик кол-ва.
Если он больше нуля, значит что-то можно прочитать.
Выбираем данные из буфера по адресу указателя конца.
Увеличиваем указатель конца буфера.
Запрещаем прерывания.
Уменьшаем кол-во.
Можно опять разрешить прерывания.

Ест-нно если указатель конца или начала выходят за пределы буфера,
сбрасываем их в 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 11:26 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2409
Откуда: Москва
Что есть указатель конца?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 11:37 
Свой человек

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 35
ILYAUL писал(а):
Что есть указатель конца?

Также как и начала-
индекс в массиве, отведенный для буфера.
Или может быть конкретным адресом области памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 12:45 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
aav8 писал(а):
Я для кольцевых буферов завожу 3 штуки переменных:
указатель начала
указатель конца
счетчик кол-ва

Обработчик прерывания по приему складывает данные в буфер
по адресу указателя начала и увеличивает счетчик кол-ва.

В основном цикле просто смотрим на счетчик кол-ва.
Если он больше нуля, значит что-то можно прочитать.
Выбираем данные из буфера по адресу указателя конца.
Увеличиваем указатель конца буфера.
Запрещаем прерывания.
Уменьшаем кол-во.
Можно опять разрешить прерывания.

Ест-нно если указатель конца или начала выходят за пределы буфера,
сбрасываем их в 0.

Так и я так же делаю. Я только не понял с момента "Запрещаем прерывания." Вы же перед этим, увеличивая указатель конца буфера при считывании из него, тем самым уже уменьшаете количество непрочитанных байт в буфере. Что тогда вы уменьшаете между запретом и разрешением прерываний и почему их надо запрещать перед этим?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 13:51 
Свой человек

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 35
Кол-во данных в кольцевом буфере ни есть разница между
указателями конца и начала. В общем случае указатель
конца может быть больше чем начало (в этом случае начало данных
находятся ближе к концу буфера, и продолжаются в началебуфера).
Прерывания необходимо запрещать, если операция изменения кол-ва
данных не атомарна (т.е. состоит не из одной единственной команды
процессора), что-бы не было конфликтов с обработчиком прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 14:21 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
aav8 писал(а):
Кол-во данных в кольцевом буфере ни есть разница между указателями конца и начала. В общем случае указатель конца может быть больше чем начало (в этом случае начало данных находятся ближе к концу буфера, и продолжаются в начале буфера). Прерывания необходимо запрещать, если операция изменения кол-ва данных не атомарна (т.е. состоит не из одной единственной команды процессора), что-бы не было конфликтов с обработчиком прерываний.

Как работает кольцевой буфер я знаю. Поэтому я не понимаю, что вы уменьшаете между запретом и разрешением прерываний. Ведь количество байт в буфере - есть результат от функции запроса разницы между индексами начала и хвоста. Этот результат меняется при каждом вызове этой функции, если данные между вызовами записаны в кольцо или считаны из него. Что значит "операция изменения кол-ва"? И почему только при запрещённых прерываниях?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 15:00 
Свой человек

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 35
Допустим мы определили буфер размером к примеру 5 байт.

char rBuf[5]

Указатели начала, конца и счетчик кол-ва = 0.

Прилетел к нам символ
начало = 1
конец = 0
счетчик= 1
разница начало-конец =1

Еще символ
начало = 2
конец = 0
счетчик= 2
разница начало-конец =2

Еще символ
начало = 3
конец = 0
счетчик= 3
разница начало-конец =3

Забрали символ
начало = 3
конец = 1
счетчик= 2
разница начало-конец 3-1=2

Забрали символ
начало = 3
конец = 2
счетчик= 1
разница начало-конец 3-2=1

Прилетел к нам символ
начало = 4
конец = 2
счетчик= 2
разница начало-конец 4-2=2

Забрали символ
начало = 4
конец = 3
счетчик= 1
разница начало-конец 4-3=1

Прилетел к нам символ
начало = 0 буфер кольцевой
конец = 2
счетчик= 2
разница начало-конец 0-2=-2 ?

Прилетел к нам символ
начало = 1
конец = 2
счетчик= 3
разница начало-конец 1-2=-1 ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 16:14 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
aav8 писал(а):
Допустим мы определили буфер размером к примеру 5 байт.

Прилетел к нам символ
начало = 0 буфер кольцевой
конец = 2
счетчик= 2
разница начало-конец 0-2=-2 ?

Прилетел к нам символ
начало = 1
конец = 2
счетчик= 3
разница начало-конец 1-2=-1 ?

Зачем разделять понятие счётчика байт в кольце и разницы начало-конец? Количество символов в кольце либо = (начало-конец), если начало > конца, либо = (размер буфера - конец + начало) если начало < конца.
Тогда:

начало = 3
конец = 0
Символы в ячейках 3, 2, 1, всего 3.
счетчик = разница = 3 - 0 = 3

или
начало = 0 буфер кольцевой
конец = 2
Символы в ячейках 0, 4, 3, всего 3
счетчик = разница = 5 - 2 + 0 = 3

или
начало = 1
конец = 2
Символы в ячейках 1, 0, 4, 3, всего 4
счетчик = разница = 5 - 2 +1 = 4

Тогда не нужна будет операция уменьшения количества между запрещением и разрешением прерываний и становится понятным, зачем вам это нужно - пока идёт излишняя операция вычисления количества символов в кольце запросто пройдёт прерывание, прилетит символ и результат вычислений будет уже неактуальным.
У меня кольцо работает адекватно, пока не начинаешь проверять на предмет начало = конец. Как только активируешь проверку и действия при выполнении условия =, адекватность кончается, начинаются глюки. Хотя переполнения нет и быть не может, иначе бы и без проверки было криво. Кольцо 256 байт, а шлю 4. Явно ошибка в чём-то другом, но уже глаза стёр и не вижу. Похоже на шутки компилятора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 19:28 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
TSV писал(а):
Зачем разделять понятие счётчика байт в кольце и разницы начало-конец? Количество символов в кольце либо = (начало-конец), если начало > конца, либо = (размер буфера - конец + начало) если начало < конца.

Ну любят люди добавлять себе проблем и работы (да и сам я людь - тоже бывает). В основном это от плохого понимания. Я тоже не понимаю - зачем добавлять лишнюю глобальную переменную счётчика с которой будет столько возни из-за того, что она изменяется и в прерывании и в основной программе.

Вот ещё пример:
TSV писал(а):
заменить одной строчкой RX_IndexIN - RX_IndexOUT нельзя, получим отрицательное число при переходе RX_IndexIN через 255.
ну как Вы себе представляете отрицательное число в регистре микроконтроллера? К тому же индексы объявлены как uint8_t (без знака). Всегда получится разница между головой (RX_IndexIN) и хвостом (RX_IndexOUT), главное чтобы голова на хвост не наехала (переполнение), а переход через ноль (в случае 256) учитывается автоматически. Можете проверить в симуляторе студии. А если буфер равен степени двойки но меньше 256 то можно делать как в статье:
Код:
u8 idxDiff (u8 idxIN, u8 idxOUT)
{
   return (idxIN - idxOUT)&BUF_MASK;
}


А тут:
Код:
      RX_IndexIN++;
      RX_ring[RX_IndexIN] = value;

сначала надо записать по RX_IndexIN а потом уже его инкрементировать. А проще сразу написать как у меня в примере:
Код:
RxUartBuffer[RxIdxWrite++] = UDR0;

Так как если ++ после преременной - это постинкремент (сначала по нему записывается, а потом он увеличивается на 1).
А у Вас получилось прединкремент:
Код:
RxUartBuffer[++RxIdxWrite] = UDR0;

но как это может дать такой эффект (на один пришедший символ - четыре раза сообщение о переполнении) я не понимаю.
А что в функции string_to_USART (rx_ring_ovf); как она работает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 21:00 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
h4lf писал(а):
ну как Вы себе представляете отрицательное число в регистре микроконтроллера? К тому же индексы объявлены как uint8_t (без знака). Всегда получится разница между головой (RX_IndexIN) и хвостом (RX_IndexOUT), главное чтобы голова на хвост не наехала (переполнение), а переход через ноль (в случае 256) учитывается автоматически.

Вот именно, чтобы не вычесть из меньшего большее при переходе головы через 255 (голова перешла 0 , а хвост ещё где-то 0-255) я определяю количество байт в кольце двумя способами, в зависимости от соотношения индексов, это в функции RX_IndexNumber. Я просто пока не использую маску вообще в кольце. Пока мне так проще. Индексы объявлены как uint8_t чтобы работали в полном диапазоне 0-255.
h4lf писал(а):
А тут:
Код:
      RX_IndexIN++;
      RX_ring[RX_IndexIN] = value;

сначала надо записать по RX_IndexIN а потом уже его инкрементировать. А проще сразу написать как у меня в примере:
Код:
RxUartBuffer[RxIdxWrite++] = UDR0;

Так как если ++ после преременной - это постинкремент (сначала по нему записывается, а потом он увеличивается на 1).А у Вас получилось прединкремент:

Реально это вопрос способа реализации кольца - можно сначала сдвигать индекс головы, потом записывать, а можно сначала записывать, а потом сдвигать и тогда при следующей записи можно будет сразу записывать в голову. Соответственно и работа с хвостом так же по другому будет. Немного меняется алгоритм, но оба варианта имеют право жить, у меня сделано так - сначала нужно сдвинуть голову на шаг вперёд, а потом туда записать символ. Поэтому и используется предекремент. А иначе мы запишем новый полученный символ поверх ранее записанного.
h4lf писал(а):
но как это может дать такой эффект (на один пришедший символ - четыре раза сообщение о переполнении) я не понимаю. А что в функции string_to_USART (rx_ring_ovf); как она работает?

Не совсем так. Включаем обработку переполнения. Теперь отправляем в Мегу от трёх символов и выше, в ответ на это получается всегда четыре раза переполнение, по факту которого четыре же раза UDR_to_RX_Ring отправляет в обработчик прерывания return 2. Каждый раз при этом функция отправки в УАРТ строки из флэш string_to_USART (rx_ring_ovf) исправно выводит это самое сообщение о переполнении. После чего в кольце остаётся только три первых символа. Если отправлять меньше трёх, будет не 4, а 3 и меньше таких глюков, а в кольце тогда остаются все отправленные символы, без обрезания. Какой-то бред. Тем более, что переполнения просто не может быть. Это очень похоже на игры компилятора. Причём весь код отлично работает, если обработку переполнения (которого нет) отключить.
string_to_USART (rx_ring_ovf) это просто отправка строки из флэш через посимвольную запись в UDR, ничего больше, пока без кольца сделана. rx_ring_ovf - указатель на строку во флэш. Сама по себе она нормально работает в других местах кода, как и здесь тоже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 22:25 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Даже если "голова перешла 0 , а хвост ещё где-то 0-255" то всё равно будет верно. Определять отношения индексов (кто из них больше, а кто меньше) совершенно излишне. Тут немного не та математика, которую всем "вдалбливают в головы" в школах (по словам самих же учителей). Эти все сравнения только усложняют и запутывают код.
С предекрементом при записи, если преддекремент и при чтении - согласен, можно и так. Вроде бы, просто я так не пробовал, и в моих случаях это было бы менее удобно, наверное. Но у меня опыта мало в С и вообще в программировании.

А каким образом выключаете проверку?
Так и не понял - переполнение приходит (строка из МК) на каждый отправленный в него символ? И как они отправляются - все вместе без пауз или ручным набором с терминала?
Если есть сомнения в оптимизаторе - отключите оптимизацию, если заработает как задумывалось - значит нужно копать в этом направлении.
Ещё могу попробовать вставить проверку такого типа в свой код, и посмотреть что будет. Ни разу не использовал, если честно, вроде бы не было необходимости, а данные обрабатываются налету.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 22:49 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
h4lf писал(а):
Даже если "голова перешла 0 , а хвост ещё где-то 0-255" то всё равно будет верно. Определять отношения индексов (кто из них больше, а кто меньше) совершенно излишне. Тут немного не та математика, которую всем "вдалбливают в головы" в школах (по словам самих же учителей). Эти все сравнения только усложняют и запутывают код.
С предекрементом при записи, если преддекремент и при чтении - согласен, можно и так. Вроде бы, просто я так не пробовал, и в моих случаях это было бы менее удобно, наверное. Но у меня опыта мало в С и вообще в программировании.

Попробую имитировать вечером, посмотрю, что выходит.
h4lf писал(а):
А каким образом выключаете проверку?

Просто удаляю в обработчике прерывания кусок кода, чтобы игнорировать обработку возвращаемого в него из UDR_to_RX_Ring значения (return 2).
h4lf писал(а):
Так и не понял - переполнение приходит (строка из МК) на каждый отправленный в него символ? И как они отправляются - все вместе без пауз или ручным набором с терминала?

Из терминала отправляю строку без пауз, сначала набираю и жму enter, она принимается и в ответ на каждое прерывание по приходу символа в UDR получаем переполнение, причём строго 4 раза вне зависимости от количества отправленных байт, если их больше трёх А если проверку переполнения игнорировать, то все работает, как часы.
h4lf писал(а):
Если есть сомнения в оптимизаторе - отключите оптимизацию, если заработает как задумывалось - значит нужно копать в этом направлении.

Оптимизацию совсем не выключить, перестают корректно работать задержки, на которых построена 1-Wire часть. Другие уровни оптимизации вчера пробовал, эффект тот же.
h4lf писал(а):
Ещё могу попробовать вставить проверку такого типа в свой код, и посмотреть что будет. Ни разу не использовал, если честно, вроде бы не было необходимости, а данные обрабатываются налету.

Меня уже тоже подмывает убрать её, просто вопрос-то принципиальный, эти грабли можно встретить в другом месте, где не обойти просто так будет. Попробуйте, если не лень, даже интересно, что выйдет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 23:37 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
НАШЁЛ! Это не игры компилятора, это игры мозга. Дебильная ошибка, выкладываю кусочек, где она была, желающие могут потренироваться на блиц. Подсказка - остальной код смотреть не нужно, всё здесь.
Код:
   wr_err = UDR_to_RX_Ring(temp);// запрашиваем запись в кольцо и принимаем код успешности
   if(wr_err == 2); //при ошибке переполнения кольца выводим сообщение
   {
      string_to_USART (rx_ring_ovf);
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 19 май 2017, 23:58 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Чёрд! точка с запятой там где не надо? )))
Ну ладно, не буду всё стирать из того что успел написать:
А я и думаю - если функцию UDR_to_RX_Ring при отключении проверки не меняете, то ещё более странно. Ведь если двойка появляется из неё, то как данные вообще попадают в кольцевой буфер?
Если честно, мне этот 1-wire очень не нравится именно из-за его требований к задержкам и из-за отсутствия аппаратной поддержки (в AVR по крайней мере). Хотя как-то можно реализовать 1-wire на модуле USART или таймерах, точно не скажу - мне не приходилось иметь с ним дело. Но если можно лучше обойтись без обычных(тупых) задержек. Кстати, обычные задержки будут увеличиваться от того, что во время их работы будут происходить прерывания. Не забывайте это учитывать.
git используете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 20 май 2017, 00:10 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
И компилятор ошибки и предупреждения даже не выдал? Хотя, проверил в студии - в проекте по умолчанию не выдаёт вообще ничего, но если включить Extra warnings (-Wextra) то на такое выдаёт предупреждение:
Цитата:
suggest braces around empty body in an 'if' statement [-Wempty-body]

А вот армовский GCC вообще выдал ошибку и отказался компилировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 20 май 2017, 11:42 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
h4lf писал(а):
А я и думаю - если функцию UDR_to_RX_Ring при отключении проверки не меняете, то ещё более странно. Ведь если двойка появляется из неё, то как данные вообще попадают в кольцевой буфер?
Отсюда и искал. Вывел на lcd, что из неё появляется, оказалось 0, а не 2. Дальше - всё однозначно.
h4lf писал(а):
Если честно, мне этот 1-wire очень не нравится именно из-за его требований к задержкам и из-за отсутствия аппаратной поддержки (в AVR по крайней мере). Хотя как-то можно реализовать 1-wire на модуле USART или таймерах, точно не скажу - мне не приходилось иметь с ним дело. Но если можно лучше обойтись без обычных(тупых) задержек. Кстати, обычные задержки будут увеличиваться от того, что во время их работы будут происходить прерывания. Не забывайте это учитывать.
УАРТ в моём камне один, а весь интерес в начале был именно реализовать OW программно. Это потом аппетит прорезался. Сейчас уже два прерывания задействовано и пока сбоев нет. Там задержки 6 - 500 мкс, а на 16 МГц один такт 0.06 мкс, так что проблем и дальше быть не должно.
h4lf писал(а):
git используете?
Что есть git? Если github, то ещё не дорос до этого, не ощутил необходимости. Проект же учебный, а githug же нужен при совместной разработке, в основном. Да и как-то там всё сложно устроено для начинающего.
h4lf писал(а):
При 256 байт кольце, функция RX_IndexNumber заменяется одной строчкой: RX_IndexIN - RX_IndexOUT,
Проверил, действительно можно, а при 256 байт буфере даже маску накладывать не нужно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 20 май 2017, 16:42 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Зависит от того, насколько точные задержки нужны. Даже на 16 МГц простейший обработчик, типа записи в кольцевой буфер, будет занимать около 2 мкс времени (25 команд, что даёт 1.5625 мкс, но много команд выполняются 2 такта, а reti целых 4). Вот листинг такого обработчика для примера:
Код:
ISR(USART_RX_vect)
{
452:   1f 92          push   r1
454:   0f 92          push   r0
456:   0f b6          in   r0, 0x3f   ; 63
458:   0f 92          push   r0
45a:   11 24          eor   r1, r1
45c:   8f 93          push   r24
45e:   ef 93          push   r30
460:   ff 93          push   r31
   RxUartBuffer[RxIdxIn++] = UDR0;
462:   e0 91 0b 03    lds   r30, 0x030B
466:   81 e0          ldi   r24, 0x01   ; 1
468:   8e 0f          add   r24, r30
46a:   80 93 0b 03    sts   0x030B, r24
46e:   80 91 c6 00    lds   r24, 0x00C6
472:   f0 e0          ldi   r31, 0x00   ; 0
474:   e7 5f          subi   r30, 0xF7   ; 247
476:   fe 4f          sbci   r31, 0xFE   ; 254
478:   80 83          st   Z, r24
}
47a:   ff 91          pop   r31
47c:   ef 91          pop   r30
47e:   8f 91          pop   r24
480:   0f 90          pop   r0
482:   0f be          out   0x3f, r0   ; 63
484:   0f 90          pop   r0
486:   1f 90          pop   r1
488:   18 95          reti

я тут насчитал 44 такта, что равно 2.75 мкс. И все прерывания, что случаются во время этих циклических задержек добавляют своё время к ним. Прикидывайте - возможны проблемы или нет. Можете посмотреть листинг своих обработчиков(кстати и вызов - call и возврат - ret тоже выполняются по 4 такта). Тайминги для 1-wire я нашёл здесь http://microsin.ru/content/view/508/44/ но подробно не изучал. Но кажется мне, что для повышенной скорости как-то печально выходит...

Нет, git, это не гитхаб. git это система контроля версий - удобная штука, особенно для программирования. Я мало писал программ и в общем-то тоже учусь, но решил и git осваивать (можно через командную строку, но есть и разные gui). Раньше, чтобы попробовать какую-то идею я делал копию папки проекта, чтобы случаем не запороть. Теперь просто делаю новую ветку и там экспериментирую - если всё получилось - можно слить с основной, а нет - просто перейти опять на основную ветку. Вот например это можно почитать http://we.easyelectronics.ru/CADSoft/gi ... e.html#cut
Это я как справочник использую https://git-scm.com/book/ru/v1/%D0%92%D ... 0%B8%D0%B5
Ну и эти примеры могут пригодиться http://najomi.org/git
И без совместной разработки много удобств. В общем - чем больше пишете, тем больше плюсов от освоения этого инструмента.

Кстати, вот ссылка на тот проект, в который я хотел добавить проверку переполнения, посмотрите если интересно, может что-то пригодится https://github.com/h4lf/rotator
Там можно скачать zip архив, проект для 6 студии. Там есть и приём и передача по UART. Устройство принимает по UART команды вида "m258\r\n" где 258 - угол в градусах и выдаёт сигнал на соответствующую ногу для переключения антенны (север, восток, юг, запад). На неправильные команды ругается. Так же можно управлять четырьмя кнопками вручную. Проверки на переполнение нет но она там на приём и не нужна. Буфер передачи в принципе может переполниться, но это тут не страшно. Но как нибудь попробую добавить индикацию переполнения буфера передачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 21 май 2017, 01:50 
Свой человек

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 108
Я и забыл совсем, давно уже с OW частью разобрался - у меня каждое действие по отправке или приёму бита идёт в глобально запрещённых прерываниях. Поэтому риски другие - пропуск информации от СИМ. Надо будет подумать об этом - пока проблем нет, но нужно учесть возможность их появления.
За идею git спасибо, я это и имел в виду, когда про гитхаб говорил, просто пока для меня git и github таинственные слова, поэтому я их не различаю. Но про git мысли давно бродят, может это как раз момент освоить. Я тоже предыдущие версии сохраняю, чтобы откатиться можно было, а храню в папках в dropbox, чтобы с разных мест работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно организовать работу по UART с SIM-900
СообщениеДобавлено: 21 май 2017, 03:42 
Свой человек
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 72
Вон даже как... Ну тогда надо считать с другой стороны. Допустим на скорости 115200 бод - один байт будет идти 10/115200 = почти 87 мкс. Так как в приёмный UDR может поместиться два байта (и при этом ещё будет продолжаться приём следующего в сдвиговый регистр). То, в принципе, можно запрещать прерывания на срок до 87*2 = 174 мкс, так так UDR не успеет затереться и ещё будет время на чтение. И так следует учесть все прерывания если их ещё есть(и с учётом приоритетов на худший случай). Ещё может быть нужно, чтобы после разрешения прерываний было несколько команд до того как снова будет запрет(не помню - после возврата из обработчика будет выполняться следующая команда перед вызовом следующего ожидающего обработчика или нет).
А на скорости 9600 получается 1041 мкс на передачу байта. Так что если нет других критических прерываний - то ничего страшного.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB