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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение 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
Откуда: Крымский Федеральный Округ
Контактная информация:

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

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

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

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

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

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

Сообщение BlackKilkennyCat »

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

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

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

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

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

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

Сообщение 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 раза.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

это совершенно не нужно. нужно что-то типа так:

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

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

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

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

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

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

Продолжаем эксперименты. пытался отказаться от 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
Изображение
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

а если другое прерывание выдернет из этого прерывания, а потом из этого прерывание выдернет третье, а потом опять первое
Такое невозможно в принципе. Почему - читайте описание работы контроллера прерываний.
Кратко: Если 1-е было прервано 2-м, значит у 2-го приоритет выше. А у 3-го значит - ещё выше. Менее приоритетное прерывание (или с таким же приоритетом) не может прерывать более приоритетное. Если конечно специально не стараться, перенастраивая регистры приоритетов прерываний внутри ISR.
Так что - "запрещать и разрешать" прерывания в ISR необходимо только если на каком-то участке ISR нужно запретить более приоритетные прерывания.
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

сорри
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

Не могу принять строку по уарт.

UART1_DeInit();
// Конфигурация UART на отправку 8 бит данных без контроля PARITY, модуль будет работать на прием и отправку.
UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE); // Включаем прерывание от приема данных.
enableInterrupts(); // Включаем все прерывания.
UART1_Cmd( ENABLE); // Включаем UART.

uint8_t priem[5]; // Массив куда будем принимать данные.
uint8_t count=0; // Счетчик принимаемых данных.

//Обработчик для приема данных.
INTERRUPT_HANDLER( UART1_RX_IRQHandler, 18){
if(UART1_GetFlagStatus( UART1_FLAG_RXNE)){// если прерывание по флагу готовности данных в приёмном буфере
// и флаг готовности данных сброшен - ПРИНИМАЕМ ДАННЫЕ В БУФЕР
priem[count]= UART1_ReceiveData8(); // Копируем данные в массив.
count++; // Прибавляем счетчик принятых данных.
if( count==5){count=0; // Если счетчик равен 5, то приняли все данные, сбрасываем его.
}
}
}

Строка с другого мк приходит-проверяю терминалом, но массив заполняется, только если 5 раз отправлю строку. Что тут не так?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Для начала объявите priem и count как volatile. А дальше видно будет.

Скорость порта правильно выставлена?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

volatile не помогло, скорость 9600 у обоих, отправляю с ESP8266 на stm8, в ардуинской проге для ESP скорость 9600 прописан и для stm8 тоже, если по первому символу в массиве делать действие-то работает же, значит принимает нормально, а чтобы по всем символам -то надо 5 раз отправлять.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

Всё, отбой, дело было не в бобине...принимает строку он норм, сортировка принятого...есп вначале свою инфу кидает по уарт, после этого обнулять на начало нужно массив.
sergey.UA
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

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

Сообщение sergey.UA »

Доброго времени суток, коллеги. Взялся осваивать микроконтроллеры серии STM8. Установил среду IAR, пытаюсь зашить простейшей прогой, с помощью программатора STLink контроллер STM8S105C на самодельной макетке, не выходит. Есть здесь спецы по среде IAR?
Спасибо.
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

на ноге VCAP установлен конденсатор с правильным номиналом?
вы выбрали st-Link в качестве отладчика в свойствах проэкта ИАР?
sergey.UA
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

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

Сообщение sergey.UA »

С выв. 6 VCAP, конденсатор 1 мкф идет на землю.
Все так, выбираю - Options => Debugger => Driver => ST-LINC.
В качестве руководства использую одну статейку в нете, сейчас еще раз попробую все проделать, если не выйдет, опишу все по шагово, может сможете поправить меня, где я туплю.))
Спасибо.

Добавлено after 37 minutes 11 seconds:
Попутно вопрос:
В приведенном примере программы используется камень STM8S103F3P6, и в дефайне
пишется #include "iostm8s103f3.h"
На моей макетке стоит камень STM8S105C6T6, мне данную строку изменить так
#include "iostm8s105c6.h" ?
И еще, в одном источнике синтаксис с кавычками #include "_________", а в другом месте так
#include <_________> , как правильно ?

