25.12.2016, 19:23
|
|
Прописка
Регистрация: 10.03.2016
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 46 раз(а) в 41 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Ivan
|
Можно, конечно, поисправлять stm8s.h
|
Не "можно", а нужно! Недостающее просто вписать ручками. Несовместимость с кем-то и чем-то меня вообще в этом случае мало интересует.
1. Так уж есть, разработчик поленился расписать полностью stm8s.h и тут уже ничего не поделать.
2. Работать как-то нужно, и работать не просто, а чтобы было самому всё понятно и удобно.
3. МК простой до не могу. Группового секса над ним не предвидится, не тот уровень. Поэтому и не стоит особо заморачиваться.
4. Лучше писать в стиле I2C-›CR2 |= ACK;, меньше геммора при перескакивании СТМ8‹-›СТМ32.
|
|
|
|
25.12.2016, 19:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Ivan
|
дошло время до I2C (ох и подзамучился я уже с ним ). При использовании stm8s.h бит ACK и регистр DR "не пишутся"
|
Я тоже когда-то помучился. И по форумам прошелся, в поисках решения. Но там тоже все хором взывали о помощи, а подсказок не было.
А потом попался мне файлик pdf, Errata. И, судя по написанному там, на I2C в этих процессорах можно было не рассчитывать. С таким количеством ошибок ему не взлететь.
Поэтому я не стал дальше париться, а сделал программный I2C.
|
|
|
|
25.12.2016, 20:57
|
|
Прохожий
Регистрация: 25.12.2016
Сообщений: 2
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от scorpi_0n
|
4. Лучше писать в стиле I2C-›CR2 |= ACK;, меньше геммора при перескакивании СТМ8‹-›СТМ32.
|
Спасибо за совет. Действительно вовремя. Я пока не "трогал" STM32, но чувствую, что вот-вот до них доберусь. Просто сначала решил "потренироваться на кошках" (c) (STM .
Сообщение от Alex9797
|
Я тоже когда-то помучился. И по форумам прошелся, в поисках решения. Но там тоже все хором взывали о помощи, а подсказок не было.
|
"Как я Вас понимаю" (с)
Пролистал не один километр лент форумов. И везде (почти везде) все что касалось I2C, в конце делался один вывод - забить на аппаратный, писать программный.
Я так-то уже, можно сказать, последовал этим советам, учел опыт других людей и пишу программный. Но как-то не дает он мне покоя (аппаратный), потому что он есть. А это (мои вопросы здесь), уже предсмертные конвульсии попыток заставить работать аппаратный I2C.
|
|
|
|
25.12.2016, 23:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,630
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Alex9797
|
Поэтому я не стал дальше париться, а сделал программный I2C.
|
А вот и зря. Нормально там I2C работает. Нафиг ногодрыг?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
Эти 2 пользователя(ей) сказали Спасибо eddy за это сообщение:
|
|
|
15.02.2017, 21:38
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: FAQ по STM8
Подскажите по таймерам. Мне надо генерить прерывание по переполнению таймера и ещё в середине периода. Прерывание в середине периода можно с помощью capture interrupt сделать, или оно только в режиме захвата работает?
|
|
|
|
15.02.2017, 21:46
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
Можно. В референсе же всё есть.
==========
capture и есть захват. Вам нужен компарэ.
|
|
|
Сказали "Спасибо" STM32F0
|
|
|
18.02.2017, 14:06
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: FAQ по STM8
Ещё вопрос вылез. Устройство я запустил. Но: очень странно ведут себя внешние прерывания. Мне надо ловить отрицательный фронт, для измерения RPM вентилятора. При этом вентиляторов несколько, все висят на одном порте (и перывании). Описываю поведение в зависимости от EXTI-›CR1:
0b00: счёт не полный, имею около 1450RPM
0b01: получаю 0 или 30 RPM, только эти 2 варианта
0b10: имею строго 0RPM, хотя вот этот вариант должен работать
0b11: работает правильно, имею около 4500RPM.
Проц STM8S, в обработчике прерывания я считываю состояние пинов, сравниваю с предыдущим и софтово выделяю отрицательный фронт. Поэтому никаких ложных счётов быть не может.
Я понять не могу, почему не работает 0b10, и почему начинает работать 0b11. Зачем нужно выбирать оба фронта, если мне надо только отрицательные?
|
|
|
|
18.02.2017, 14:41
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
А вы уверены, что через внешние прерывания это хорошая мысль? Тут самые подходящие варианты - либо по ардуиновски, через таймер и порт (100-500мкС по таймеру вполне хватит), либо тупо через каналы таймеров, если каналов хватит.
А так - похоже что у вас сигнал не меандр, какие-то события тупо пролетают.
|
|
|
|
18.02.2017, 15:09
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: FAQ по STM8
У меня используется 20-ногий корпус, все порты с таймером заняты. Я использовал PB4 и PB5, которые по-нормальному на выход работать не могут, и их ни под чего другое использовать не получается. Сигнал - не меандр. Положительный фронт пологий, отрицательный - нормальный. Это не обясняет, почему при прерывании по обеим фронтам всё начинает работать корректно, в то время как по отрицательному фронту - нет.
|
|
|
|
18.02.2017, 15:13
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: FAQ по STM8
Возможно, я где-то туплю. Вот код самой функции. Он вызывается из прерывания EXTI.
Код:
|
void rpm_poll(void)
{
unsigned short time;
unsigned char new_pin_state, pin_changed;
time = TIM1-›CNTRH‹‹8 | TIM1-›CNTRL; //get timestamp
new_pin_state = (GPIOA-›IDR & 0b1000) | (GPIOB-›IDR & 0b110000);
pin_changed = ~new_pin_state & rpm_pin_state; //find 1-to-0 transitions
rpm_pin_state = new_pin_state; //save current value
if (pin_changed & 0b1000)
{
water_pulse_count++;
water_pulse_timestamp = time;
}
if (pin_changed & 0b10000)
{
fan2_pulse_count++;
fan2_pulse_timestamp = time;
}
if (pin_changed & 0b100000)
{
fan1_pulse_count++;
fan1_pulse_timestamp = time;
}
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:57.
|
|