Jump to content

    

Програмный 1-wire на прерываниях таймера

Моя первая реазилация 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);
}

Share this post


Link to post
Share on other sites
Как можно красиво написать похожее чисто на си ?

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

А вопросы красиво/некрасиво - это все индивидуально и крайне субъективно :laughing:

 

 

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

Share this post


Link to post
Share on other sites
Взять что-нибудь уже готовое: тыц.

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

Так поставьте нормальную RTOS

Что бы потом пихать в проект ещё и RTOS, когда надо снять данные с датчика температуры и выдать их в usart =)

Прерывания от таймера, это отдельный процесс как в RTOS, только без сохранения контекста =(

+ это очень легко можно запустить на любом процессоре, разобравшись только в таймере и кинув в него 1 функцию.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Ну так там везде в функции tickDelay, ставят цикл ожидания, и все остальные процессы останавливаются на это время.

Учитесь обходиться без задержек. "Везде ставят цикл ожидания" только чайники.

Share this post


Link to post
Share on other sites
Учитесь обходиться без задержек
, это я умею (см первый пост там их нету).

 

Share this post


Link to post
Share on other sites
Учитесь обходиться без задержек. "Везде ставят цикл ожидания" только чайники.
С чего это? Решение задачи определяется задачей. И если хватает времени ждать и нет необходимости делать в это время что-то ещё то задержки могут быть самым надёжным решением.

 

Share this post


Link to post
Share on other sites
С чего это? Решение задачи определяется задачей.

Обратите внимание на слово "везде".

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Да использовал я такое ранее, инвертора от тини-лоджик брал. Особенность в точности UARTа, кварц у проца должен быть точный, с малым разбросом +/-20ppm или лучше и кратный стандарту скорости UARTA. Иначе чудеса.

Share this post


Link to post
Share on other sites
Особенность в точности UARTа, кварц у проца должен быть точный, с малым разбросом +/-20ppm или лучше и кратный стандарту скорости UARTA. Иначе чудеса.

Какие 20ppm??? У 1-wire требования к таймингам крайне гуманные

О каком МК идет речь? Какой частоты был этот "волшебный" кварц и какая была тактовая частота МК?

Share this post


Link to post
Share on other sites
. . . Как можно красиво написать похожее чисто на си ? Думаю в сторону переключения адреса, но как это сделать красиво ? . . .

Красота наводит на мысль использования автомата (FSM) + события от таймера по сработке от CCR. CCR - перезагружается на требуемый интервал.

Но красиво не всегда (разве что самолет) оптимально.

 

Share this post


Link to post
Share on other sites
Какие 20ppm??? У 1-wire требования к таймингам крайне гуманные

О каком МК идет речь? Какой частоты был этот "волшебный" кварц и какая была тактовая частота МК?

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

Share this post


Link to post
Share on other sites
Ну ка раскажите мне про этот гуманизм,

Да этому "стандарту" уже почти 30 лет, обсосан до костей.

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

 

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

Нда, случай крайне сложный, похоже на некий "распил".

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now