Перейти к содержанию

    

Програмный 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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Как можно красиво написать похожее чисто на си ?

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

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Взять что-нибудь уже готовое: тыц.

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Учитесь обходиться без задержек
, это я умею (см первый пост там их нету).

 

Поделиться сообщением


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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
С чего это? Решение задачи определяется задачей.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
. . . Как можно красиво написать похожее чисто на си ? Думаю в сторону переключения адреса, но как это сделать красиво ? . . .

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Какие 20ppm??? У 1-wire требования к таймингам крайне гуманные

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ну ка раскажите мне про этот гуманизм,

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти