|
Програмный 1-wire на прерываниях таймера, Красивый выход из прерывания с переключением контекста |
|
|
|
Sep 25 2018, 09:18
|
Частый гость
Группа: Участник
Сообщений: 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); }
|
|
|
|
|
Sep 25 2018, 12:46
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(pokk @ Sep 25 2018, 12:18) Как можно красиво написать похожее чисто на си ? Взять что-нибудь уже готовое: тыц. А вопросы красиво/некрасиво - это все индивидуально и крайне субъективно Цитата не охото к каждому проекту пихать protothreads Так поставьте нормальную RTOS
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 26 2018, 01:15
|
Частый гость
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028
|
Цитата Взять что-нибудь уже готовое: тыц. Ну так там везде в функции tickDelay, ставят цикл ожидания, и все остальные процессы останавливаются на это время. Цитата Так поставьте нормальную RTOS Что бы потом пихать в проект ещё и RTOS, когда надо снять данные с датчика температуры и выдать их в usart =) Прерывания от таймера, это отдельный процесс как в RTOS, только без сохранения контекста =( + это очень легко можно запустить на любом процессоре, разобравшись только в таймере и кинув в него 1 функцию.
|
|
|
|
|
Sep 26 2018, 07:33
|
Частый гость
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028
|
Цитата Учитесь обходиться без задержек , это я умею (см первый пост там их нету).
|
|
|
|
|
Sep 26 2018, 19:48
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Aner @ Sep 26 2018, 22:36) Ну ка раскажите мне про этот гуманизм, Да этому "стандарту" уже почти 30 лет, обсосан до костей. Тайминги такие, что заведется с полпинка на любом античном МК даже на встроенном RC-генераторе. Цитата особенно про джиттер фронтов у 1-wire. Даже если от STM 4-е армы, потребуют хороших инверторов перед UART. И не любой частоты кварц даст, через внутренний PLL, нужной точности частоту. Нда, случай крайне сложный, похоже на некий "распил". Вангую, что для поддержки USB пришлось ставить термостабилизированный кварцевый генератор с 5-й приемкой
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|