Страница 21 из 130

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

Добавлено: Пн сен 15, 2014 15:56:25
oleg110592
Мне удивительно, что я объясняю такие вещи.

моя твоя не понимай(с), наверное это очень секретная разработка - клещами вытягивать нужно :)
хотелось бы тоже разобраться - непонятно для чего именно используется этот код - если просто "запуститься, досчитать до конца и остановиться", то какова же польза от этого кода - можно просто заменить, например четырьмя NOPами и вопросов бы не было (NOPы у стмов, думаю корректно работают).
А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.
А по коду непонятно почему TIM2_CR1_OPM = 1; вначале, логичнее было бы перезапустить таймер а уж потом... указать какой режим и запустить.
Зачем нужен TIM2_CR1_URS = 1;? Вроде для прерываний используется. Где загрузка ARR?
Так может попробовать:

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

TIM2_CR1_URS = 1; // не поднимать флаги при "ручной" перегрузке счетчиков
TIM2_EGR_UG = 1; // сама "ручная" перегрузка
TIM2_CR1_OPM = 1; // режим единичного прогона таймера
TIM2_CR1_CEN = 1; // запуск

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

Добавлено: Пн сен 15, 2014 17:12:46
a5021
oleg110592 писал(а):моя твоя не понимай(с), наверное это очень секретная разработка - клещами вытягивать нужно :)
Так оно и не принципиально в контексте обсуждаемого вопроса. Я заостряюсь на самой аппаратной проблеме, а не на прикладном программном алгоритме.
хотелось бы тоже разобраться - непонятно для чего именно используется этот код - если просто "запуститься, досчитать до конца и остановиться", то какова же польза от этого кода - можно просто заменить, например четырьмя NOPами и вопросов бы не было (NOPы у стмов, думаю корректно работают).
Как избежать проблемы с запуском таймера я описывал в самом первом сообщении по этому вопросу.
А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.
А мне приходит. :) Представьте, что в линию надо выдать управляющий сигнал в виде установки уровней в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.). Можно задержками от импульса к импульсу время отсчитывать, а можно повесить это дело на разные каналы таймера, где по событию переполнения счетчика соответствующего канала будет выставляться нужный уровень. Второе решение и точнее и проще в описании. Запуск таймера в "однопроходном" режиме удобен тем, что не надо отвлекаться на остановку таймера и возврат его к исходному состоянию. По окончанию счета он сам себя "восстанавливает". Это позволяет упростить процедуру многократного перезапуска с минимальными временными издержками.
А по коду непонятно почему TIM2_CR1_OPM = 1; вначале, логичнее было бы перезапустить таймер а уж потом... указать какой режим и запустить.
Как-то я не очень догоняю глубинный смысл этой фразы. Перезапустить, а потом запустить?... Не хватает только "подпустить" и "надпустить" в качестве последовательных шагов дальнейшего развития сценария. :)
Зачем нужен TIM2_CR1_URS = 1;? Вроде для прерываний используется.
Эта команда запрещает поднятие флагов TIM2_SR1_*IF, которые при "ручном" сбросе счетчиков никому не интересны.
Где загрузка ARR?
На бороде. :)
Так может попробовать:
Да ни к чему мне пробовать. Мне не понравилось, что железный таймер позволяет себе одним и тем же кодом, то запускаться, то нет. Такого не должно быть в принципе. Оно должно либо работать всегда, либо никогда, чего бы там ни утверждали мифологические чудовища.

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

Добавлено: Пн сен 15, 2014 17:32:55
oleg110592
в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.)
забавно - разве это не временная задержка, все вышеперечисленное напомнило анекдот (извините за офф):
- Как называется ваша диссертация?
- "Как решетом воду носить".
- Ну что вы голубчик! Кто же так диссертацию называет? Назовите ее так: "Анализ проблем транспортировки вещества в жидком агрегатном состоянии в сосудах с перфорированным дном".
- Профессор, а как называлась Ваша диссертация?
- "Влияние русских народных музыкальных кнопочных инструментов на развитие религиозно - философской мысли России конца XVIII начала XX века".
- То есть, "На хрена попу боян"?
HHIMERA ты прав - "На хрена попу боян"?

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

Добавлено: Пн сен 15, 2014 17:42:48
a5021
oleg110592 писал(а):
в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.)
забавно - разве это не временная задержка,
Неа. Это ближе к последовательной передаче данных. Мысленно вообразите себе реализацию чего-нибудь высокоскоростного при помощи "задержек" и переосмыслите, насколько данный термин здесь употребим.

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

Добавлено: Пн сен 15, 2014 20:55:17
HHIMERA
Держи... протирай глаза до затылка... покажи где там что не запустилось... :))) :)))
D0 - тестовый пин...
D1 - пин таймера...
Delay_uS - на том же TIM2...

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

Добавлено: Сб сен 20, 2014 03:37:18
a5021
oleg110592 писал(а):А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.
Еще один вариант мне пришел в голову вчера. Дело было так: задумал прикрутить пульт от телека к одному агрегату. Надо чем-то с пульта данные захватывать. Таймером -- самое то. Датчик ИК на свободную ногу, оттуда внешнее прерывание по обоим фронтам и в обработчике запускаем таймер в однопроходном режиме по первому внешнему прерыванию, по всем остальным делаем капчуру и разбираем код. Время счета таймера подбирается по длине пакета с пульта. Если таймер остановился, а данные у нас не все, то это таймаут и принятые данные отбрасываем. Если пакет принят весь, то без лишних остановов и сбросов таймер готов к запуску, для приема следующего пакета Можно ли то же самое сделать без однопроходного режима? Можно. Только придется эту однопроходность эмулировать в коде. А здесь все само работает. И уж такое использование однопроходного режима задержкой точно не назвать.

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

Добавлено: Ср окт 01, 2014 12:10:36
КАШАК
Разбираюсь с STM8S003. Требуется сделать программный UART. Нашел пример от STM, но там все невероятно запутано (библиотеки для STM32 отдыхают). Вроде как заставил его скомпилироваться в IAR, но работать не хочет. На выводе Tx тишина. Может кто-то делал подобное?

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

Добавлено: Ср окт 01, 2014 16:20:48
КАШАК
Все, USART запустил. Но теперь новая напасть. У меня выводы программного USART находятся на PORTC. Там же находится выход на RST внешней периферии. Перед отсылкой данных выставляю высокий уровень на RST. Начинаю передачу. НО, как только начинается передача, состояние выхода меняется на противоположенное по непонятным причинам. При этом, если из функции передачи убрать изменение состояние вывода то состояние RST не меняется. Выводы настроены так:

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

GPIOC->DDR = 1<<7 | 1<<5 | 1<<4;
  GPIOC->CR1 = 1<<7 | 1<<5 | 1<<4;
  GPIOC->CR2 = 0;
Изменение состояния:

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

#define W_RST_H GPIOC->ODR |= 1<<4

#define W_RST_L GPIOC->ODR &= ~1<<4

void set_tx_pin_low(){
GPIOC->ODR &= ~1<<5;
}

void set_tx_pin_high(){
GPIOC->ODR |= 1<<5;  
}
В чем может быть проблема?

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

Добавлено: Ср окт 01, 2014 23:16:17
ibiza11
Побитовое НЕ имеет больший приоритет, чем сдвиг. Скобки поставьте.

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

Добавлено: Вс окт 19, 2014 12:53:01
uldemir
Помогите прочитать правильно документацию. Программирую модуль SPI для того чтобы выкинуть данные просто в сдвиговый регистр. Вроде, всё делаю по правилам TXE и BUSY не зависают (но и не вижу, чтобы устанавливались), а на выводах как стоит лог.0, так и стоит. Во всяком случае, я лог. пробником ничего не замечаю, да и в регистре ничего не меняется. Может, я что забыл?

кристалл stm8l101k3t6. вывод 18 CLK, 18 - data(MOSI).

инициализация:

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

// Модуль SPI для передачи данных в MAX6920
  SPI_CR1_bit.LSBFIRST = 0;
  SPI_CR1_bit.BR = 7; // Fmaster/256
  SPI_CR1_bit.MSTR = 1; // Master
  SPI_CR1_bit.CPOL = 0;
  SPI_CR1_bit.CPHA = 0;
  SPI_CR2_bit.BDM = 0;
  SPI_CR2_bit.BD0E = 1;
  SPI_CR2_bit.RXOnly = 0;
  SPI_CR2_bit.SSM = 1;
  SPI_CR2_bit.SSI = 1;
  SPI_ICR = 0; // прерывания не используем.
  SPI_CR1_bit.SPE = 1;
Попытка передачи:

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

      SPI_DR = 0xff; // (chartab[videobuff[pos]]) >> 8;
      while (SPI_SR_bit.TXE == 0);
      SPI_DR = 0xff; // (chartab[videobuff[pos]]) & 0xff;
....
      while (SPI_SR_bit.BSY == 1);
      PB_ODR_bit.ODR3 = 1; // Load strobe
      PB_ODR_bit.ODR3 = 0;
На выходах как стоит лог.0 на все выходах так и стоит. Может есть какой бит, который надо установить, для запуска передачи, как у всех других нормальных микроконтроллеров?

Еще, убил некоторое время на выяснение, почему в строчке SPI_CR2_bit.BD0E = 1; была ошибка. Я его расшифровал как BiDirectional mode Output Enable, ну и написал BDOE. А оказалось, там ноль. Точно так же в документации RXONLY, а в хедерах - RXOnly.

p.s. Так, Флаг BUSY не выставляется. Вставил сразу за загрузкой проверку - туда не заходит вообще.