Добавлено after 1 hour 16 minutes 4 seconds:
В общем, результат такой.
----------
Вначале, на диске C => Program Fails (x86) => IAR Systems => Embedded Workbench 8.3 =>
=> stm8 создаю пустую папку projekts.
Далее, запускаю IAR как и рекомендуют, от имени администратора, и далее все так, как здесь
https://www.drive2.ru/b/1318037/
Набираю в редакторе прогу, вот от сюда
http://www.count-zero.ru/2016/iar_stm8/
только дефайн чуть подправил, так как камень чуток другой.
Сохраняю все написанное File => Save.
Подключаю к компу через STLink, макетную плату.
В конце жму Download and Debug, просит указать имя, указываю такое же.
Зачем ??!! я ведь только что сохранил, да ладно.
Что то там думает, и выдает ошибку, скрин прилагаю.
Изображение
Error while running C/C++ Compiler, это переводится как - ошибка при запуске компилятора.
Захожу в настройки компилятора, просто что бы проверить, там выбран С, вот скрин
Изображение
Что я делаю не так ?
Спасибо.
---------
Попробовал с подключенным программатором нажать просто компилировать, ( Compile ),
то в добавок к прежней, выдает еще и ошибку
searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\inc\c\"
типа, что то там искало и не нашло ?
--------
Упс...., сейчас нашел ошибку, исправил "iostm8s105c5.h" на "iostm8s105c6.h", моя невнимательность,
сообщение об ошибках изменились, теперь так
Изображение
и STLINK пару раз моргнул зеленым светодиодом вместо красного.
Что в переводе гласит -
Не удалось запустить сеанс отладки.
Либо инициализация отладчика завершилась неудачно, либо файл «C \ ... \ blink_1.out» отсутствует, поврежден или имеет неподдерживаемый формат.
В окне журнала отладки может быть дополнительная информация.
---
Кто что думает по данному сообщению ?
Последний раз редактировалось sergey.UA Ср дек 23, 2020 12:50:48, всего редактировалось 1 раз.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение BlackKilkennyCat »

sergey.UA писал(а):Что я делаю не так ?

Практически всё. Начиная с того, что изучаете программирование мк на непрофильном drive2

http://vital.lib.tsu.ru/vital/access/ma ... :000522729 там справа вверху "загрузить" синенькая
https://www.compel.ru/wordpress/wp-cont ... -STM8S.pdf
https://knigifb2.org/tekhnicheskaya-lit ... -djvu.html
https://portal.tpu.ru/SHARED/t/TORGAEV/ ... sobie2.pdf
sergey.UA
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

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

Сообщение sergey.UA »

BlackKilkennyCat кое что исправил в заголовочном файле, ушло в предыдущее сообщение, взгляните.
Почему на непрофильном, да потому что только там смог найти более менее
подробное описание что к чему. А эту тему на радио коте только вчера нашел, уже несколько дней не получается, вот и решил здесь поспрашивать.
Еще в одном лишь месте увидел тонкости, это вот здесь
http://easyelectronics.ru/arm-uchebnyj- ... oekta.html
По поводу компиляции в hex, может из-за этого и не получается, буду пробовать.
----------
За книги и статьи спасибо. Первую ранее скачал, вторая не рассматривает среду IAR, третью читаю уже, где то 20% прочел, четвертую то же ранее скачал, лежит, буду так же осваивать.
---------
В Options => Output Converter, поставил галочку на Generate additional output, и выбрал Binary.
Основное сообщение об ошибке такое же, а вот что в логе
Изображение
По ходу не видит мой камень через SWIM интерфейс ?
Чуть позже еще раз все прозвоню и проверю на макетке.
А вы что скажете по этому логу, что может быть?
Спасибо.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Задай конфигурацию проекта:
Изображение
sergey.UA
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

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

Сообщение sergey.UA »

GARMIN вы имеете ввиду, выбор чипа ?
Изображение
Так я его изначально выбрал.
----------
Пробую подключить программатор STLINK-V2 с помощью утилиты напрямую к макетке. Что то какие то
проблемы, не видит камень хоть ты тресни. Я просто перед этим тусовал папку с этой прогой по диску С, возможно из -за этого глюк начался. А ранее, год назад примерно прошивал программатором пару STM32, все было гуд. Что сейчас делать, ума не приложу.(((

Добавлено after 5 hours 4 minutes 29 seconds:
В общем так, переустановил заново дрова и утилиту на STLink программатор.
Еще раз просмотрел и прозвонил макетную плату, там вроде все норм.
Подключал микроконтроллер к программатору вот по этой схеме.
Изображение
Вот сам разъем программатора.
Изображение
Нумерация пинов на программаторе и на макетке. совпадает.
Изображение Изображение
Вот в реале.
Изображение
----------
Так вот, при попытке подключится (прочитать хоть что либо из камня) прогой ST-LINK Utility, выдает
вот такие ошибки.
Изображение
Перевел ошибку -
Не могу подключиться к цели!
Пожалуйста, выберите режим «Connect Under Reset» в Target -> Setting menu и попробуйте еще раз.
Если вы пытаетесь подключиться к низкочастотному приложению, выберите более низкий режим SWD Frecuency в меню Target -> Settings.
Пробовал как написано, в меню ставить галочку на против Connect Under Reset, пофиг,
такие же ошибки.
---------
Кто может помочь, подключайтесь.
Ответить

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