Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

3 часа назад, Eddy_Em сказал:

Если же все ОК, то просто передаю данные и не парюсь.

Мне жаль производство, на котором Вы работаете. Извините ....

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

А мне жаль тех, кто не по делу тратит ресурсы МК!!!

Если уж так хочется контрольную сумму посчитать, достаточно поXORить все данные в сообщении. В случае сбоя это будет понятно. А если у вас линия так замусорена, что в каждом дайте ошибка, вы явно что-то не так делаете!!!

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

12 часов назад, Eddy_Em сказал:

Если мне нужно работать в "шумных" условиях, я выбираю CAN

Вот интересно, как в шумных условиях помогает CAN? С помощью протокольной контрольной суммы которая считается по таблице?

CAN ведь вроде не на дифференциальных линиях строится? А по вашей логике и дифференциальные линии тоже, наверно, какая то усложняющая ерунда непонятная, так ведь?

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

17 minutes ago, ruhi said:

CAN ведь вроде не на дифференциальных линиях строится?

Ну, здрассьте! У CAN ведь физика — 485! Не зря же CAN используется в автопроме. Вы если не в теме, хоть не позорьтесь!

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, Eddy_Em сказал:

У CAN ведь физика — 485!

дык хорошо, так по вашей логике: зачем так сложно то городить - тянуть два провода, скручивать их, можно и один как нибудь бросить и землю по месту прицепить, я вижу здесь вы не согласитесь, потому что похоже разбираетесь :) !

А вот зачем нужно правильно контрольную сумму считать вам видимо лень разбираться, проще охаять то во что вникать не хочется, получается. Не хорошо это, как то, с вашей стороны!

Про С# вы же тоже ничего не знаете и не понимаете, и зачем то эту вашу неграмотность по теме демонстративно продвигаете.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Из всего, с чем я работаю, нет ни одной (в т.ч. промышленной) железяки, которая если и считала бы контрольную сумму, то иначе, чем простым XOR всех байтов! Потому что это - ненужная блажь!!! Если линия настолько зашумлена, что даже CAN там затыкается, то нужно думать о другом типе физики и протокола. Скажем, передавать каждый байт дважды: байт и его инверсию. Ну и т.п.

13 minutes ago, ruhi said:

Про С# вы же тоже ничего не знаете

Мне достаточно того, что этот недоЯП выдуман мелкомягкими и весь оброс проприетарщиной. Если человек пишет на до-диезе, то в 99.99999% случаев это - вендузятник. Фу, какая гадость!..

Ссылка на комментарий
Поделиться на другие сайты

Пока идут споры решил проблемы с CRC16, а проблемы то и не было, проблема была в конвертации данных на C#(не очень я в нем силен). Так что загрузчик все загружает сумы совпадают, но есть проблема, вот данные я отправляю с ПК на МК пакетом по 256 байт, но проблема в том что прошивка которая в бинарнике не всегда равна размеру деленному на 256 байт, как тогда поступать, пока не пойму, потому как получая размер файла из windows forms C#, конвертирую это в int и делю на 256, соответственно получаю число сколько раз отправить пакет 256 байт в МК, на МК тоже принимаю в начале это число сколько раз принимать пакет по 256 байт, может делать пакет по 64 байта, или еще меньше? Но пока для проверки заработает ли загруженная программа через мой загрузчик по ЮАРТу  добавил через программу hexeditor нули а конце бинарника для выравнивания размера до 256 байт(хотя в STM32 0 во флеше должен быть как FF, но в программе hexeditor не возможно добавить FF), то есть есть прошивка 2144 байта, дорисовал нулей до 2304, соответственно делим это число на 256, получаем количество посылок 9 по 256 байт которые нужно отправить и принять. Может оно так и не должно работать с нулями. Переход в загруженную программу через мой бутлоадер, если пин на СТМ32 не подтянут к + питания(то есть не в режиме бутлоадера) вызываем функцию перехода. Загрузчик у меня написан в cubeide

void Go_To_User_App(void)
{
uint32_t app_jump_address;
typedef void(*pFunction)(void);//объявляем пользовательский тип
pFunction Jump_To_Application;//и создаём переменную этого типа
__disable_irq();//запрещаем прерывания
app_jump_address = *( uint32_t*) (APPLICATION_ADDRESS + 4);    //извлекаем адрес перехода из вектора Reset
Jump_To_Application = (pFunction)app_jump_address;            //приводим его к пользовательскому типу
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);          //устанавливаем SP приложения
Jump_To_Application();	//запускаем приложение
}

if(пин==1){
крутимся в загрузчике
}
else{
Go_To_User_App();
}

