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

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

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

Сообщение RusikOk »

подскажите какой ток потребления у входа АЦП STM8S? нужно рассчитать впритык по току делитель
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

В ДШ разве не написано? Ну и реально попробовать. Если мне память не изменяет нужно отключить триггер Шмидта для уменьшения потребления.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
PombI4
Открыл глаза
Сообщения: 79
Зарегистрирован: Пн дек 19, 2016 10:20:28

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

Сообщение PombI4 »

Разбирался на днях с отладочной платой STM8S-Discovery, да потер всю память на чипе, не запомнив дефолтные значения option bytes.
Часть демок теперь не работает как надо. Пол дня прокопался, но так и не разобрался, что там изначально было.
Если у кого есть данная плата, напишите пожалуйста, что у вас в ней прошито в option bytes?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

PombI4, а если прошить значениями по умолчанию (factory default) из даташит?

Добавлено after 2 hours 17 minutes 36 seconds:
Как то я это пропустил.
15 апреля вышел SDCC 3.9
SDCC 3.9.0 Feature List:
Support for struct / union assignment.
Optimizations in the stm8 backend relevant to soft float increase Whetstone score by two thirds.
Improvements in rematerialization in the stm8 backend improve code generation for struct, union and arrays.
New stack allocator reduces stack space usage for the stm8, z80, z180, gbz80, r2k, r3ka, tlcs90 backends.
New ez80_z80 backend for eZ80 in Z80 mode.
Removed deprecated sdcclib utility.
New pdk14 backend for Padauk µC with 14-bit wide program memory.
New in-development pdk15 backend for Padauk µC with 15-bit wide program memory.

Особенно радует ускорение теста Whetstone в два раза и рематериализация для STM8 при операциях со структурами, объединениями и массивами. Код, который SDCC генерил до этого, особенно со структурами, меня сильно раздражал.
Присваивание структур и объединений вещь приятная, но мне не в лом было и memcpy() писать.
Что там улучшили в аллоцировании стека я пока не понял.
Развитие поддержки сверхдешевых, но однократно программируемых, Padauk радует, но это уже к STM8 отношения не имеет.
PombI4
Открыл глаза
Сообщения: 79
Зарегистрирован: Пн дек 19, 2016 10:20:28

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

Сообщение PombI4 »

Странно - перепрошился через ST VD и все заработало...

А вот через IAR... Сначала работало, а потом после стирания перестало.

При этом, после прошивки через ST VD, options bytes как были нулевыми, так и остались.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

PombI4, Они не могли быть нулевыми. Большинство option bytes у STM8 парные - прямое и инверсное значение. Например, по-умолчанию, OPT1=0х00, а следующий за ним NOPT1=0хFF
Поэтому просто нулями их так просто не перепишешь.
Подозреваю, что ST VD увидев несоответствие между прямыми и инверсными значениями сам прописал значения по-умолчанию.
PombI4
Открыл глаза
Сообщения: 79
Зарегистрирован: Пн дек 19, 2016 10:20:28

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

Сообщение PombI4 »

Ну, как реально в памяти они лежали, я не смотрел... А вот в интерфейсе прошивальщика они занулены. Там они не как OPT NOPT отображаются.
1.png
(54.46 КБ) 853 скачивания
Изображение
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Доброго времени суток. В RM016 указано, что 16 битный регистр TIM1_CNTR имеет теневой регистр для чтения и не имеет для записи. ARR имеет теневой для записи, про чтение вроде как ничего не сказано. И ничего больше я не нашел.

Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так

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

    uint16_t capch;
    capch=*((uint16_t*)&TIM2_CCR3H);
Компиллится в команду LDW. Данные ваще неадекват.

Делаю так.

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

    uint16_t capch;    
    ((uint8_t *)&capch)[0]=TIM2_CCR3H;
    ((uint8_t *)&capch)[1]=TIM2_CCR3L;
Захваченные данные верные.

