03.04.2015, 14:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от STM32F0
|
Какие прерывания?
|
Как минимум — compare/capture (считать принятые данные, загрузить новый бит), возможно, еще UEV.
Совсем без прерываний не выйдет, т.к. DMA нет.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
03.04.2015, 15:11
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от eddy
|
Как минимум — compare/capture (считать принятые данные, загрузить новый бит), возможно, еще UEV.
Совсем без прерываний не выйдет
|
Рассказываю на пальцах и один раз, иначе - сатанинский ногодрыг, анафема и костёр.
.
Импульс просадки линии формируется аппаратно, прерывание не нужно.
.
Модулем компарэ формируем прерывание чтения состояния линии, в нём: читаем состояние линии, загружаем новые значения для таймера, на основе состояния линии формируем байт, выставляем флаг окончания чтения темпеатуры и т.д..
.
По наступлению события апдэйта значения из прелоад загружаются в регистры таймера автоматически, прерывание не нужно.
.
Сколько прерываний всего?
Последний раз редактировалось STM32F0; 03.04.2015 в 15:14.
|
|
|
|
03.04.2015, 15:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от STM32F0
|
Модулем компарэ формируем прерывание чтения состояния линии, в нём: читаем состояние линии, загружаем новые значения для таймера, на основе состояния линии формируем байт, выставляем флаг окончания чтения темпеатуры и т.д..
|
Что-то дохрена ты возлагаешь на обработчик прерывания CC. Пока он будет такую кучу вычислений делать, бит уже закончится и попрет следующий! И получится вечный зависон в прерываниях. Знаю, проходил в попытке софтовой эмуляции I2C.
В мануале к DS18 сказано, что продолжительность одного слота записи нуля — от 60 до 120мкс, из которых собственно полезная информация — 30мкс. Можно как ты делать между слотами 100мкс, т.е. таймер настроить на частоту 1МГц, а в ARR запихнуть 100 (на данные). Тогда на запись 0 в CCR2 пишем 60, а на запись 1 пишем 10 (чтобы наверняка больше 1мкс, но меньше 15).
При чтении у нас в CCR2 постоянно болтается 60, а по CCR1 формируем биты: ‹10 — получили единичку, ›10 — получили нолик. Если обработчик прерывания делать универсальным, есть шанс не успеть за интервал в 40 с небольшим микросекунд сделать кучу всего.
Но ХЗ, не буду загадывать.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
03.04.2015, 19:27
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от eddy
|
Что-то дохрена ты возлагаешь на обработчик прерывания CC. Пока он будет такую кучу вычислений делать, бит уже закончится и попрет следующий! И получится вечный зависон в прерываниях.
|
Берём распечатываем картинку, берём школьную линейку, меряем, вычисляем, диву даёмся, чешем затылок до облысения.
Сообщение от eddy
|
Если обработчик прерывания делать универсальным, есть шанс не успеть
|
Берём калькулятор, считаем: 1мкс на вход в прерывание, 1мкс на выход, 5мкс обработка прерывания, слот 70мкс. Итого занято - 7мкс из 70мкс.
Теперь берём твои три прерывания (что ты собираешься делать по апдэйту вообще непонятно): 3*2+5=11мкс.
За что боролись, что выиграли?
|
|
|
|
03.04.2015, 19:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от STM32F0
|
что ты собираешься делать по апдэйту вообще непонятно)
|
Очень даже понятно. Сейчас пишу по твоим советам, но UEV все равно отслеживаю. Вот для чего:
[code]
И правда: таймер можно и изнутри CC вырубить.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
04.04.2015, 20:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
STM32F0, не пойму: вроде бы правильно инициализирую, устанавливая в 1 APRE:
Код:
|
void onewire_setup(){
TIM2_PSCR = 4;
PORT(PD, DDR) |= GPIO_PIN3; // output & pseudo open-drain
PORT(PD, CR2) |= GPIO_PIN3; // fast
TIM2_CCMR2 = 0x60;
TIM2_CCMR1 = 0x02;
TIM2_CCER1 = 0x31;
TIM2_IER = TIM_IER_CC1IE;
TIM2_CR1 = TIM_CR1_APRE | TIM_CR1_URS;
} |
Но при этом как только я в прерывании по CC1 впихиваю в CCR2 новое значение, оно тут же попадает туда: посмотри, какая гадость вместо четвертого бита вылезла (это я команду 0xCC отправляю, т.е. должно быть 00110011, а получается 001хрен011). Что это за нафиг такой?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
04.04.2015, 20:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Если что, вот прерывание:
Код:
|
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14){
if(TIM2_SR1 & TIM_SR1_CC1IF){
TIM2_SR1 &= ~TIM_SR1_CC1IF;
onewire_gotlen = TIM2_CCR1H ‹‹ 8;
onewire_gotlen |= TIM2_CCR1L;
if(onewire_tick_ctr){ // there's some more data to transmit / receive
--onewire_tick_ctr;
if(is_receiver){// receive bits
ow_data ››= 1;
if(onewire_gotlen ‹ ONE_ZERO_BARRIER){ // this is 1
ow_data |= 0x80; // LSbit first!
}
// in receiver mode we don't need to send byte after ctr is zero!
if(onewire_tick_ctr == 0){
TIM2_CR1 &= ~TIM_CR1_CEN;
}
}else{// transmit bits
// update CCR2 registers with new values
if(ow_data & 1){ // transmit 1
TIM2REG(CCR2, BIT_ONE_P);
}else{ // transmit 0
TIM2REG(CCR2, BIT_ZERO_P);
}
ow_data ››= 1;
}
}else{ // end: turn off timer
TIM2_CR1 &= ~TIM_CR1_CEN;
}
}
//if(TIM2_SR1 & TIM_SR1_CC2IF)
// TIM2_SR1 &= ~TIM_SR1_CC2IF;
} |
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
04.04.2015, 20:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Отбой!
Я про OC2PE забыл.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
04.04.2015, 21:27
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
Чужой код - потёмки, но что в глаза бросилось:
нафига if(TIM2_SR1 & TIM_SR1_CC1IF) если там других прерываний нет?
нафига TIM2_SR1 &= ~TIM_SR1_CC1IF; если можно весь TIM2_SR1 сбросить?
ты что там меряешь, onewire_gotlen = TIM2_CCR1H ‹‹ 8;? А если восемь каналов одновременно захочется?
|
|
|
|
04.04.2015, 21:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Все, в базовой комплектации работает.
Еще косяк заметил (но пока не исправил): там же нужны задержки между посылками, поэтому когда я вывожу диагностические сообщения, то все работает, а как только убираю их, паузы получаются недостаточными и глючит. Надысь еще раз даташит на DS18 читануть.
Сообщение от STM32F0
|
нафига if(TIM2_SR1 & TIM_SR1_CC1IF) если там других прерываний нет?
|
Как обычно — забыл удалить после отладок (у меня поначалу еще и CC2 обрабатывалось).
Сообщение от STM32F0
|
нафига TIM2_SR1 &= ~TIM_SR1_CC1IF; если можно весь TIM2_SR1 сбросить?
|
Та же хрень. Чистить код надо, тым дофига такого мусора.
Сообщение от STM32F0
|
ты что там меряешь, onewire_gotlen = TIM2_CCR1H ‹‹ 8;?
|
А как ты измеришь задержку на RESET? Там же в среднем 650мкс! В один int8 не влезет!
Сообщение от STM32F0
|
А если восемь каналов одновременно захочется?
|
Это — в планах. Запущу широковещательную "начать преобразование", а потом поочередно буду собирать данные. Еще надо будет добавить возможность добавления/удаления датчиков (процедура удаления — если опрашиваем датчик, а получаем шиш, то выкидываем его из EEPROM; а добавление — по одному тыкаем и по нажатию кнопки заносим новый идентификатор в EEPROM).
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:07.
|
|