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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18811
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мурик, ваше желание накормить тортом в ответ на просьбу кусочка сахара, наредкость утомительно. я нашел только один вариант STM32 в SOIC-8 - это STM32G031J6M6, при этом его цена раза в 3 превышает стоимость STM8 в таком же корпусе. и это при том, что функционально возможностей attiny13 мне более чем достаточно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Дело ваше. Я уже написал что с бесплатных IDE для STM8 насколько мне известно нет. Если хотите можете самостоятельно прикрутить SDCC к какой-то IDE или писать в блокноте и компилировать с помощью makefile.
А что касается ресурсов МК. Берите STM32F030F4P6. Стоит дешево. Начинки не много. Широкий выбор IDE. Если память или периферия останется, то какая разница? Она что мешает?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="ARV",url="/forum/viewtopic.php?p=3862180#p3862180"]
oleg110592 писал(а):a 30-day time-limited
а что потом?[/uquote]
1 вариант переустановить и опять 30
2 вариант пользоваться size-limited Kickstart license without any time limit
8 кБ ограничения хватит для флагманов 20 ног STM8S003F3 и 8 ног STM8S001 (у меня прошивок для STM8 > 4 кБ не было). Для всего что требует выше, разумнее применять таки STM32(имхо). Да и STM32 и STM8 по внутренностям похожи.
з.ы. для IAR STM8 есть "чистая" китайская лицензия - ничего ломать не надо, можно втихаря дома, под одеялом..., зато официальный плугин эклипсы есть
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18811
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Изображение
вот эта хрень содержит отладчик stm8 или только программатор? вообще, как оно совместимо со всеми IDE?
Вложения
screenshot-aliexpress.ru-2020.07.02-15_57_16.png
(129.7 КБ) 1621 скачивание
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

и отладчик и программатор. Совместимо драйверами, которые есть в каждой иде, по сути они одни и те же. Драйвер можно отдельно поставить от производителя, но иар при установке заменит, практически тем же.
Для sdcc есть binutils - там gdb для отладки и есть отдельная утилита для прошивки stm8flash - все это работает тоже на этой "хрени".
https://stm8-binutils-gdb.sourceforge.io/
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18811
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

спасибо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

oleg110592 писал(а):и отладчик и программатор.
Я бы сказал - отладчик одна из функций которого заливка прошивки (иначе что отлаживать если в МК нет прошивки?).
Друг Кота
Аватара пользователя
Сообщения: 7116
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

[uquote="ARV",url="/forum/viewtopic.php?p=3862268#p3862268"]как оно совместимо со всеми IDE?[/uquote]
Главное, что эта хрень работает с IAR. Только, когда купите ее, сразу стяните с нее алюминиевый корпус и изолируйте плату от этого корпуса чем-нибудь, лакотканью например. Там часто бывает так, что пайки резонатора и еще какие-то соприкасаются с корпусом. И как-только анодирование на алюминии процарапается, будет КЗ. И, обозначения выводов на корпусе не всегда совпадают с их функциями. Нужно смотреть как обозначены выводы на плате отладчика.
Астролябия-сама меряет, было бы что мерять!!!
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

[uquote="oleg110592",url="/forum/viewtopic.php?p=2376052#p2376052"]
axillent писал(а):где можно посмотреть размер кода и в идеале еще и расход ram и eeprom в iar?
Изображение[/uquote]а как сделать то же самое в IAR 8?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3795
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

[uquote="ARV",url="/forum/viewtopic.php?p=3862268#p3862268"]Изображение[/uquote]
А пробовал-ли кто в эту хрень вместо ST-Link загрузить J-Link?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="RusikOk",url="/forum/viewtopic.php?p=3886278#p3886278"]а как сделать то же самое в IAR 8?[/uquote]ПКМ на окне вывода сообщений.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3886352#p3886352"][uquote="RusikOk",url="/forum/viewtopic.php?p=3886278#p3886278"]а как сделать то же самое в IAR 8?[/uquote]ПКМ на окне вывода сообщений.[/uquote]спасибо! уже подсказали
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

Джентльмены! Бьюсь вторую неделю, ужо голову всю себе больную сделал, а только никак не могу разобраться в чём проблема. Есть устройство на STM8S003, которое питается от батарейки и управляет термостатом. Требуется мерить напряжение двумя каналами -- напряжение собственно батарейки и напряжение на термодатчике (NTC 10k). В своё время был заложен курс на минимум деталей и минимум места на плате (каюсь, переборщил) поэтому вместо Vref для измерения напряжения батарейки используется внутренний стабилизатор на 1.8В. Т.е. фактически я через ADC измеряю строго 1.8В и отталкиваюсь от этого нахожу Vdd самого микроконтроллера. От батарейки он запитан совершенно напрямую.
С термодатчиком всё не так просто -- одно из событий которые требуются для работы интерфейса -- прерывание по кнопке которая замыкает термодатчик. Т.е. бОльшую часть времени ноги находится как цифровой вход в ожадинии прерывания, и только раз в секунду, по таймеру, становится аналоговым входом и мерится значение температуры. Потом обратно цифровой вход. Вооооооооот. А магия вся в том, что всё работает -- по отдельности. Когда ADC настроен на однократное одноканальное измерение -- всё норм. Но стоит включить SCAN mode и всё ломается. Куски кода и сам код прилагаю. Может есть у кого хоть какие идеи?

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

void ADC_init()
{
  ADC_CR1_bit.ADON  = 0;
  ADC_CR1_bit.CONT  = 0;
  ADC_CR2_bit.SCAN = 1;
  ADC_CR2_bit.ALIGN = 1;
  ADC_CSR_EOCIE = 1;
  ADC_CSR_bit.CH = 3;
}


#pragma vector = TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF_handler(void)
{
  PD_CR2_bit.C23  = 0;

  ADC_CR1_bit.ADON  = 1;
  ADC_CR1_bit.ADON  = 1;

  TIM2_SR1_bit.UIF = 0;
}


#pragma vector = ADC1_EOC_vector
__interrupt void ADC1_EOC_handler(void)
{
  unsigned int res_t = 0;
  unsigned int res_v = 0;
  res_v = ADC_DB4RH << 8;
  res_v |= ADC_DB4RL;
  res_t = ADC_DB3RH << 8;
  res_t |= ADC_DB3RL;
  ADC_CR1_bit.ADON  = 0;
  PD_CR2_bit.C23  = 1;

    if (res_t > 903 && (mode == 2 || mode == 3)) PD_ODR_bit.ODR1 = 1; //Heater on
    else                                       PD_ODR_bit.ODR1 = 0; //Heater off

         if (res_v > 640) bat_level = 0;
    else if (res_v > 512) bat_level = 1;
    else if (res_v > 485) bat_level = 2;
    else if (res_v > 470) bat_level = 3;

  ADC_CSR_bit.EOC = 0;
}

Вложения
main.c
(6.78 КБ) 221 скачивание
Последний раз редактировалось просто КОТ Ср ноя 04, 2020 20:54:22, всего редактировалось 1 раз.
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

res_v = ADC_DB4RH<< 8;
res_v |= ADC_DB3RL;

res_t = ADC_DB3RH << 8;
res_t |= ADC_DB4RL;
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

Упс. Это результат правки кода после цельного дня игр с переписыванием этой части.

Но и написанная верно она не работает как требуется. Т.е. в принципе не происходит ежесекундного обновления результатов АЦП. Как только происходит один круг преобразования, всё падает. Данные в регистрах не обновляются, хотя таймеры продолжают работать. И другие прерывания продолжают работать. Всё в общем работает, но результаты АЦП не меняются, какими были в момент первого пуска, такими и остаются до снятия питания.

Хотя EOC я снимаю, ADON после измерения увожу в 0, а при старте измерения дважды шлю туда единицу. Если убрать SCAN и читать из DRL то всё работает... а вот через DBxR не хочет. Пробовал играться с битом DBUF -- который разрешает буфферизацию. Вроде бы в режиме SCAN он сам выставляется... но в любом случае его запись ничего не изменила.
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

1. на время обработки каких-то прерываний запрещать другие прерывания
2. минимизировать код внутри прерываний, перенеся его в main

а вообще непонятно, зачем сканирование, если запуск по таймеру...
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

