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

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

Сообщение Z_h_e »

Наличие команды оперирующей 16 битами, не говорит о том 16 бит пишутся одновременно. Невозможно это на 8 битной шине данных.
Например, команда LDW выполняется за два цикла, против одного для команды LD.

Можно ради интереса попробовать записать такой командой что-то в 16 битный регистр с буфером (теневым регистром). Может адекватно сработает, если запись по факту пойдет в нужном порядке. Но наверное нет, я не видел в документации такого варианта записи.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350614#p3350614"]Наличие команды оперирующей 16 битами, не говорит о том 16 бит пишутся одновременно. Невозможно это на 8 битной шине данных.[/uquote]
при наличии конвейера не все так однозначно. CLRW, INCW. DECW например выполняются за один цикл.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

JackSmith писал(а):не все так однозначно
Да, там шин не одна, я правда давно про них читал. Хотя для программиста как бы единое адресное пространство.
JackSmith писал(а):CLRW, INCW. DECW например выполняются за один цикл.
Эти команды работают с регистровыми парами, то есть со сверхОЗУ. Пример неудачен. А конвеер тут совсем не причем.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350621#p3350621"]Эти команды работают с регистровыми парами, то есть со сверхОЗУ.[/uquote]
Не важно с чем они работают, главное эти команды по 8-ми битной шине данные не гоняют, там сам оп-код может быть всего 1 байт.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

JackSmith писал(а):CLRW, INCW. DECW например выполняются за один цикл.Эти команды работают с регистровыми парами, то есть со сверхОЗУ. Пример неудачен.
ну понятно.

возвращаясь к сути:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350568#p3350568"]
Бубоник писал(а): раз в документации указанно что TIM1_PSCR содержит 16 битное значение значит должен принимать 16 битные числа.
Как Вы это представляете на 8ми битной шине?[/uquote]

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

Сообщение Z_h_e »

А при чем тут размер ОП кода. Ну не записывает в память STM8 16 битные данные одновременно.

Кстати, Reflector, вы же активно участвовали в топике в разборе где код выполняется быстрее. Из Флеш или из ОЗУ. Не знаю, обратили внимание или нет. Там STM8 тоже фигурировал. Там код из ОЗУ выполнялся крайне медленно. Это объясняется тем что выборка инструкций идет с помощью 8ми битной шины. А для обасти флеш, какая -то более широкая шина данных.
JackSmith писал(а):в чем суть ваших претензий к LDW?
У меня нет никаких претензий к системе команд STM8, не надо придумывать чего я не говорил ( и не думал тоже). Хотя ассемблер мне не нравится, какой-то он не такой. Но это дело привычки скорее всего и темы не касается.
JackSmith писал(а): или вы считаете что она не сможет загрузить 16-число в регистр I/O?
Вопрос ТС шел про 16 битные регистры имеющие теневой регистр. На хрена надо было бы вводить теневой регистр, если бы команды умели писать 16 бит данных одновременно?
Хотя ТС скорее всего не это имел ввиду и задал вопрос не в тот раздел и некорректно. Он, я думаю, хотел чтобы комилятор адекватно компиллил код при присваивание 16 битным регистрам с теневым регистром. А компилятор, возможно, как раз и применил команду LDW.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350645#p3350645"]Вопрос ТС шел про 16 битные регистры имеющие теневой регистр. На хрена надо было бы вводить теневой регистр, если бы команды умели писать 16 бит данных одновременно?[/uquote]

возможны оба варианта. теневой регистр вводится для случая когда в РВВ пишут кусками. Если мне не изменяет память, некоторые теневые регистры возможно отключать.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350645#p3350645"]А при чем тут размер ОП кода. Ну не записывает в память STM8 16 битные данные одновременно.[/uquote]
Да это понятно, я имел в виду, что если оп-код всего 1 байт, то понятно, что данные в команде не содержатся и ничего по шине слать не нужно, можно установкой одного бита сбросить сразу множество регистров, как, например, сбрасывается периферия у STM32. Просто в тот момент мне показалось, что почему бы такое же не провернуть с обычным ОЗУ, т.е. выставить адрес и сбросить сразу 2 байта, минуя шину :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Странно что тему до сих пор не перенесли.

