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

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

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


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

При отсутствии аппаратного 1wire принято использовать uart https://www.maximintegrated.com/en/app-note...ndex.mvp/id/214

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


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

Да использовал я такое ранее, инвертора от тини-лоджик брал. Особенность в точности 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:

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...