1. Если я в обрабочике таймера запрещу прерывания... то как я уйду в прерывание АЦП?
2. Код и так минимальный, вроде бы. Запуск измерения, или его обработка в пару ифов. Единственно что регулярно вертится в прерываниях -- динамическая индикация на TIM4... но её по другому особенно и не написать.
3. Ну вроде как чтобы максимально быстро отсканировать и уйти обратно в сон (сон ещё не прописан, но полагается).
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

а если другое прерывание выдернет из этого прерывания, а потом из этого прерывание выдернет третье, а потом опять первое, что вообще тогда будет с мозгами?
Нужно запрещать и разрешать. Динамическую индикацию делать в майне, что он там пустой крутится-то...
https://prog-cpp.ru/micro-interrupts/

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

switch(led_num){
      case 0:
        PC_ODR_bit.ODR4 = 1;
        PC_ODR_bit.ODR5 = 0;
        PC_ODR_bit.ODR6 = 0;
        PC_ODR_bit.ODR7 = 0;
        led_num = (bat_level > 1) ? 1 : 0;
        break;
      case 1:
        PC_ODR_bit.ODR4 = 0;
        PC_ODR_bit.ODR5 = 1;
        PC_ODR_bit.ODR6 = 0;
        PC_ODR_bit.ODR7 = 0;
        led_num = (bat_level > 2) ? 2 : 0;
        break;
      case 2:
        PC_ODR_bit.ODR4 = 0;
        PC_ODR_bit.ODR5 = 0;
        PC_ODR_bit.ODR6 = 1;
        PC_ODR_bit.ODR7 = 0;
        led_num = (bat_level > 3) ? 3 : 0;
        break;
      case 3:
        PC_ODR_bit.ODR4 = 0;
        PC_ODR_bit.ODR5 = 0;
        PC_ODR_bit.ODR6 = 0;
        PC_ODR_bit.ODR7 = 1;
        led_num = 0;
        break;
  }
это совершенно не нужно. нужно что-то типа так:

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

PC_ODR &=  ((0x10 << led_num++) |  0x0F); // Это неправильно, верный вариант VladislavS написал в следующем сообщении
if (led_num > 3) led_num = 0;
Последний раз редактировалось BlackKilkennyCat Чт ноя 05, 2020 08:16:44, всего редактировалось 4 раза.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3919129#p3919129"]это совершенно не нужно. нужно что-то типа так:

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

PC_ODR &=  ((0x10 << led_num++) |  0x0F);
[/uquote]Это неправильно. Правильно

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

PC_ODR=(PC_ODR&0x0F)|(0x10<<led_num++);
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

Продолжаем эксперименты. пытался отказаться от SCAN. Ну вот не работает и всё... если убрать этот прикол с if(seconds%2) то какой-то один канал замечательно работает, всё чётко. :dont_know: TIM4 убрал, индикацию в главный цикл перенёс.

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

#pragma vector = TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF_handler(void)
{
  if (seconds%2)  ADC_CSR_bit.CH = 3;
  else   ADC_CSR_bit.CH = 4;
  
  PD_CR2_bit.C23  = 0;
  
  ADC_CR1_bit.ADON  = 1;
  ADC_CR1_bit.ADON  = 1;

  TIM2_SR1_bit.UIF = 0;
}

#pragma vector = ADC1_EOC_vector
__interrupt void ADC1_EOC_handler(void)
{ 
  if(seconds%2){
  res_v = ADC_DRH << 8;
  res_v |= ADC_DRL;}
  else{
  res_t = ADC_DRH << 8;
  res_t |= ADC_DRL;
  }
  ADC_CR1_bit.ADON  = 0;
  PD_CR2_bit.C23  = 1;
    if (res_t > 903 && (mode == 2 || mode == 3)) PD_ODR_bit.ODR1 = 1; //Heater on
    else                                       PD_ODR_bit.ODR1 = 0; //Heater off
                          bat_level = 0;
         if (res_v > 513) bat_level = 1;
    else if (res_v > 490) bat_level = 2;
    else if (res_v > 478) bat_level = 3;
    else if (res_v > 466) bat_level = 4;
    seconds++;
  ADC_CSR_bit.EOC = 0;
}
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Ответить

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