ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
189453 Топик полностью
VAI (14.04.2010 10:45, просмотров: 202) ответил Скрипач на Вообще-то было бы интересно услышать VAI, а не то, что вы, в отличии от меня, не сильно парились и быстро все запрограммировали :)
Подробности реализации таковы: Вначале была реализована, отлажена связь при запрещённых прерываниях с софтовыми задержками, затем код был переписан по "индусски", как линейный. Разбит на участки
строки кода1
задержка в мс
---
строки кода2
задержка в мс
.........
.........
строки кодаN
задержка в мс
---
Т.е. строки кода мы будем выполнять при каждом следующем вызове прервания выполняем "строки кода1", "строки кода2" и т.д. соответственно. Эти "строки кода" оформлены как функции, указатели на эти функции помещены в массив структур, туда-же помещены задержки после этого кода. typedef struct // Чтение градусника, по шагам, 1 шаг. { func_ptr f; // выполняемая функция int del_time; // задержка после нее } termo_step; Используем прерывание по Compare, т.е. прерывание вызывается при совпадении значения таймера и значения регистра захвата/сравнения. #pragma vector=TIMERB0_VECTOR __interrupt void TIMERB0_isr( void ) { ( *( *++termo_arr_ptr ).f )(); TBCCR0 = TBR + ( *termo_arr_ptr ).del_time; } termo_arr_ptr - указатель на элемент массива. Всё это проделывалось достаточно давно, работает, проблем нет. В системе нет длительных прерываний, или после выполнения критических секций в коде прерывания разрешаем прерывания (т.е. получаются вложеные прерывания). Иногда бывают сбои, раз в несколько минут, но т.к. у DS18B20 есть контрольная сумма, то сбойные значения игнорируем. Это всё для MSP430, про AVR ничего не знаю...