Сделал некие эксперементы на STM8S103

Я не один сделал, по разному пробовал, но напишу один. Как говорил колобок "ничего не понимаю".

Вот такой код.

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

    static volatile unsigned short temp;
    *((unsigned short *)&TIM1_PSCRH)=0x1234;
    temp=*((unsigned short *)&TIM1_PSCRH);    
    PB_DDR=MASK_PB_DDR_DDR5; //PB5 выход
    if (temp==0x1234) PB_ODR=MASK_PB_ODR_ODR5;//выключим светодиод
    while(1);
if добавил чтобы исключить влияние отладчика, на pb5 светик весит и результат потом глядел по нему.

Вот это *((unsigned short *)&TIM1_PSCRH)=0x1234; компиллится в

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

LDW       X, #0x1234
LDW       TIM1_PSCRH, X
Хотя референс запрещает использование ldw и, сразу не обратил внимание, так и пишет что ldw сначала пишет младший байт, а затем старший, как и читает. Светодиод гаснет. То есть считывает то что и записывал.

Сейчас еще кое- что попробую. Я тут чуток :beer: , тяжело пробовать.

Добавлено after 3 minutes 26 seconds:
Вставил между записью в прескаллер и чтением его в temp

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

  TIM1_CNTRH=1;
  TIM1_CNTRL=2;
Подумал, может теневые регистры общие и перестанет работать. Не фига. Тот же результат.
Плохо конечно, что сработало. Можно так ошибку пропустить в легкую. Пойду красноперку чистить, правда половину дочь отберет :)
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мучитель микросхем
Сообщения: 480
Зарегистрирован: Вс авг 16, 2015 13:08:53

Сообщение Бубоник »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350568#p3350568"]Да не обязан Вам никто отвечать.[/uquote] Бяку какую нибудь не по теме написать ОБЯЗАТЕЛЬНО кто нибудь найдется даже просить не надо.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350568#p3350568"]А если Вы жд кассе спросите расписание самолетов, тоже значит что кассир обязан ответить?[/uquote] Если на дверях будет вывеска про расписание самолетов естественно спрошу, почему бы и нет.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350568#p3350568"]я думаю, хотел чтобы комилятор адекватно компиллил код при присваивание 16 битным регистрам с теневым регистром. А компилятор, возможно, как раз и применил команду LDW.[/uquote] Естественно я это и имел ввиду и компилятор применил команду LDW, знал бы как на нем (IAR) ассемблер пишется написал на ассемблере.

Добавлено after 6 minutes 34 seconds:
Кстати если даже записать значения только в старший регистр TIM1_CNTRH то эффекта на контроллере не происходит пока не запишиться младший регистр TIM1_CNTRL
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Бубоник писал(а):Бяку какую нибудь не по теме написать ОБЯЗАТЕЛЬНО кто нибудь найдется даже просить не надо.
Ну не по теме Вы как раз и начали. И в чем же бяка, что я написал, что никто не обязан Вам отвечать?
Бубоник писал(а):Если на дверях будет вывеска про расписание самолетов естественно спрошу, почему бы и нет.
На дверях написано ARM.
Бубоник писал(а):Естественно я это и имел ввиду, знал бы как на нем ассемблер пишется написал на нем
Зачем Вам ассм чтобы побайтно присвоить значение в регистр? Если хочется в одну строку - сделайте макрос.

-----------
По поводу моих тестиков.
По идее регистр прескаллер должен был бы обновится при событии обновления таймера, а не сразу. Что-то вообще непонятно. На всякий случай перед изменением прескаллера, счетному регистру присваивал промежуточное значение, ничего не изменилось в результатах теста.
Бубоник писал(а):Кстати если даже записать значения только в старший регистр TIM1_CNTRH то эффекта на контроллере не происходит пока не запишиться младший регистр TIM1_CNTRL
А так и должно быть. Непонятно почему у меня приведенный код работает.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мучитель микросхем
Сообщения: 480
Зарегистрирован: Вс авг 16, 2015 13:08:53

Сообщение Бубоник »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350865#p3350865"]На дверях написано ARM.[/uquote] А на вывеске список стм 8-ых.

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3350865#p3350865"]Зачем Вам ассм чтобы побайтно присвоить значение в регистр?[/uquote] Более оптимизированный код нужен. Я думал компилятор запилит код за несколько тактов, само минимально у меня получилось в районе ~12 при помощи компилятора.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Бубоник писал(а):А на вывеске список стм 8-ых.
На какой? Раздел форума ARM. Тов. BOB51 указал Вам где про STM8 разговаривают.
Бубоник писал(а):Более оптимизированный код нужен.
Система команд STM8 заточена по Си. Если Вы хотите более оптимизированный код, изучайте асм. Но на банальных операциях вряд ли получится короче, чем на Си.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Из IAR 3.2 если делаю очистку памяти (project/download/erase) на stm8s003/103f3 то взводится ROP
Который потом удаётся снять только в stvp
От чего так?
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

а можно ли вывести два STM8 на один разъем SWIM при этом переключать или NRST или SWIM пин?
по идее что тот что тот если от одного МК отключить этот пин он не отреагирует на работу программатора
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

Всем привет!

Столкнулся с проблемой при работе stm8s003 с eeprom 24с02 по i2c

I2C настроен верно. Я отправляю старт и адрес устройства, устройство прижимает линию - появляется сигнал АСК. На 24c02 для теста перекидываю А0-А1 на другое состояние - уже NAK. Т.е. эта часть работает верно.

Далее хочу записать в 24c02 какие данные - тут тишина. После приема адреса, идет сразу стоп и все.. Натолкните на мысли что не так.

Код:
Спойлерvoid IC_EEPROM(void)
{
uint32_t status = 0;

/*Формируем старт*/
while(!(I2C->SR3 & I2C_SR3_BUSY))
I2C->CR2 |= I2C_CR2_START;

/*EV5 - шлем адрес устройства*/
while(!(I2C->SR1 & I2C_SR1_SB))
//a1 - 10100001 - чтение
//a0 - 10100000 - запись
I2C->DR = 0xa0;

/*EV6*/
while(!(I2C->SR1 & I2C_SR1_ADDR))
/*Очищаем*/
status = I2C->SR3;
I2C->SR3;

/*Шлем адрес для записи*/
while(!(I2C->SR1 & I2C_SR1_TXE))
I2C->DR = 0x01;

/*Данные для записи*/
while(!(I2C->SR1 & I2C_SR1_TXE))
I2C->DR = 0x01;

/*Формируем стоп*/
while(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)))
I2C->CR2 |= I2C_CR2_STOP ;
}
Изображение с лог анализатора
СпойлерИзображение
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

EV6:ADDR=1, cleared by reading SR1 register followed by reading SR3.
А вы два раза читаете sr3, может в этом дело?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3398431#p3398431"]
EV6:ADDR=1, cleared by reading SR1 register followed by reading SR3.
А вы два раза читаете sr3, может в этом дело?[/uquote]

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

Сообщение Z_h_e »

Я I2C на stm8 не юзал, вообще как то не люблю I2C.
Due to timing constraints, when in standard mode if CCR is less than 9 (i.e. with peripheral clock below 2 MHz) with
f
MASTER = fCPUand the event interrupt disabled, the following procedure must be followed: 
modify the reset sequence in order to insert at least 5 cycles between each operations in the flag clearing sequence. For
example, when fMASTER = fCPU= 1 MHz, use the following sequence to poll the SB bit:
_label_wait: BTJF I2C_SR1,SB,_label_wait 
NOP ;
NOP;
NOP ; 
NOP
NOP 
LD I2C_DR, A ; once executed, the SB bit is then cleared.
Для пробы, может поставить тупые паузы между каждым EVn?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Об этом много уже говорилось, что I2C Master у STM8 весьма крив и без принятия особых мер не работает. Можно почитать эррату производителя, а лучше сразу поискать работающие примеры в сети.
Ответить

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