jcxz 245 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба Там нет FRAM, счётчик обычный, рабоче-крестьянский без блэк-джека. Механический. Поставленный недавно?? Не думал что их ещё ставят. Может где-о в деревне? :rolleyes: У нас в доме ещё несколько лет назад все счётчики заменили на электронные. Централизованно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 18 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба В '11 был заменён эл.счётчик '74-го, ни в нём, ни в новом никакой "флэши" нет. Аргумент - не аргумент (;При чем тут это. ещй раз... был вопрос " покажите устройство, реально отслужившее 20 лет" - я показал. не было вопроса "покажите устройство с флеш памятью, реально отслужившее 20 лет" Вот эл. счетчик.... какогонить года 60-го выпуска... его в сталинские дома поставили и он до сих пор работает. Теперь 21-ый век.... разрабатываем новый, современный эл. счетчик. сунули туда микропроцессор. а он всего на 20 лет. А почему? а потому что там флеш 20 лет..... ((( Просто новые устройства делают, взамен старым. Везде суют МК. Старые устройства работают по 20 лет. и дольше.... Новые устройства, должны быть не хуже старых. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба При чем тут это. ещй раз... был вопрос " покажите устройство, реально отслужившее 20 лет" - я показал. не было вопроса "покажите устройство с флеш памятью, реально отслужившее 20 лет" Вот эл. счетчик.... какогонить года 60-го выпуска... его в сталинские дома поставили и он до сих пор работает. Теперь 21-ый век.... разрабатываем новый, современный эл. счетчик. сунули туда микропроцессор. а он всего на 20 лет. А почему? а потому что там флеш 20 лет..... ((( Просто новые устройства делают, взамен старым. Везде суют МК. Старые устройства работают по 20 лет. и дольше.... Новые устройства, должны быть не хуже старых. Ну ёлы-палы, ну "флэш" же обсуждали и её "срок" годности. Технологии и 30-ти лет нету (Атмел же первыми сделали контроллер с "флэшом" в '94 - я не путаю?). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 18 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба Кому это может понадобиться?в смысле кому? работала железка на скорости 19200, теперь нужно перестроить на 9600. Полно таких устройств. Индусу заплатили, он пишет. Какая ему разница, что смысла в этой писанине нет?Ещё раз... при чем тут индус? вы говорите, что программисты у ST - иниоты. Именно у СТ!!! Можно подумать в других компаниях другой подход. Я и спрашиваю, а программисты не СТ? Программисты ТИ и Атмела - так какой подход? тьретий раз спрашиваю - нет ответа на конкретный вопрос, один флуд. По коду моего сниппета все видно, а по коду вызова библиотечной функции — нет. пока что кода вашего снипета вообще не видно )) а по коду библиотечной функции ВАМ не понятно как настраивается уарт??? UART1_Init(19200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); вам не понятно какой битрейт? сколько стоп, паритетность, длинна 8 бит? ВАМ реально не понятно это из этого кода..... тогда смысла с вами дальнейшей дискуссии нет. И всё остальное, что вы пишете, простите, но просто бред. Такой код не понятен либо глупцу, либо это троллинг. При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит). "cppinit.o" - откажитесь от статических инициализированных классов/структур с конструкторами - и не будет его. Уберите из программы все статические объекты инициализированные не нулями - и тоже не будет каких-то секций или будут меньше. Ну уже float убрал.... исчезло float.o. Когда станет не в моготу, уберу с++..... "и ещё ещё ещё ещё чего-нибудь". )) спс за совет. Такому коду место на помойке. "Без библиотек" совсем не означает что нужно писать такое. Почему нельзя написать "без библиотек" и при этом вполне прилично? Как-то так: Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию RATE_DIV(19200)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию RATE_DIV(19200)? В помойном нет выбора скорости, в моём есть - поэтому и больше. Если без выбора скорости - то ровно столько же. RATE_DIV - это просто макрос: #define RATE_DIV_TRA(div) {div & 15 | div >> 8 & 0xF0, div >> 4 & 255} #define RATE_DIV_TST(div) \ RATE_DIV_TRA(assert_static(div >= 16 && div < 65536) * div) #define RATE_DIV(rate) RATE_DIV_TST(SYSCLK_MH * 2 / (rate) + 1 >> 1) где: SYSCLK_MH - тактовая частота МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 2 августа, 2017 Опубликовано 2 августа, 2017 (изменено) · Жалоба При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит). Для особо слепых: ссылка у меня в подписи. Вот, например: // Configure UART // 9 bit, no parity, 1 stop (UART_CR3 = 0 - reset value) // 57600 on 16MHz: BRR1=0x11, BRR2=0x06 UART2_BRR1 = 0x11; UART2_BRR2 = 0x06; UART2_CR1 = UART_CR1_M; // M = 1 -- 9bits UART2_CR2 = UART_CR2_REN | UART_CR2_RIEN; // Allow RX, generate ints on rx Изменено 2 августа, 2017 пользователем Эдди Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 18 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба UART2_BRR1 = 0x11; UART2_BRR2 = 0x06; Это и есть снипер? Так я такой код и заюзал, чтоб сэкономить флешь. По мнению некоторых - это помойный код. ))) Это во первых, во вторых - что такое выстрел в ногу? Это например когда руками посчитал что-то и и в расчетах ошибся. Допусим нужны 0х11 и 0х6 в регистрах брр1 и брр2, а вы ошиблись и насчитали 4 и 8. Пишете свой "не уродливый", понятный код.... аля.. // Configure UART // 9 bit, no parity, 1 stop (UART_CR3 = 0 - reset value) // 57600 on 16MHz: BRR1=0x4, BRR2=0x08 UART2_BRR1 = 0x04; UART2_BRR2 = 0x08; UART2_CR1 = UART_CR1_M; // M = 1 -- 9bits UART2_CR2 = UART_CR2_REN | UART_CR2_RIEN; // Allow RX, generate ints on rx Вот вам и выстрел себе в ногу. И ни какая хорошая документация кода вас от выстрела не спасет. А с спл сложнее ошибиться. И в третих.... я не знаю, что за камень вы используете, но в stm8s такой код не взлетит.... судя по инклуде в вашем коде, это какойто stm8l*, открыл на вскидку RM0031 для stm8l051, стр 532 The Baud Counters will be updated with the new value of the Baud Registers after a write to BRR1. Hence the Baud Register value should not be changed during a transaction. The BRR2 should be programmed before BRR1 Вот он вам, чистой воды самострел, без всяких спл. )))) один раз потратил 2 часа на даташит — написал сниппет для USART..... А даташит с RM — их в любом случае подробно читать придется..... ну ну.... я вижу как вы их подробно читаете. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба А я бы как-то так написал: #define F_CPU 16000000.0 #define BaudRate 57600.0 #define Divider ((uint16_t)(F_CPU/BaudRate + 0.5)) USART1_BRR2 = (Divider&0x0F) | ((Divider>>8)&0xF0); USART1_BRR1 = (Divider>>4); Если надо много скоростей, то много делителей бы просчитал на этапе компиляции. А как сделано в SPL это "сон разума" Мало того что 32-битные деления в рантайме, так ещё и резельтат без округления к ближайшем целому будет. /* Clear the LSB mantissa of USARTDIV */ USARTx->BRR1 &= (uint8_t)(~USART_BRR1_DIVM); /* Clear the MSB mantissa of USARTDIV */ USARTx->BRR2 &= (uint8_t)(~USART_BRR2_DIVM); /* Clear the Fraction bits of USARTDIV */ USARTx->BRR2 &= (uint8_t)(~USART_BRR2_DIVF); BaudRate_Mantissa = (uint32_t)(CLK_GetClockFreq() / BaudRate ); /* Set the fraction of USARTDIV */ USARTx->BRR2 = (uint8_t)((BaudRate_Mantissa >> (uint8_t)8) & (uint8_t)0xF0); /* Set the MSB mantissa of USARTDIV */ USARTx->BRR2 |= (uint8_t)(BaudRate_Mantissa & (uint8_t)0x0F); /* Set the LSB mantissa of USARTDIV */ USARTx->BRR1 = (uint8_t)(BaudRate_Mantissa >> (uint8_t)4); Мой код 0x11 и 0x06 запишет, а индусский скорее всего 0x11 и 0x05. Проверять лень, на глаз вроде так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 18 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба А я бы как-то так написал:кошерный код.... и даже float.o не подтянулся. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 2 августа, 2017 Опубликовано 2 августа, 2017 · Жалоба кошерный код.... и даже float.o не подтянулся. Спасибо Мой лучше B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 2 августа, 2017 Опубликовано 2 августа, 2017 (изменено) · Жалоба И в третих.... я не знаю, что за камень вы используете, но в stm8s такой код не взлетит.... Очень даже взлетит. Работает на STM8S003, S103 и S105. Не работало бы — полез бы глубже читать мануал. А название инклюда у меня так исторически сложилось — рыбу утянул с L-серии, потом туда потихоньку дописывал нужные дефайны. Понятно, почему это работало: 6 как-то не сильно много для LSB, а MSB пустой. Иначе не взлетело бы. Надо будет сниппеты в соответствие с RM привести, а то копирую этот кусок из одного в другое место, без учета требований последовательности записи регистров... В любом случае мой подход правильней SPL. А еще правильней у VladislavS. Изменено 2 августа, 2017 пользователем Эдди Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 3 августа, 2017 Опубликовано 3 августа, 2017 · Жалоба Для того чтобы изменить скорость USART надо записать две правильных константы в два регистра в правильной последовательности. Как вы это сделаете - смесь вкусовщины с бесовщиной. Я стараюсь делать чтобы код максимально близко был похож на описание в документации. Так проще потом что-то менять и косяки отлавливать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 18 3 августа, 2017 Опубликовано 3 августа, 2017 · Жалоба А дальше как обычно определяем неинициализированные и инициализированные переменные с модификатором __eeprom и компилятор сам всё сделает.а как uint16_t в епром разместить/писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 3 августа, 2017 Опубликовано 3 августа, 2017 · Жалоба а как uint16_t в епром разместить/писать? Весь смысл IAR-вских библиотек - сделать работу с EEPROM прозрачной. Не важно какого типа переменная, модификатор __eeprom размещает её в EEPROM и дальше забота компилятора куда её размещать, как читать и писать. __eeprom uint16_t x; x=0x1234; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pittyalex 0 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба Господа, товарищи, здравствуйте. Помогите разобраться можно (и нужно) с отсылкой к даташитам или мануалам, но желательно конкретное место. Проблема: пытаюсь сравнить массив в памяти с таким же массивом в еепром (по сути адресное пространство одинаковое) с помощью библиотечной процедуры memcmp, но компилятор ругается: Error[Pe167]: argument of type "unsigned char __eeprom *" is incompatible with parameter of type "void const *" C:\DISTRIBUTIVES\!Develop\STM\STM8\Projects\S003F3\IAR-Robot\stm8_rc522-master\main.c 81 Объявление массивов: __near unsigned char mf_key_list[4][10] = { {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}}; __eeprom unsigned char ee_key_list[4][10] = { {0x04, 0x44, 0x2C, 0x12, 0x05, 0x33, 0x82,0,0,0}, //MasterKey {0,0,0,0,0,0,0,0,0,0}, //Key for first reader {0,0,0,0,0,0,0,0,0,0}, //Key for second reader {0,0,0,0,0,0,0,0,0,0}}; //Key for third reader Сравнение: if (memcmp(ee_key_list[0], mf_key_list, sizeof(mf_key_list[0]) == 0)) { }; Подскажите, что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться