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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Програмный 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
Forger
сообщение Sep 25 2018, 12:46
Сообщение #2


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

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



Цитата(pokk @ Sep 25 2018, 12:18) *
Как можно красиво написать похожее чисто на си ?

Взять что-нибудь уже готовое: тыц.
А вопросы красиво/некрасиво - это все индивидуально и крайне субъективно laughing.gif


Цитата
не охото к каждому проекту пихать protothreads
Так поставьте нормальную RTOS


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


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

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



Цитата
Взять что-нибудь уже готовое: тыц.

Ну так там везде в функции tickDelay, ставят цикл ожидания, и все остальные процессы останавливаются на это время.
Цитата
Так поставьте нормальную RTOS

Что бы потом пихать в проект ещё и RTOS, когда надо снять данные с датчика температуры и выдать их в usart =)
Прерывания от таймера, это отдельный процесс как в RTOS, только без сохранения контекста =(
+ это очень легко можно запустить на любом процессоре, разобравшись только в таймере и кинув в него 1 функцию.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 26 2018, 05:22
Сообщение #4


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

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



Коли вы так боитесь RTOS, то пользуйтесь и дальше неким protothreads. В чем проблема?


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


Гуру
******

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



Цитата(pokk @ Sep 26 2018, 04:15) *
Ну так там везде в функции tickDelay, ставят цикл ожидания, и все остальные процессы останавливаются на это время.

Учитесь обходиться без задержек. "Везде ставят цикл ожидания" только чайники.
Go to the top of the page
 
+Quote Post
pokk
сообщение Sep 26 2018, 07:33
Сообщение #6


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

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



Цитата
Учитесь обходиться без задержек
, это я умею (см первый пост там их нету).
Go to the top of the page
 
+Quote Post
MegaVolt
сообщение Sep 26 2018, 09:49
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 3-01-05
Из: Минск
Пользователь №: 1 783



Цитата(jcxz @ Sep 26 2018, 09:30) *
Учитесь обходиться без задержек. "Везде ставят цикл ожидания" только чайники.
С чего это? Решение задачи определяется задачей. И если хватает времени ждать и нет необходимости делать в это время что-то ещё то задержки могут быть самым надёжным решением.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 26 2018, 09:51
Сообщение #8


Гуру
******

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



Цитата(MegaVolt @ Sep 26 2018, 12:49) *
С чего это? Решение задачи определяется задачей.

Обратите внимание на слово "везде".
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 26 2018, 09:55
Сообщение #9


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

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



Имхо, вся эта тема какая-то бессмысленная. Как-будто ТС чем-то хотел похвастать, но не ясно чем именно wacko.gif


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


Гуру
******

Группа: Свой
Сообщений: 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
Aner
сообщение Sep 26 2018, 19:08
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



Да использовал я такое ранее, инвертора от тини-лоджик брал. Особенность в точности UARTа, кварц у проца должен быть точный, с малым разбросом +/-20ppm или лучше и кратный стандарту скорости UARTA. Иначе чудеса.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 26 2018, 19:13
Сообщение #12


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

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



Цитата(Aner @ Sep 26 2018, 22:08) *
Особенность в точности UARTа, кварц у проца должен быть точный, с малым разбросом +/-20ppm или лучше и кратный стандарту скорости UARTA. Иначе чудеса.

Какие 20ppm??? У 1-wire требования к таймингам крайне гуманные
О каком МК идет речь? Какой частоты был этот "волшебный" кварц и какая была тактовая частота МК?


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


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(pokk @ Sep 25 2018, 12:18) *
. . . Как можно красиво написать похожее чисто на си ? Думаю в сторону переключения адреса, но как это сделать красиво ? . . .

Красота наводит на мысль использования автомата (FSM) + события от таймера по сработке от CCR. CCR - перезагружается на требуемый интервал.
Но красиво не всегда (разве что самолет) оптимально.
Go to the top of the page
 
+Quote Post
Aner
сообщение Sep 26 2018, 19:36
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



QUOTE (Forger @ Sep 26 2018, 22:13) *
Какие 20ppm??? У 1-wire требования к таймингам крайне гуманные
О каком МК идет речь? Какой частоты был этот "волшебный" кварц и какая была тактовая частота МК?

Ну ка раскажите мне про этот гуманизм, особенно про джиттер фронтов у 1-wire. Даже если от STM 4-е армы, потребуют хороших инверторов перед UART. И не любой частоты кварц даст, через внутренний PLL, нужной точности частоту. Опять таки если придерживаемся стандарта 1-wire, а не его интепретаций, то есть для того чтобы работать с теми 1-wire датчиками, таблетками и тп.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 26 2018, 19:48
Сообщение #15


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

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



Цитата(Aner @ Sep 26 2018, 22:36) *
Ну ка раскажите мне про этот гуманизм,

Да этому "стандарту" уже почти 30 лет, обсосан до костей.
Тайминги такие, что заведется с полпинка на любом античном МК даже на встроенном RC-генераторе.

Цитата
особенно про джиттер фронтов у 1-wire. Даже если от STM 4-е армы, потребуют хороших инверторов перед UART. И не любой частоты кварц даст, через внутренний PLL, нужной точности частоту.

Нда, случай крайне сложный, похоже на некий "распил".
Вангую, что для поддержки USB пришлось ставить термостабилизированный кварцевый генератор с 5-й приемкой laugh.gif


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

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 12:16
Рейтинг@Mail.ru


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