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

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

Добавлено: Вс дек 14, 2014 14:08:57
uldemir
Читать STшные мануалы, это как погружаться на дно самого глубокого болота. Пока нарисовал так для стандартного режима.

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

// i2c
  I2C_FREQR = 2; // Tclk = 500ns
  I2C_CCRH = 10 >> 8; // 5us / 500ns = 10
  I2C_CCRL = 10;
  
  I2C_TRISER = 2+1; // 1000ns / 500ns
  
  I2C_CR1_bit.NOSTRETCH = 0;
  I2C_CR1_bit.ENGC = 0;
  I2C_CR1_bit.PE = 1; // enable
И буду использовать исключительно как мастер. Попутно не могу врубиться зачем после передачи адреса надо читать SR3?
Then the master waits for a read of the SR1 register followed by a read in the SR3 register (see Figure 21 & Figure 22 Transfer sequencing EV6).
Что в нём такого интересного? Проверить бит TRA ?
микрочиповский мануал был гораздо внятнее.

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

Добавлено: Вс дек 14, 2014 14:50:01
a5021
Как-то вы слишком размашисто пишете. Половина вашего кода не делает никакой осмысленной работы. После включения/сброса все использованные вами регистры в нуле. Нет никакого смысла их обнулять еще раз. Даже если компилятор соптимизирует, это просто лишняя писанина. Ну зачем, спрашивается, было набивать строку "I2C_CCRH = 10 >> 8" ?

Чтение статусных регистров имеет простой смысл: процедура чтения сбрасывает некоторые флаги, которые будучи выставленными блокируют нормальную работы I2C. Даже если состояние флагов вашему алгоритму не интересно, чтобы не возникло неожиданных затыков, вставить пустую операцию чтения будет не лишним.

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

Добавлено: Вс дек 14, 2014 15:37:03
HHIMERA
Да забейте вы на этот убогий I2C... Если не слэйв... его вообще проще программным сделать... и надёжнее...
Как-то понадобилось привязать TIC149 к STM32... так пришлось таймер подвязывать, чтобы ACK сформировать... :facepalm:

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

Добавлено: Вс дек 14, 2014 15:44:53
uldemir
Заниматься ногодрыганьем, когда есть аппаратный модуль? Хотя, да, по сравнению с ПИКовским i2c, под который я писал пол-года назад - тяжел для понимания. Один факт того, что надо что-то прочитать (причем только один раз, похоже) наводит тоску.
Ну зачем, спрашивается, было набивать строку "I2C_CCRH = 10 >> 8" ?
Чтобы знать откуда и почему туда пишется 0.

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

Добавлено: Вс дек 14, 2014 15:56:05
HHIMERA
I2C - исключение из правил... Он ущербный и убогий везде... даже в ПИках... В младших Пиках его вообще нет... но жили же как-то...
Я всё стараюсь делать хардварно... даже то, что другие не делают... но I2C - нах-нах... не стоит оно того... кроме слэйва, конечно...
Вот такое ИМХО...

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

Добавлено: Вс дек 14, 2014 16:22:11
a5021
HHIMERA писал(а):Я всё стараюсь делать хардварно... даже то, что другие не делают... но I2C - нах-нах... не стоит оно того... кроме слэйва, конечно...
Вот здесь показали пример обхода заботливо разложенных стм-овцами грабель. Мож, конечно, есть еще какие, но я не сталкивался. Слейв изкаропки работает.
uldemir писал(а):Чтобы знать откуда и почему туда пишется 0.
Ведь не много смысла писать ноль туда, где и так ноль. Читабельность кода? Она хороша, когда за нее не надо платить ограниченным ресурсом. А вот когда все это начинает забивать и так не большой флеш, то еще подумаешь.

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

Добавлено: Вс дек 14, 2014 16:55:10
HHIMERA
a5021 писал(а):Ведь не много смысла писать ноль туда, где и так ноль.
Когда чел пытается разобраться в чём-то... то глупо требовать чистоты кода... особенно если это не несёт никаких ошибок... С приходом понимания всё почистится...
Читабельность кода? Она хороша, когда за нее не надо платить ограниченным ресурсом. А вот когда все это начинает забивать и так не большой флеш, то еще подумаешь.
Да... а не плюнуть ли и не перейти ли сразу на STM32??? :)))
Заниматься преждевремменой оптимизацией грешно и не кошерно... Унылость реализации от ИАРа вносит не меньший вклад расхода флэша... достаточно заглянуть в дизасм... но лучшего пока нет...
У меня есть исходник... где цепочку NOP'ов категорически трогать нельзя... Костыль однозначный... но на удивление... опровергает многое написанное про STM8... 8)
Кстати... глядя на ту простыню... по "улучшению STM8 I2C"... засомневаешься поневоле в минимальности кода...

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