А сама программа которую загружаю через загрузчик(мигание светодиода) написана в IAR там просто в настройках linkera выбрал сдвиг векторов прерываний на 6кб(мой бутлоадер весит 5,78кб) 

image.png.44a9dc5731e287fb7b103d0c40e88441.png

И   сдвиг самой флэш  памяти на эти же 6кб 

image.png.31d9d00fb00adf9c2527163f56911c2a.png

Скомпилировал бинарник и залил через свой загрузчик, а светодиод не мигает, предполагаю проблема в неправильности перехода.Может и ОЗУ сдвинуть, в моем загрузчике используется 1,8кб ОЗУ. Вообщем не знаю правильно ли я все сделал для перехода. Может кто подскажет.

Ссылка на комментарий
Поделиться на другие сайты

@Eddy_Em Может это прояснит ваше понимание https://ru.wikipedia.org/wiki/Коллизия_хеш-функции зачем нужны именно CRC а не простое наложение XOR. Грубо говоря ваш способ немного лучше простой арифметической суммы.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Еще раз повторяю: если в сообщении из 1кБ ожидается больше одной ошибки, то явно разработчик сделал что-то не так: неправильно выбрал "физику", неправильно выбрал протокол или скорость. Вот управляю телескопом на очень дорогой монтировке 10-micron по RS-232. Там вообще никаких контрольных сумм нет, т.к. они нафиг не нужны на RS-232 при шнурке до 10м длиной на скорости 115200 бод. Аналогично с куполом Baader, который в 8 миллионов рублей обошелся: там тоже никаких дурацких проверок, просто RS-232 с текстовым протоколом на 9600 бод. 6-метровым телескопом управляют SEWовские приводы на обычной CAN-шине (к тому же перегруженной, у нас в планах выбросить CAN и сделать все на обычном ethernet, оставив CAN лишь на коротких кусках к приводам). Понятно, что на CAN "настоящая" CRC считается. Но она считается аппаратно, т.е. ресурсы ядра МК при этом не используются на всякую ерунду.

А то эдак дойдем до того, что крутой электронщик будет с DS18x20 работать в блокирующем режиме ногодрыгом с delay'ями, как это безмозглые абдуринщики делают, а не используя аппаратные ресурсы МК.

Ссылка на комментарий
Поделиться на другие сайты

У человека задача корректно записать новую прошивку, где важен каждый бит и бутлоадер кроме как ожидания очередного байта ничего не делает, нужно вникнуть в вопрос а потом давать советы. 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Eddy_Em сказал:

с DS18x20 работать в блокирующем режиме ногодрыгом с delay'ями

И что же в этом плохого, учитывая ситуацию, в которой этот вариант не помешает всему остальному ?

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, Alex said:

И что же в этом плохого

Ну это как взять рояль, шарахнуть по нему кувалдой, а потом "играть", кидая в него молотки!

Представьте, что вам кафельную плитку абы как наляпали: "а чë, и так сойдет: держится же!". Вот так же и с абдуриноподходом. Нужно все-таки себя держать в человеческих рамках, не опускаясь до стадии животного!!! Окружающий мир должен быть гармоничным, а не "тяп-ляп и в продакшн"!

И я не представляю себе вообще ситуаций когда блокирующая пауза аж в 1мс может "не помешать всему остальному". В случае же с DS18 абдуринщики почти на секунду блокируют ядро МК! За такое надо брать кувалду и бить по тупой башке!!1111

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

Ну, про секунду, конечно, речи нет. Хоть и не бить за это по голове. Речь про ногодрыг с дэлэями, для тайм-слотов. Не вижу ничего в этом плохого. Если это не помешает остальной работе.
В любом случае, нужно иметь правильный подход ко всему. И если всё распределить/расчитать, то проблем не возникнет. А без рук (ну, или, с ними, но из попы) - пофиг, запоришь один хрен всё ...

Ссылка на комментарий
Поделиться на другие сайты

15 часов назад, Электронщик сказал:

но проблема в том что прошивка которая в бинарнике не всегда равна размеру деленному на 256 байт, как тогда поступать, пока не пойму,

можно в конец вашей программы в исходниках добавить-определить масив констант 0хFF размером 255 байт (надо смотреть на чем у вас исходники написаны, и есть ли исходники), и тогда вы сможете не добавлять байты к файлу, а наоборот округлять размер файла до значения кратного 256!

потому что будет обрезаться этот дополнительный масив констант который в программе не используется (не должен использоваться)!

15 часов назад, Электронщик сказал:

хотя в STM32 0 во флеше должен быть как FF, но в программе hexeditor не возможно добавить FF

