Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Прорезались зубы
Сообщения: 210
Зарегистрирован: Чт мар 07, 2013 23:56:36

Сообщение Proton78 »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=4307262#p4307262"]
Proton78 писал(а):STM8S103 заставить работать АЦП2
Ну надо как-то в него добавить второй АЦП, так как их там один. :)[/uquote]
Вот же шшшшш..... Два дня убил на эту хрень. Перерыл кучу инфы. В учебниказ по STM8 написано что два АЦП. А в даташит именно на этот контроллер посмотреть не додумался. Благодарю за прозрение.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

там может быть ADC1 или ADC2. просто неверно поняли.
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

Добрый день! Пытаюсь обуздать STM8. Задача - сымитировать работу сдвигового регистра. На всякий случай поясню суть: после сигнала latch идет серия тактовых сигналов, по которым отдаем в DATA биты по очереди. Проблема в том, что что latch читается легко, а вот с чтением CLK возникли проблемы. Не пойму, что не так, но либо читается один импульс, либо не читается вообще. СТМка работает на частоте 16мгц.

График сигналов в аттаче.
photo_2022-10-25_17-05-05.jpg
(33.49 КБ) 93 скачивания
Код функции

Код: Выделить всё

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 раз.
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

1. Это в какой среде написано?
2. А для чего - просто для развлекательно-познавательных целей? Вообще-то SPI можно соответственно задаче сконфигурировать. Ну или хотя бы CLK сконфигурировать с прерыванием от изменения уровня - тогда будет точно по переходу 1->0 или 0->1 срабатывать... Здесь же фактически ждётся не изменение CLK, а только пока он равен нулю.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Ромыч, код - адова жесть! Можно ведь использовать таймер или на худой конец прерывания.
Не приведено, что внутри функций GPIO_ReadInputPin, dataL, dataH и data1H - об этом нужно догататься самостоятельно? Первая функция сильно похожа на SPL, неужто на несчастную STM8 еще и это дерьмище вкорячили? Жуть!

В общем, прочитав этот код я совершенно не могу даже логику работы понять!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

Написано в IAR + SPL. Цели - познавательно-развлекательные. SPI, к сожалению, уже занят... CLK вешал на прерывание, но оно тригеррится слишком поздно, когда вся пачка сигналов уже прошла. Как я понял, перед прерыванием выполняются текущие инструкции и (скорее всего) МК работает со стеком для подготовки прерывания. Соответственно, код из обработчика выполняется слишком поздно...
Здесь же фактически ждётся не изменение CLK, а только пока он равен нулю.
не совсем. первый бит выставляется сразу после Latch, далее он должен поменяться после CLK, потому, чисто в целях отладки, без разницы нуля ждать или единицы, максимум, возможен пропуск одного цикла Clk. Проблема в том, что while не работает... не могу понять почему.
Первая функция сильно похожа на SPL, неужто на несчастную STM8 еще и это дерьмище вкорячили? Жуть!

SPL и есть.. а где лучше писать? в STM я совсем новичок, и в местных сортах пенного не разбираюсь. пробовал родную IDE, но что то с космиком не сдружился.. может посоветуете что лучше? ясное дело, что ASM рулит, но пока не готов в него лезть. через ардуиновскую библу тоже нет желания работать.

Код установки уровня, ничего хитрого

Код: Выделить всё

void dataL(void){
   GPIO_WriteLow(DATA_PORT, DATA_PIN);
}

void dataH(void){
   GPIO_WriteHigh(DATA_PORT, DATA_PIN);
}
Последний раз редактировалось Ромыч Вт окт 25, 2022 16:25:52, всего редактировалось 1 раз.
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Реклама
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

По картинкам вроде бы отрицательная полярность импульсов используется. Может быть, попробовать
while( GPIO_ReadInputPin(CLK_PORT, CLK_PIN)==1){};
Последний раз редактировалось Vladislav14 Вт окт 25, 2022 16:28:06, всего редактировалось 2 раза.
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

не работает. данные все равно отдаются одной пачкой, как будто бы while там и нет вовсе
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

И ещё вопрос - какой конкретно контроллер? Если 103f3p6, то у него по умолчанию тактовая /8, т.е. 2 MHz. Чтобы было 16:
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

[uquote="Vladislav14",url="/forum/viewtopic.php?p=4309822#p4309822"]И ещё вопрос - какой конкретно контроллер? Если 103f3p6, то у него по умолчанию тактовая /8, т.е. 2 MHz. Чтобы было 16:
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);[/uquote]
да, именно его, на отладочной чинской платке. CLK_PRESCALER_HSIDIV1 стоит, потому и уточнил, что камень работает на 16мгц :)
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

ну... я бы в таком случае посмотрел в отладчике, во что оно скомпилировалось. Но у меня STVD с космиком;-)
Или попробовать другие операторы: if, else ...
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

наверно еще раз влезу в "STVD с космиком" и попробую перенести туда этот участок кода, благо, он мелкий... а в STVD с SPL работаете или напрямую регистрами/портами рулите?
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

И то, и другое. SPL помогает быстрее разобраться с использованием внутренностей контроллера, а затем, особенно если критично быстродействие, можно и оптимизировать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Писать без SPL, естественно - напрямую регистрами (удобно макросы всякие поопределять, можно как пример у меня в гитхабе глянуть).
А для реакции на возрастающий или спадающий фронт, если ничего, кроме прерываний, не осталось, лучше прерывание настроить и конечный автомат забульбенить. Ну, если же совсем по-абдурински хочется, то как-то так:

Код: Выделить всё

static uint8_t waitNxtRise(){
  uint32t_i;
  for(i = 0; i < 100000 && (PORT(LATCH_PORT, IDR) & LATCH_PIN); ++i);
  if(i == 100000) return 0;
  for(i = 0; i < 100000 && ~(PORT(LATCH_PORT, IDR) & LATCH_PIN); ++i);
  if(i == 100000) return 0;
  return 1;
}
И аналогично сделать функцию на спадающий фронт. Соответственно, вызывать нужную функцию и проверять, что вернула: если 1 - все ОК, если 0 - был таймаут. Таймаут, в принципе, лучше бы таймером реализовать…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

Eddy_Em, а какую максимальную частоту, даже скорее, минимальную ширину импульса можно подобным образом отлавливать? (При частоте stm 16mhz)
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Ромыч, есть же даташит на камень, лень мне искать, честно говоря. Вряд ли выше 8МГц, но скорей всего, не выше 2МГц. Плюс трата ресурсов на всякие дела - итого, полезная скорость будет совсем небольшой. Чтобы была нормальная, нужно использовать аппаратные возможности - тот же SPI, например, или USART.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

В любом случае чтение или запись 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
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

Спасибо за советы, до дома доберусь, попробую! Ещё глупенький вопрос... Вот uart, spi,ic2 вроде все понятно, если использовать их по назначению. Не понятно как их использовать не по назначению, например как в моем случае. То есть не совсем понимаю отличие железной реализации протокола от софтовой
Что в цивилизованном мире называют "устаревшие технологии", в России зовется "технологии, проверенные временем"
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

Для ненормативного использования нужно использовать 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_Init(SPI_FIRSTBIT_LSB, SPI_BAUDRATEPRESCALER_32, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_HIGH, SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_HARD, (uint8_t)0x07); // SPI_DATADIRECTION_2LINES_FULLDUPLEX SPI_BAUDRATEPRESCALER_32

SPI_BiDirectionalLineConfig(SPI_DIRECTION_TX);
SPI_CalculateCRCCmd(DISABLE);
SPI_Cmd(ENABLE);

В данном случае видно, что передача, начиная с младшего бита (SPI_FIRSTBIT_LSB), частоту делим на 32 (SPI_BAUDRATEPRESCALER_32), т.к. TM 1638 не быстрый (в устройстве тактовая 16 MHz), передача по одной линии MOSI (SPI_DATADIRECTION_1LINE_TX).
Используя spl для инициализации регистров периферии, очень желательно заглядывать в datasheet, чтобы понимать, как оно работает, а иногда и самому более удобную функцию написать;-)

В документации есть временнЫе диаграммы и примеры использования.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Ромыч, вот здесь у меня куча всякой всячины под STM8. И без позорных SPL.
Я подозреваю, что если бы STM8 была еще более популярной, под нее и свой калокуб бы замутили! Чтобы "снизить порог вхождения" и экспоненциально увеличить количество быдлокода и жертв на производстве.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»