Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Чт май 02, 2019 10:04:21

подскажите какой ток потребления у входа АЦП STM8S? нужно рассчитать впритык по току делитель

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

Чт май 02, 2019 10:14:35

В ДШ разве не написано? Ну и реально попробовать. Если мне память не изменяет нужно отключить триггер Шмидта для уменьшения потребления.

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

Вс май 19, 2019 21:53:23

Разбирался на днях с отладочной платой STM8S-Discovery, да потер всю память на чипе, не запомнив дефолтные значения option bytes.
Часть демок теперь не работает как надо. Пол дня прокопался, но так и не разобрался, что там изначально было.
Если у кого есть данная плата, напишите пожалуйста, что у вас в ней прошито в option bytes?

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

Пн май 20, 2019 02:18:13

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 отношения не имеет.

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

Пн май 20, 2019 10:07:27

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

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

При этом, после прошивки через ST VD, options bytes как были нулевыми, так и остались.

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

Пн май 20, 2019 10:16:11

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

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

Пн май 20, 2019 10:37:12

Ну, как реально в памяти они лежали, я не смотрел... А вот в интерфейсе прошивальщика они занулены. Там они не как OPT NOPT отображаются.
1.png
(54.46 KiB) Скачиваний: 777

Изображение

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

Пн май 20, 2019 10:42:22

PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.

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

Сб июл 27, 2019 16:55:46

Доброго времени суток. В 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;
Захваченные данные похожи на расчетные, но тоже неверные.

Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
Или я не ту смазку для лыж выбрал?

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

Пн авг 05, 2019 15:23:49

Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
На странице 167. Там же и последовательность чтения нарисована. Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
Код:
uint16_t capch=(TIM2_CCR3H<<8)|TIM2_CCR3L;
Ну или так, если не веришь компилятору
Код:
uint16_t capch = TIM2_CCR3H<<8;
capch |= TIM2_CCR3L;
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать :)

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

Пн авг 05, 2019 15:46:53

VladislavS писал(а):На странице 167.
Спасибо. :oops: Вечно сам себе трудности нахожу, чтобы их мужественно преодолевать.

VladislavS писал(а): Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed.
В моем варианте переменная capch загружается в 4 команды через аккумулятор.

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

Пн авг 05, 2019 19:09:28

Ну значит 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
//}

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

Пн авг 05, 2019 19:45:03

VladislavS писал(а):Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать
Для STM8 не так много компиляторов, тем более бесплатных.

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

Пн авг 05, 2019 20:13:35

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

Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.

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

Вт авг 06, 2019 05:59:28

Решил проверить компильнуть код почти в один в один. А именно вот такой.
Код:
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

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

Вт авг 06, 2019 07:49:38

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

Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен. 8)

Добавлено after 3 minutes 49 seconds:
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.

Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.

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

Вт авг 06, 2019 07:52:13

VladislavS писал(а):IAR самый бесплатный из них?
Бесплатный SDCC http://sdcc.sourceforge.net/

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

Вт авг 06, 2019 07:54:09

Интересный момент, вот это
Код:
TIM2_CCR3L++;
с компиллилось в это
Код:
   
  TIM2_CCR3L++;
    0085A5    C65316         LD        A, TIM2_CCR3L
    0085A8    4C             INC       A
    0085A9    C75316         LD        TIM2_CCR3L, A


И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.

Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.

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

Вт авг 06, 2019 08:17:35

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

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

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

Добавлено after 21 minute 20 seconds:
jcxz писал(а):Вы используете какую-то древнюю версию IAR.
3.10.4 У меня.

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

Вт авг 06, 2019 11:14:44

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

3.10.4 У меня.
Крайняя 3.11.1


Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Да ладно, инлайнит только в путь даже если не просить об этом.

Вариант 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
//}

На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
Ответить