Добавлено: Вс дек 14, 2014 17:11:56
a5021
HHIMERA писал(а):Да... а не плюнуть ли и не перейти ли сразу на STM32??? :)))
Если бы речь шла обо мне, то я бы может и плюнул, но кропаю сейчас одну "забаву" в пятивольтовом окружении, что вживление туда STM32 потянет за собой не оправданные накладные расходы. Была б у атмеги периферия попродвинутее, то можно было бы хоть на атмегу посмотреть, а так, только STM8S и без вариантов.
Кстати... глядя на ту простыню... по "улучшению STM8 I2C"... засомневаешься поневоле в минимальности кода...
Так я ее и не в качестве иллюстрации по изящному стилю в программировании приводил.

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

Добавлено: Сб дек 27, 2014 11:16:25
uldemir
Этот вопрос уже пережёвывался, но еще раз спрошу: как читать/писать в EEPROM в stm8L101k3. Снимать защиту записи я научился, кажется (во всяком случае бит DUL устанавливается). Теперь как указать, что переменная находится именно в EEPROM? если объявляю

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

__eeprom char leadingzero;
- всё компилируется, но не линкуется. Здесь был какой-то рецепт для космика (что-то про "в опциях проекта на вкладке linker в ячейку Objects прописать либу libl0.sm8"), но не могу такого найти в IAR. Можно было бы просто написать char leadingzero @0x9fff; Но как знать, что компилятор туда что-нибудь не засунет?

p.s. Конструкция __no_init __eeprom char leadingzero @ 0x9FFC; - компилируется. И переменная даже читается. Но не пишется. Стоит только в код добавить присвоение, как линкер выдаёт:

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

Error[Li005]: no definition for "__eeprom_program_byte" [referenced from eeprom_util.o(dlstm8smn.a)] 
Error[Li005]: no definition for "__eeprom_wait_for_last_operation" [referenced from eeprom_util.o(dlstm8smn.a)] 
Не понятно, что оно от меня хочет, чтобы я присоединил что-то или написал ему эти функции?

p.p.s. Гугл нашел такую фразу:
User guide corrections

IAR C/C++ Development Guide, DSTM-2

• EEPROM, page 27
Additional information:
To make the automatic writes to eeprom variables work, the user must implement the three functions declared at the top of the file stm8/src/lib/eeprom_util.c.
Так значит, я должен?

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

Добавлено: Сб дек 27, 2014 11:46:46
dosikus
uldemir писал(а):Теперь как указать, что переменная находится именно в EEPROM?
Приучить себя читать мануал на пользуемый софт ...

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

@eeprom unsigned char evar;		// Variable located in EEPROM
@eeprom unsigned char *eptr;		// Pointer is located in RAM, but points to EEPROM.
unsigned char * @eeprom eptr3; 		// Pointer is located in EEPROM, but points to RAM.
@eeprom unsigned char *@eeprom eptr2;	// Pointer is located in EEPROM and points to EEPROM
http://www.cosmic-software.com/faq/faq13.php

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

Добавлено: Сб дек 27, 2014 11:56:32
uldemir
Вы наверное, специально мне грубите. Советую ВАМ потрудиться научиться читать сообщения на которые вы отвечаете. Там написано IAR.

Дальнейшее гуглнье показало, что должна быть функция FLASH_ProgramByte. Но ни в одном хедере такая функция не упоминается.

Можете ткнуть меня носом В. Только напомню, я мучаюсь под IARом.

p.s. Заборол. Остаюсь при своём мнении, что пики логичнее внутри чем стм-ы. Если пользоваться stdperflib-ом, то проблем нет, а если нет, то эти функции, действительно, надо писать самому. Хотя нахрена? если для одного байта реально просто происходит запись в ячейку. А статус записи можно и так посмотреть? изврат какой-то: потрахаться, чтобы удовлетворить компилятор.

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

Добавлено: Сб дек 27, 2014 12:06:52
HHIMERA
Учитывая ваше отвратительное настроение...
Читайте... просвещайтесь...
http://kazus.ru/forums/showthread.php?s ... 04&page=37

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

