реклама на сайте
подробности

 
 
> Програмный 1-wire на прерываниях таймера, Красивый выход из прерывания с переключением контекста
pokk
сообщение Sep 25 2018, 09:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Моя первая реазилация 1-wire была на прерываниях от таймера и чисто на switch case,
это было дикая спагетти кода, потом частично завернул в функции, но все равно не нравилось как получилось,
последний раз написал на protothreads, уже как-то глаз радует, а теперь сижу и опять не доволен
не охото к каждому проекту пихать protothreads, + оборачивать макросами PT_BEGIN,PT_END

Как можно красиво написать похожее чисто на си ? Думаю в сторону переключения адреса, но как это сделать красиво ?
на protothreads получилось такое:
Код
//PT_YIELD(pt); - выход из функции, + сохранение место выхода
#define SetDelay_us(value) TCCR3B=0x01; TCNT3H=(0xFFFF-value*(CPU_CLK/1000000))>>8;\
                           TCNT3L=(0xFFFF-value*(CPU_CLK/1000000));\
                           PT_YIELD(pt);\    

PT_THREAD(Wire_Reset_thread(struct pt *pt,unsigned char *ReturnValue)){
static unsigned short int Ack[2];
PT_BEGIN(pt);
    //---------------------------------------------
    Ack[0]=0;
    Ack[1]=0;
    //--Переключаем линию на выход и записываем 0--
    Switch_Out();
    SetDelay_us(480);
    //--Переключаем линию на выход-----------------
    Switch_In();
    //---------------------------------------------
    SetDelay_us(80);
    //---------------------------------------------
    Ack[0]=T1;
    //---------------------------------------------
    SetDelay_us(250);
    //---------------------------------------------
    Ack[1]=T1;
    //---------------------------------------------
    if((Ack[0] == 0)&&(Ack[1] ==1)){
        *ReturnValue=SENSOR_INIT_VALIDATION_SUCCESS;
    }else{
        //------------------------------------------------------------------------------------------
        //*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
        if((Ack[0]==1)&&(Ack[1]==1)){
            *ReturnValue=TYPE_T_SHORT_CIRCUIT_1;
        }else{
            *ReturnValue=TYPE_T_SHORT_CIRCUIT_0;
        }
        //------------------------------------------------------------------------------------------
    }
    //---------------------------------------------
PT_END(pt);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
uriy
сообщение Sep 26 2018, 18:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



При отсутствии аппаратного 1wire принято использовать uart https://www.maximintegrated.com/en/app-note...ndex.mvp/id/214
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 26 2018, 22:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(uriy @ Sep 26 2018, 21:45) *
При отсутствии аппаратного 1wire принято использовать uart https://www.maximintegrated.com/en/app-note...ndex.mvp/id/214

Кем принято?
Открываем указанную ссылку, читаем:
Для сброса и обнаружения устройства нужно послать код 0xF0 на скорости 9600. И:
1) "если устройства нет, то на RX получим 0xF0"; Утверждение не вызывает сомнения.
2) "если устройство есть, то на RX получим что-то отличное от 0xF0"; А вот тут уже - фиг вам!
Открываем описание интерфейса 1-wire, читаем:
Чтобы сформировать сигнал «Reset», — «Мастер» должен притянуть уровень на шине к нулю на время не менее 480 мкс и не более 960 мкс (480 мкс ≤ TRSTL < 960 мкс). После этого он должен отпустить шину и, не менее, чем на 480 мкс, прекратить свою активность на шине (TRSTH > 480 мкс). «Слэйвы», не ранее, чем через 15 мкс, но и не позднее, чем через 60 мкс после того, как «Мастер» отпустит шину (15 мкс < TPDH < 60 мкс), должны сформировать на шине низкий уровень (это и есть сигнал присутствия), длительностью от 60 до 240 мкс (60 мкс < TPDL < 240 мкс), после чего они также отпускают шину.
Оп-ля - приехали! 05.gif
При скорости 9600 длительность бита == 104мкс. Предположим что частоты генераторов мастера и слэйва идеально совпадают. Тогда, после завершения передачи мастером младших 4-х бит кода 0xF0, на шине наступит фронт сигнала. И в это время UART мастера начнёт приём 4-го бита. Точка сэмплирования этого бита находится на расстоянии 104/2=52мкс от указанного фронта (конца RESET). Но ведь из описания выше следует, что слэйв имеет право начать формировать сигнал присутствия через 60мкс после завершения RESET. Т.е. - уже после того как мастер считает с шины состояние 4-го бита! И мастер получит в 4-м бите лог.1. smile3009.gif
Окей, ладно - может хоть в следующем бите мастер сможет узреть на шине несчастного слэйва?? fman.gif
Но опять же - из описания выше можно узнать, что сигнал присутствия генерируемый слэйвом, может быть длительностью всего 60мкс. Но ведь мы помним, что между точками сэмплирования RX-битов мастером расстояния == 104 мкс (1 бит UART). Получается, что если импульс присутствия начнётся через 60 мкс после конца RESET и продлится всего 60 мкс, то он аккурат проскочит между двумя точками сэмплирования UART.RX мастера. И мастер его просто не заметит!
Хотя мальчик-то есть, но вот колхоз на UART его не видит.... crying.gif
А значит такую реализацию уже нельзя считать 1-wire. Ну никак нельзя.
И это мы ещё даже не учли влияния разности частот генераторов мастера и слэйва, а также влияние ёмкости линии. А также не учли, что делитель UART-а может быть дробным (а длина бита UART - переменной). Там будет ещё веселее.
После этого дальше читать указанную ссылку смысла уже нет.