на том же С# можно написать программу на 10 строчек которая будет дописывать файл ФФ-ами до длинны кратной 256, 

А программу которая загрузчик в КОМ порт вы не можете менять? Вообще бы там это делать!

Можно еще передавать длину прошивки в байтах, но это опять надо загрузчик менять, но возможностей море, зависит от того что вам доступно для изменений- редактирования.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Eddy_Em сказал:

Но она считается аппаратно, т.е. ресурсы ядра МК при этом не используются на всякую ерунду

Это в каком это МК СРС считается аппаратно интересно, хотелось бы марку увидеть! Я штук 15 знаю, и могу гарантировать что не в одном НЕТ такой аппаратной функции!

(Правда я не знаю что такое  DS18x20, но маркировка как то не тянет на звание МК, по моему.)

И я знаю как реализовать подсчет СРС штатными средствами любого МК так чтобы оно не создавало сколько нибудь ощутимых задержек основной программе.

Собственно поэтому там и нет такой специальной аппаратной функции считать СРС, потому что СРС бывают разные, и для их расчета фоном достаточно ресурсов в любом МК.

 

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

9 minutes ago, ruhi said:

Это в каком это МК СРС считается аппаратно интересно, хотелось бы марку увидеть!

STM32F072, например!

В случае же с CAN, для работы с нижним уровнем ресурсы ядра МК практически не тратятся даже на STM32F042. И контрольная сумма считается "в фоне", не мешая основным процессам.

И вообще, советую почитать даташит на STM32: во многих из них есть блок аппаратного расчета CRC! Для 32 бит данных подсчет выполняется за четыре такта AHB. Коэффициенты полинома CRC программируются через регистры.

9 minutes ago, ruhi said:

могу гарантировать что ни в одном НЕТ такой аппаратной функции!

Позор, что сказать!

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, ruhi сказал:

Это в каком это МК СРС считается аппаратно интересно

Да вы отстали от жизни! Аппаратный блок CRC всех микроконтроллеров STM32 может использоваться для вычисления CRC любых поддерживаемых типов данных.

Аппаратная реализация CRC показывает 60-кратное ускорение вычисления по сравнению с программной реализацией.

Сергей.

Ссылка на комментарий
Поделиться на другие сайты

17 minutes ago, ruhi said:

я не знаю что такое  DS18x20

Да ладно! Кто ж не знает дешевые плохонькие термодатчики DS18B20 и DS18S20? Их единственное достоинство - возможность на одну шину посадить уйму датчиков (абдуринщики в ответ на бессмысленность использования этой дряни именно к этому и апеллируют, ведь в случае с NTC или PTC "мультиплексор нужен").

