Proton78 писал(а):STM8S103 заставить работать АЦП2
Ну надо как-то в него добавить второй АЦП, так как их там один. [/uquote]
Вот же шшшшш..... Два дня убил на эту хрень. Перерыл кучу инфы. В учебниказ по STM8 написано что два АЦП. А в даташит именно на этот контроллер посмотреть не додумался. Благодарю за прозрение.
Добрый день! Пытаюсь обуздать STM8. Задача - сымитировать работу сдвигового регистра. На всякий случай поясню суть: после сигнала latch идет серия тактовых сигналов, по которым отдаем в DATA биты по очереди. Проблема в том, что что latch читается легко, а вот с чтением CLK возникли проблемы. Не пойму, что не так, но либо читается один импульс, либо не читается вообще. СТМка работает на частоте 16мгц.
void proc(void){
while(GPIO_ReadInputPin(LATCH_PORT,LATCH_PIN)==0){}; // Ждем изменения latch
for (u8 i = 0; i < 8; i++) {
if (data & (1 << i))
dataL(); // сброс бита
else
dataH(); // установка бита
while( GPIO_ReadInputPin(CLK_PORT, CLK_PIN)==0){}; // Ждем изменения clk
}
dataH();
}
В строке while( GPIO_ReadInputPin(CLK_PORT, CLK_PIN)==0) ожидание что 0, что 1 дает один и тот же результат - биты отдаются сразу пачкой, такое ощущение, что чтение порта не работает, хотя сконфигурирован как вход GPIO_Init(CLK_PORT, (GPIO_Pin_TypeDef)(CLK_PIN), GPIO_MODE_IN_FL_NO_IT);
Подобный код на ардуине работал превосходно, даже с учетом тормозов фреймворка Arduino, а тут, на голой СТМке как будто камня не хватает для выборки сигнала..
Последний раз редактировалось Ромыч Вт окт 25, 2022 16:14:42, всего редактировалось 1 раз.
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
1. Это в какой среде написано?
2. А для чего - просто для развлекательно-познавательных целей? Вообще-то SPI можно соответственно задаче сконфигурировать. Ну или хотя бы CLK сконфигурировать с прерыванием от изменения уровня - тогда будет точно по переходу 1->0 или 0->1 срабатывать... Здесь же фактически ждётся не изменение CLK, а только пока он равен нулю.
Ромыч, код - адова жесть! Можно ведь использовать таймер или на худой конец прерывания.
Не приведено, что внутри функций GPIO_ReadInputPin, dataL, dataH и data1H - об этом нужно догататься самостоятельно? Первая функция сильно похожа на SPL, неужто на несчастную STM8 еще и это дерьмище вкорячили? Жуть!
В общем, прочитав этот код я совершенно не могу даже логику работы понять!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Написано в IAR + SPL. Цели - познавательно-развлекательные. SPI, к сожалению, уже занят... CLK вешал на прерывание, но оно тригеррится слишком поздно, когда вся пачка сигналов уже прошла. Как я понял, перед прерыванием выполняются текущие инструкции и (скорее всего) МК работает со стеком для подготовки прерывания. Соответственно, код из обработчика выполняется слишком поздно...
Здесь же фактически ждётся не изменение CLK, а только пока он равен нулю.
не совсем. первый бит выставляется сразу после Latch, далее он должен поменяться после CLK, потому, чисто в целях отладки, без разницы нуля ждать или единицы, максимум, возможен пропуск одного цикла Clk. Проблема в том, что while не работает... не могу понять почему.
Первая функция сильно похожа на SPL, неужто на несчастную STM8 еще и это дерьмище вкорячили? Жуть!
SPL и есть.. а где лучше писать? в STM я совсем новичок, и в местных сортах пенного не разбираюсь. пробовал родную IDE, но что то с космиком не сдружился.. может посоветуете что лучше? ясное дело, что ASM рулит, но пока не готов в него лезть. через ардуиновскую библу тоже нет желания работать.
И ещё вопрос - какой конкретно контроллер? Если 103f3p6, то у него по умолчанию тактовая /8, т.е. 2 MHz. Чтобы было 16:
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
[uquote="Vladislav14",url="/forum/viewtopic.php?p=4309822#p4309822"]И ещё вопрос - какой конкретно контроллер? Если 103f3p6, то у него по умолчанию тактовая /8, т.е. 2 MHz. Чтобы было 16:
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);[/uquote]
да, именно его, на отладочной чинской платке. CLK_PRESCALER_HSIDIV1 стоит, потому и уточнил, что камень работает на 16мгц
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
ну... я бы в таком случае посмотрел в отладчике, во что оно скомпилировалось. Но у меня STVD с космиком;-)
Или попробовать другие операторы: if, else ...
наверно еще раз влезу в "STVD с космиком" и попробую перенести туда этот участок кода, благо, он мелкий... а в STVD с SPL работаете или напрямую регистрами/портами рулите?
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
И то, и другое. SPL помогает быстрее разобраться с использованием внутренностей контроллера, а затем, особенно если критично быстродействие, можно и оптимизировать.
Писать без SPL, естественно - напрямую регистрами (удобно макросы всякие поопределять, можно как пример у меня в гитхабе глянуть).
А для реакции на возрастающий или спадающий фронт, если ничего, кроме прерываний, не осталось, лучше прерывание настроить и конечный автомат забульбенить. Ну, если же совсем по-абдурински хочется, то как-то так:
И аналогично сделать функцию на спадающий фронт. Соответственно, вызывать нужную функцию и проверять, что вернула: если 1 - все ОК, если 0 - был таймаут. Таймаут, в принципе, лучше бы таймером реализовать…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Ромыч, есть же даташит на камень, лень мне искать, честно говоря. Вряд ли выше 8МГц, но скорей всего, не выше 2МГц. Плюс трата ресурсов на всякие дела - итого, полезная скорость будет совсем небольшой. Чтобы была нормальная, нужно использовать аппаратные возможности - тот же SPI, например, или USART.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
В любом случае чтение или запись gpio следует делать через прямое обращение к портам, т.к. в spl фактически оно и делается, но при его использовании тратятся лишние такты на вызов функции. Вот оно, например:
/**
* @brief Reads the specified GPIO input data pin.
* @param GPIOx : Select the GPIO peripheral number (x = A to I).
* @param GPIO_Pin : Specifies the pin number.
* @retval BitStatus : GPIO input pin status.
*/
BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));
}
Определения можно посмотреть в gpio.h
Спасибо за советы, до дома доберусь, попробую! Ещё глупенький вопрос... Вот uart, spi,ic2 вроде все понятно, если использовать их по назначению. Не понятно как их использовать не по назначению, например как в моем случае. То есть не совсем понимаю отличие железной реализации протокола от софтовой
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Для ненормативного использования нужно использовать datasheet cd00190271-stm8s-series-and-stm8af-series-8bit-microcontrollers-stmicroelectronics. Там достаточно много настроек. Например, мне удалось успешно подключить к I2C дисплей TM1637 (там протокол похож, но не передаётся slave address, поэтому потребовался некоторый "хакинг"). А с SPI + TM1638 вообще всё просто: вот пример инициализации:
SPI_DeInit();
SPI_ITConfig(SPI_IT_TXE, DISABLE);
В данном случае видно, что передача, начиная с младшего бита (SPI_FIRSTBIT_LSB), частоту делим на 32 (SPI_BAUDRATEPRESCALER_32), т.к. TM 1638 не быстрый (в устройстве тактовая 16 MHz), передача по одной линии MOSI (SPI_DATADIRECTION_1LINE_TX).
Используя spl для инициализации регистров периферии, очень желательно заглядывать в datasheet, чтобы понимать, как оно работает, а иногда и самому более удобную функцию написать;-)
В документации есть временнЫе диаграммы и примеры использования.
Ромыч, вот здесь у меня куча всякой всячины под STM8. И без позорных SPL.
Я подозреваю, что если бы STM8 была еще более популярной, под нее и свой калокуб бы замутили! Чтобы "снизить порог вхождения" и экспоненциально увеличить количество быдлокода и жертв на производстве.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