Добавлено: Сб дек 27, 2014 20:53:35
HHIMERA
Остаюсь при своём мнении, что пики логичнее внутри чем стм-ы. Если пользоваться stdperflib-ом, то проблем нет, а если нет, то эти функции, действительно, надо писать самому. Хотя нахрена? если для одного байта реально просто происходит запись в ячейку. А статус записи можно и так посмотреть? изврат какой-то: потрахаться, чтобы удовлетворить компилятор.
Присутствие логики в ПИКах при её отсутствии??? Там же по периферии убожество и забвение!!! Как и у АВР... :)))
Это всё от незнания... Никто не заставляет юзать либы... хедеры компилерописателей и страшное __eeprom... Но для начального старта и понимания происхлдяшего вполне подойдёт...
И да... ИАР чудесатый... выдохся видать за годы существования... удивляет постоянно...

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

Добавлено: Сб дек 27, 2014 23:34:39
uldemir
Млин, перестало работать. Не понимаю, что этому чуду надо для записи. Если пускать под отладчиком - идёт. Отпускаешь просто на выполнение - нет. Может еще где-то указывается защита от записи?

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

Добавлено: Сб дек 27, 2014 23:40:47
HHIMERA
Где-то не выдерживаются тайминги... другого там нет...

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

Добавлено: Сб дек 27, 2014 23:55:46
uldemir
Какие тайминги? для записи надо просто записать байт по адресу! дальше сделает офигенно мудрый кристалл. Это глупым пикам, надо было обязательно пнуть ногой, чтобы начался процесс записи. После чего через несколько миллисекунд должен выскочить флаг EOP и готово. Перед записью бит DUL встаёт. По даташиту это единственный ограничивающий фактор.

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

Добавлено: Вс дек 28, 2014 00:11:01
uldemir
Нашел еще одну штуку. А где прописывается OPT3?

Кажется это и было проблемой. Но чёрт. В Reference мануале об этом не было ни слова. Было только в даташите на кристалл.
Времянки... времянки.

А как это прописать в исходнике? Или это как в AVR :"А фьзы правильно зашил?"

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

Добавлено: Вс дек 28, 2014 00:27:25
a5021
Возьмите ST Visual Programmer, там эти опты и расписаны для всех камней. Да, в каком-то смысле это похоже на атмеговские фьюзы.

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

Добавлено: Вс дек 28, 2014 00:57:36
HHIMERA
Каким боком тут OPT??? Если в конфигурации что-то неправильно... оно не будет рулить ни пошагово, ни бегом!!!
Не поедет телега... если коней не запрячь!!!
А вот если пошагово проходит... значит не выдерживаются тайминги... которые могут быть в виде проверки флага... или тривиальной задержки... теже НОПы...

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

Добавлено: Вс дек 28, 2014 08:28:26
uldemir
a5021 писал(а):Возьмите ST Visual Programmer, там эти опты и расписаны для всех камней. Да, в каком-то смысле это похоже на атмеговские фьюзы.
А что мне это даст? Как посмотреть и модифицировать этот option byte нашел и для IAR. Но вопрос как это прописать?
Может достаточно объявить переменную там и компилятор сам сделает? - явно нет. у меня объявлено а в OPT3 был 0.
Может написать какую-то прагму?
Может написать константу 1 по адресу 0x4803?
Может это делать при запуске изнутри программы? - Нельзя. Из программы только можно прочитать.
Или каждый раз лезть ST-LINK -> Option Bytes... и там ручками галочки выставлять?

p.s.

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

#pragma location = 0x4803     // OPT3 byte - define DATASIZE
__eeprom unsigned char DATASIZE = 0x01; 
- не работает. Ошибок нет, но в map-файле никакого упоминания. Ну и после загрузки никаких изменений.

Как вообще с этим быть? ведь для stm8s там прописывается альтернативные функции выводов. Неужели будет такая же морока как с АВРовскими фьюзами? У пиков есть CONFIG через который в проекте фьюзы прописываются.

p.p.s. Нашел горбатый костыль. Сохранить настройки из ST-LINK -> Option Bytes... в *.obc файл и добавить в Опциях Debug -> ST_LINK -> Use option bytes configuration file. Но если я буду применять другой программатор, то эти настройки туда не перейдут. Это просто праздник.