P.S. А для расчета CRC на компьютере есть уйма библиотек ([url=https://www.libcrc.org/]например[/url]), так что потуги самому считать ее смахивают на попытку самостоятельно выполнять БПФ, когда есть fftw3!

P.P.S. И да, про "расчет фоном в любом МК" не надо мне  тут! В большинстве МК всего лишь одно ядро, так что нормальную многозадачность на них построить невозможно! А псевдомногозадачность средствами какой-нибудь ртоси — адов суррогат, который еще и кучу накладных расходов требует (я уж молчу, что минимум 1 таймер на эту дрянь надо использовать).

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

23.03.2021 в 17:37, Eddy_Em сказал:

И еще вопрос: зачем такой сложный табличный способ использовать для расчета КС, если можно просто


 uint16_t CRC = 0; for(int i = 0; i < len; ++i) CRC ^= mesg[i]; 

 

Когда-то давно, когда микроконтроллеры были медленные, и питались только от 5В, табличный метод был оправдан.

Сейчас же, это выглядит действительно странно.

Но учитывая что ТС не обращает внимание на советы, которые ему дают более опытные в плане программирования на Си товарищи, я думаю что нас ждет много серий марлезонского балета, с виртуозными прыжками по сельскохозяйственным орудиям труда.

54 минуты назад, optima сказал:

 Аппаратный блок CRC всех микроконтроллеров STM32 может использоваться для вычисления CRC любых поддерживаемых типов данных.

К сожалению, не всё там так просто как хотелось бы.
Например STM32F030 не могут считать любой CRC. У них предустановки жестко заданы. По этой причине мне пришлось использовать софтварный расчет CRC при работе с купюроприемником.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Eddy_Em сказал:

Кто ж не знает дешевые плохонькие термодатчики DS18B20 и DS18S20?

Тот кому не надо измерять температуру, видимо, горячий вы наш :) .

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, LiVit сказал:

Но учитывая что ТС не обращает внимание на советы, которые ему дают более опытные в плане программирования на Си товарищи, я думаю что нас ждет много серий марлезонского балета, с виртуозными прыжками по сельскохозяйственным орудиям труда.

Так уже все работает, табличным методом все превосходно считается, к тому же загручик работает и все хорошо, единственное осталось нормальную подстройку размера бинарника продумать

9 часов назад, ruhi сказал:

А программу которая загрузчик в КОМ порт вы не можете менять? Вообще бы там это делать!

Могу, я же ее и написал

9 часов назад, ruhi сказал:

Можно еще передавать длину прошивки в байтах, но это опять надо загрузчик менять, но возможностей море, зависит от того что вам доступно для изменений- редактирования.

Я и так передаю длину, просто сразу делю ее на 256  на C#, чтобы контрольную сумму посылок рассчитать и чтобы МК знал сколько раз ему принять посылку размером 256 байт, и МК и рассчитывает контрольную сумму у себя, потом сравниваем. Тут по ходу нужна функция расчета в зависимости от размера бинарника, на сколько посылок чтобы она его делила и выходили равномерные по длине посылки.

Ссылка на комментарий
Поделиться на другие сайты

int main(void)
{
	extern short speed;//скорость
	port_ini();
	lcd_init();
	AMP_init();
	Enc_init();
	PSC_init(0,MAX_PWM);
	sei();	
	while (1)
	{	
		if (Flag_IT_timer1)
		{
			Flag_IT_timer1 = 0;	
			//----------------обработка энкодера-------------------------------
			volatile unsigned int next_state, prev_state;
			next_state = PIND & 0xC0; // Считываем текущее значение битов
			if (next_state != prev_state)
			{
				switch (prev_state)
				{
					case 128:
					{
						if (next_state == 192) (speed)++;
						if (next_state == 0) (speed)--;
						break;
					}
					case 0:
					{
						if (next_state == 128) (speed)++;
						if (next_state == 64) (speed)--;
						break;
					}
					case 64:
					{
						if (next_state == 0) (speed)++;
						if (next_state == 192) (speed)--;
						break;
					}
					case 192:
					{
						if (next_state == 64) (speed)++;
						if (next_state == 128) (speed)--;
						break;
					}
					default:
					{
						break;
					}
				}
				prev_state = next_state;    // Текущее состояние становится предыдущим
			}		       
			
			lcd_gotoxy(0,0);
			lcd_chisla(speed);
	}

не пойму почему переменная speed не меняется

Ссылка на комментарий
Поделиться на другие сайты

шта это? блин ну есть же нормальные алгоритмы зачем изобретать велосипед?

Скрытый текст

           Enc_state <<= 2;                         //Помещаем новое в старое
           Enc_state |= PORTB&(0x03);                      //Проверяем входные линии
                                     
           switch (Enc_state & 0x0F)
             {
               case 0b00000000 : break;             //не изменилось
               case 0b00000001 : Count--;
                                 break;
               case 0b00000011 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00000010 : Count++;
                                 break;
               case 0b00000110 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00000111 : Count--;
                                 break;
               case 0b00000101 : break;             //не изменилось
               case 0b00000100 : Count++;
                                 break; 
               case 0b00001100 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00001101 : Count++; 
               case 0b00001111 : break;             //не изменилось
               case 0b00001110 : Count--;
                                 break;
               case 0b00001010 : break;             //не изменилось
               case 0b00001011 : Count++;
                                 break; 
               case 0b00001001 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00001000 : Count--;
                                 break;
             } 

          if (Count == 8)              // Если был шаг энкодера влево
             {
                ..............         // то действие А 
                Count = 4;
             }

          else if (Count == 0)         // Если был шаг энкодера вправо
             {
                ..............         // то действие Б
                Count = 4;
             }

 

упрощенный вариант без проверки ошибок

Скрытый текст

           Enc_state <<= 2;                         //Помещаем новое в старое
           Enc_state |= PORTB&(0x03);                      //Проверяем входные линии
                                     
           switch (Enc_state & 0x0F)
             {

               case 0b0001 : 
               case 0b0111 : 
               case 0b1110 : 
               case 0b1000 : Count--;
                           break;

               case 0b0010 : 
               case 0b0100 : 
               case 0b1101 : 
               case 0b1011 : Count++;
                           break;
               default:
                           break;
             } 

          if (Count == 8)              // Если был шаг энкодера влево
             {
                ..............         // то действие А 
                Count = 4;
             }

          else if (Count == 0)         // Если был шаг энкодера вправо
             {
                ..............         // то действие Б
                Count = 4;
             }

 

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...