На всякий случай еще вот так.

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

    uint16_t capch;     
((uint8_t *)&capch)[1]=TIM2_CCR3L;
((uint8_t *)&capch)[0]=TIM2_CCR3H;
Захваченные данные похожи на расчетные, но тоже неверные.

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

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

Сообщение VladislavS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3672468#p3672468"]Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?[/uquote]На странице 167. Там же и последовательность чтения нарисована. Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.

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

uint16_t capch=(TIM2_CCR3H<<8)|TIM2_CCR3L;
Ну или так, если не веришь компилятору

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

uint16_t capch = TIM2_CCR3H<<8;
capch |= TIM2_CCR3L;
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать :)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

VladislavS писал(а):На странице 167.
Спасибо. :oops: Вечно сам себе трудности нахожу, чтобы их мужественно преодолевать.
VladislavS писал(а): Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed.
В моем варианте переменная capch загружается в 4 команды через аккумулятор.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Ну значит IAR ещё не готов к STM8.

Вот смотри как он с AVR-ками расправляется.

Вариант 1.

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

void foo(uint16_t data)
{
  if(data) __enable_interrupt(); else __disable_interrupt();    
}

int main()
{   
  uint16_t capch = (PORTB<<8) | PORTC;
  foo(capch);  
  for(;;);    
}

//------------- Листинг ------------

//int main()
main:
//{   
//  uint16_t capch = (PORTB<<8) | PORTC;
//  foo(capch);  
        IN      R19, 0x18
        IN      R16, 0x15
        OR      R16, R19
        BREQ    ??main_0
        SEI
        RJMP    ??main_1
??main_0:
        CLI
//for(;;);    
??main_1:
        RJMP    ??main_1
//}
Вариант 2.

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

void foo(uint16_t data)
{
  if(data) __enable_interrupt(); else __disable_interrupt();    
}

int main()
{     
  uint16_t capch;
  ((uint8_t *)&capch)[0]=  PORTB;
  ((uint8_t *)&capch)[1]=  PORTC;
  foo(capch);
  
  for(;;);    
}

//------------- Листинг ------------

//int main()
main:
//{   
        SBIW    R29:R28, 2
//  uint16_t capch;
//  ((uint8_t *)&capch)[0]=  PORTB;
        IN      R16, 0x18
        ST      Y, R16
//((uint8_t *)&capch)[1]=  PORTC;
        IN      R16, 0x15
        STD     Y+1, R16
//   foo(capch);
        LD      R16, Y
        LDD     R17, Y+1
        OR      R16, R17
        BREQ    ??main_0
        SEI
        RJMP    ??main_1
??main_0:
        CLI   
//for(;;);    
??main_1:
        RJMP    ??main_1
//}

Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать
Для STM8 не так много компиляторов, тем более бесплатных.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

IAR самый бесплатный из них? :)

Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Решил проверить компильнуть код почти в один в один. А именно вот такой.

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

void  foo(uint16_t data)
{
  if(data) asm("rim"); else asm("sim");   
}

int main()
{   
  uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
  //TIM2_CCR3L++;
  foo(capch); 
  for(;;);   
}
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.

Интересный момент, вот это

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

TIM2_CCR3L++;
с компиллилось в это

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

   
  TIM2_CCR3L++;
    0085A5    C65316         LD        A, TIM2_CCR3L
    0085A8    4C             INC       A
    0085A9    C75316         LD        TIM2_CCR3L, A 
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.

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

  asm("inc TIM2_CCR3L");
    0085B0    725C5316       INC       TIM2_CCR3L
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3677556#p3677556"]IAR самый бесплатный из них? :)[/uquote]
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен. 8)

Добавлено after 3 minutes 49 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):IAR самый бесплатный из них?
Бесплатный SDCC http://sdcc.sourceforge.net/
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Интересный момент, вот это

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