p.p.s. Даже вывод NSS сконфигурировал на вывод и подал лог.1 - что-то ничего не ... плин. забыл. клоки не подключил. Так, теперь бум мучить i2c.

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

Добавлено: Вт ноя 04, 2014 13:03:49
valera_70
Может кто подскажет?
Хотел прошить STM8S105 с помощью встроенного загрузчика через UART через Flash Loader Demonstrator. При первой попытке попутал подключение выводов RX, TX, то есть соединил RX-RX, TX-TX. Естественно ни чего не получилось. Потом понял, подключил как надо. Но Flash Loader Demonstrator пишет, что не может подключиться. Мог я спалить выводы RX или TX в STM8S105 при первой неправильной попытке? Преобразователь USB-UART рабочий, проверил терминалкой.

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

Добавлено: Вт ноя 04, 2014 13:14:24
HHIMERA
Сомневаюсь... от этого ничего не сгорит...
Там с этим демонстратором тонкости есть... там нужно успеть всё вовремя... и с первой попытки может и не получиться...
Вторая особенность... после первой заливки флэша загрузчик отключается... для повторной записи через загрузчик нужно править оптионс байт...

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

Добавлено: Вт ноя 04, 2014 13:31:33
Serj_K
HHIMERA писал(а):Вторая особенность... после первой заливки флэша загрузчик отключается... для повторной записи через загрузчик нужно править оптионс байт...
Так как компилятор генерит хекс без байтов конфигурации, то я сделал себе батник, который вызывается при постобработке и дописывает в конец хекса 55AA:

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

echo S105487E55AA35 >> %1\%2.s19
, где %1 - $EXE_DIR$, а %2 - $PROJ_FNAME$ - передаваемые батнику параметры.
И всё, загрузчик не отключается.
В одном из проектов сделал анализ кнопки при включении устройства, после нажатия которой загрузчик активируется/деактивируется. Полезно для ускорения старта устройства и возможности перепрошиться при необходимости.

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

Добавлено: Вт ноя 04, 2014 13:33:19
valera_70
Делал сброс и старался в течении 1 секунды нажать кнопку на Flash Loader Demonstrator. Попыток 20 было, но так и не получилось. Питание от USB, может запитать от отдельного питания?

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

Добавлено: Вт ноя 04, 2014 13:38:34
valera_70
Serj_K это по твоему проекту "блок индикации". Может подскажешь?

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

Добавлено: Вт ноя 04, 2014 14:21:35
HHIMERA
Serj_K писал(а):я сделал себе батник, который вызывается при постобработке и дописывает в конец хекса
Спасибо конечно... но мне не надо...
valera_70 писал(а):Делал сброс и старался в течении 1 секунды нажать кнопку на Flash Loader Demonstrator. Попыток 20 было, но так и не получилось. Питание от USB, может запитать от отдельного питания?
Насколько помню... наоборот... Зажимаете кнопку сброса, кликаете старт, отпускаете сброс... типа так...
Если камень не новый и уже писался... то может не сработать...

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

Добавлено: Вт ноя 04, 2014 14:43:49
valera_70
Насколько я понял, именно в течении 1 секунды после сброса МК работает встроенный загрузчик.

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

Добавлено: Пт ноя 07, 2014 13:09:22
Serj_K
valera_70 писал(а):Serj_K это по твоему проекту "блок индикации".
Про какой "блок индикации" вопрос?
Насколько помню... наоборот... Зажимаете кнопку сброса, кликаете старт, отпускаете сброс... типа так...
Не так. 1) Жмёте сброс. 2)отпускаете сброс и кликаете старт. Нужно успеть нажать старт в течении 1 с после отпускания сброса

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

Добавлено: Вс дек 14, 2014 12:00:19
uldemir
Читаю reference manual на stm8L101k3 про i2c и не могу въехать. Есть два регистра I2C_FREQR и I2C_CCR. Про второй написано, что он влияет на частоту мастерклока. А на что влияет первый??? Что означают эти цифры в конфигурации: 1Мгц, 2МГц...16Мгц? сколько мне ставить, если я использую тактовую частоту 2Мгц (16/8)?

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

Добавлено: Вс дек 14, 2014 13:57:23
a5021
uldemir писал(а):Читаю reference manual на stm8L101k3 про i2c и не могу въехать. Есть два регистра I2C_FREQR и I2C_CCR. Про второй написано, что он влияет на частоту мастерклока. А на что влияет первый??? Что означают эти цифры в конфигурации: 1Мгц, 2МГц...16Мгц? сколько мне ставить, если я использую тактовую частоту 2Мгц (16/8)?
Как я понимаю, I2C_FREQR тупо информирует подсистему I2C на какой частоте подается тактирование. Если у вас 2мгц, то вам доступен только стандартный режим, соответственно CCR устанавливаете из расчета Period(I2C) = 2 * CCR * tMASTER. Для слейва CCR можно вообще не использовать.