Цитата(Forger @ Sep 26 2018, 22:48) *
Да этому "стандарту" уже почти 30 лет, обсосан до костей.
Тайминги такие, что заведется с полпинка на любом античном МК даже на встроенном RC-генераторе.

Да ладно?
Не будем углубляться в приём/передачу, но раз "обсосан", то объясните как с помощью UART хотя-бы обнаружить такой слэйв-девайс, который в полном соответствии с мануалом, формирует импульс присутствия с началом через 15...60 мкс после завершения RESET, и длительностью 60...240 мкс?
Это ведь как ловить рыбку сетью, у которой размер ячеи больше размера самой рыбки - конечно есть вероятность что поймаешь, но можно и с голоду опухнуть biggrin.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 27 2018, 05:04
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Sep 27 2018, 01:07) *
то объясните как с помощью UART хотя-бы обнаружить такой слэйв-девайс,
Я не использую для этого UART, для этого есть аппаратные таймеры.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Smen
сообщение Sep 27 2018, 05:23
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081



Цитата(Forger @ Sep 27 2018, 10:04) *
для этого есть аппаратные таймеры
Т.е. используются и таймеры и УАРТ?
В чём смысл?
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 27 2018, 05:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Smen @ Sep 27 2018, 08:23) *
Т.е. используются и таймеры и УАРТ?
Цитирую:
Цитата(Smen)
Я не использую для этого UART


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pokk   Програмный 1-wire на прерываниях таймера   Sep 25 2018, 09:18
- - Forger   Цитата(pokk @ Sep 25 2018, 12:18) Как мож...   Sep 25 2018, 12:46
- - pokk   ЦитатаВзять что-нибудь уже готовое: тыц. Ну так та...   Sep 26 2018, 01:15
|- - Forger   Коли вы так боитесь RTOS, то пользуйтесь и дальше ...   Sep 26 2018, 05:22
|- - jcxz   Цитата(pokk @ Sep 26 2018, 04:15) Ну так ...   Sep 26 2018, 06:30
|- - MegaVolt   Цитата(jcxz @ Sep 26 2018, 09:30) Учитесь...   Sep 26 2018, 09:49
|- - jcxz   Цитата(MegaVolt @ Sep 26 2018, 12:49) С ч...   Sep 26 2018, 09:51
|- - Forger   Имхо, вся эта тема какая-то бессмысленная. Как-буд...   Sep 26 2018, 09:55
- - pokk   ЦитатаУчитесь обходиться без задержек, это я умею ...   Sep 26 2018, 07:33
- - Aner   Да использовал я такое ранее, инвертора от тини-ло...   Sep 26 2018, 19:08
|- - Forger   Цитата(Aner @ Sep 26 2018, 22:08) Особенн...   Sep 26 2018, 19:13
|- - Aner   QUOTE (Forger @ Sep 26 2018, 22:13) Какие...   Sep 26 2018, 19:36
|- - Forger   Цитата(Aner @ Sep 26 2018, 22:36) Ну ка р...   Sep 26 2018, 19:48
- - k155la3   Цитата(pokk @ Sep 25 2018, 12:18) . . . К...   Sep 26 2018, 19:35
- - Aner   Потому вы и есть любители, не разу не прошедшие се...   Sep 26 2018, 19:51
- - rx3apf   Т.е. по делу сказать нечего ? Кто б сомневался...   Sep 26 2018, 19:55
- - VAI   Когда-то я выкладывал сюда код, работающий на STM3...   Sep 27 2018, 10:50
- - toweroff   1-Wire вполне себе реализовывался на SPI 32bit. Пр...   Sep 27 2018, 11:03
|- - AlexandrY   Цитата(toweroff @ Sep 27 2018, 14:03) 1-W...   Sep 27 2018, 11:17
|- - toweroff   Цитата(AlexandrY @ Sep 27 2018, 14:17) Лу...   Sep 27 2018, 11:25
|- - Integro   ЦитатаКрасивый выход из прерывания с переключением...   Sep 27 2018, 12:29
- - uriy   Решение на uart 1wire Отлично работает даже с usb-...   Sep 28 2018, 04:54
|- - jcxz   Цитата(uriy @ Sep 28 2018, 07:54) Решение...   Sep 28 2018, 05:24
- - Arlleex   Не знаю, зачем выделять на это целый UART... Я сде...   Sep 28 2018, 11:15
- - jcxz   Цитата(Arlleex @ Sep 28 2018, 14:15) Не з...   Sep 28 2018, 11:21
|- - Arlleex   Цитата(jcxz @ Sep 28 2018, 14:21) Вы наве...   Sep 28 2018, 11:54
|- - toweroff   Цитата(jcxz @ Sep 28 2018, 14:21) Вообще ...   Sep 28 2018, 20:35
|- - Forger   Цитата(toweroff @ Sep 28 2018, 23:35) пре...   Sep 28 2018, 20:55
|- - jcxz   Цитата(toweroff @ Sep 28 2018, 23:35) пре...   Sep 28 2018, 21:54
- - jcxz   Цитата(Arlleex @ Sep 28 2018, 14:15) Кста...   Sep 28 2018, 12:02
- - Arlleex   Цитата(jcxz @ Sep 28 2018, 15:02) Кодint ...   Sep 28 2018, 12:07
- - jcxz   Цитата(Arlleex @ Sep 28 2018, 15:07) Благ...   Sep 28 2018, 13:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 01:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016