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

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

Сообщение RusikOk »

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

Сообщение Z_h_e »

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

Сообщение PombI4 »

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

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

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 отношения не имеет.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 79
Зарегистрирован: Пн дек 19, 2016 10:20:28

Сообщение PombI4 »

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

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

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

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

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

Сообщение PombI4 »

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

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

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

Сообщение 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;
Захваченные данные похожи на расчетные, но тоже неверные.

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

Сообщение 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;
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

Сообщение 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
//}

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

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

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

Сообщение VladislavS »

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

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

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

Сообщение 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 был полный шлак.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

Сообщение 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.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение 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
//}
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
Ответить

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