TIM2_CCR3L++;
с компиллилось в это

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

   
  TIM2_CCR3L++;
    0085A5    C65316         LD        A, TIM2_CCR3L
    0085A8    4C             INC       A
    0085A9    C75316         LD        TIM2_CCR3L, A 
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.[/uquote]
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

jcxz писал(а):можно считать что он просто бесплатен.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее. Тем более система команд STM8 заточена под Си, да и ИАРовцы умеют же, видимо не приоритет просто. А то что демо версия подошла под радиолюбительские хотелки, это частный счастливый случай :).

Хрен с ним, придется сильнее напрягать межушный оптимизатор :).

Добавлено after 1 minute 23 seconds:
jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
И что? Что это меняет? Проверять пока не хочу, но стоит.

Добавлено after 21 minute 20 seconds:
jcxz писал(а):Вы используете какую-то древнюю версию IAR.
3.10.4 У меня.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]Добавлено after 1 minute 23 seconds:
jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
И что? Что это меняет? Проверять пока не хочу, но стоит.[/uquote]Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]3.10.4 У меня.[/uquote]Крайняя 3.11.1


[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]Да ладно, инлайнит только в путь даже если не просить об этом.

Вариант 1.
Спойлер

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

#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"

void foo(uint16_t data)
{
  if(data) __enable_interrupt();  else __disable_interrupt();    
}

int main()
{   
  uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
  
  foo(capch);
  
  for(;;);    
}

// --- Листинг ----

//int main()
//{   
//  uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;   
/   foo(capch);
main:
        LD        A, L:0x5315
        CLRW      X
        LD        XL, A
        CLR       A
        RLWA      X, A
        LD        A, L:0x5316
        LD        S:?b1, A
        RRWA      X, A
        OR        A, S:?b1
        RRWA      X, A
        RRWA      X, A
        JREQ      L:??main_0
        RIM
        JRA       L:??main_1
??main_0:
        SIM
//  for(;;);    
??main_1:
        JRA       L:??main_1
//}
Вариант 2.
Спойлер

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

#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"

void foo(uint16_t data)
{
  if(data) __enable_interrupt(); else __disable_interrupt();    
}

int main()
{   
  uint16_t capch;  
  ((uint8_t *)&capch)[0]=  TIM2_CCR3H;
  ((uint8_t *)&capch)[1]=  TIM2_CCR3L;
  
  foo(capch);
  
  for(;;);    
}

// --- Листинг ----

/int main()
//{   
main:
        SUB       SP, #0x2
//  uint16_t capch;  
//  ((uint8_t *)&capch)[0]=  TIM2_CCR3H;
        LD        A, L:0x5315
        LD        (0x1,SP), A
//  ((uint8_t *)&capch)[1]=  TIM2_CCR3L;
        LD        A, L:0x5316
        LD        (0x2,SP), A
//   
//  foo(capch);
        LDW       X, (0x1,SP)
        JREQ      L:??main_0
        RIM
        JRA       L:??main_1
??main_0:
        SIM   
//  for(;;);    
??main_1:
        JRA       L:??main_1
//}
Вариант 3. С глобальной переменной.
Спойлер

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

#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"

void foo(uint16_t data)
{
  if(data) __enable_interrupt(); else __disable_interrupt();    
}

uint16_t capch;

int main()
{       
  capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;  
  
  foo(capch);
  
  for(;;);    
}

// --- Листинг ----

//int main()
//{       
//  ((uint8_t *)&capch)[0]=  TIM2_CCR3H;
main:
        MOV       L:capch, L:0x5315
//  ((uint8_t *)&capch)[1]=  TIM2_CCR3L;
        MOV       L:capch + 1, L:0x5316
//   
//  foo(capch);
        LDW       X, L:capch
        JREQ      L:??main_0
        RIM
        JRA       L:??main_1
??main_0:
        SIM
//   
//for(;;);    
??main_1:
        JRA       L:??main_1
//}
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
Ответить

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