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

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


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

На AVR вполне можно записать команды во флеш и выполнить оттуда. Или написать интерпретатор.

stm32 вполне умеет выполнять код из ОЗУ.

Про другие контроллеры сказать ничего не могу.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

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

спасибо за ответ

расскажите как можно программно при работающем контроллере произвести запись во флеш на авр,  и стереть можно потом эту область?

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

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

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

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

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

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

@ttt222 вы собираетесь вводить исполняемый код с помощью кнопок?

 

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

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

4 часа назад, ttt222 сказал:

расскажите как можно программно при работающем контроллере произвести запись во флеш на авр,  и стереть можно потом эту область?

man bootloader

Собственно и статей на эту тему полно, и в Евстифееве вопрос освещался.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

1 час назад, Григорий Т. сказал:

собираетесь вводить исполняемый код с помощью кнопок?

именно.

хочу собрать тренажер для развития внимательности и концентрации

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

Для этого надо выбрать микроконтроллер с внешней памятью программ. АВР такие если и есть, то весьма дорогие.

Вы собираетесь в ручную вводить коды для исполняемой программы? С быстродействием это как-то не согласуется... сложную программу заманаешься вводить, и данных много не введёшь. Проще написать для контроллера прошивку с интерпретатором некой виртуальной машины, и пусть выполняет команды из ОЗУ.

В целом для AVR довольно проблематично изменять программу во флеше, да ещё произвольно - стирать память можно только постранично, да и записать можно только с области бутлоадера.

Учение - изучение правил. Опыт - изучение исключений.

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

Помогите разобраться. Вот код считывания данных с тача.

void Get_Touch_xy( volatile uint16_t *x_kor,volatile uint16_t *y_kor)
{	
	volatile uint16_t touch_x = 0;
	volatile uint16_t touch_y = 0;
	
		
		bit_res(TFT_PORT,T_CS);//активируем чип тачскрина
		SPI_Speed_touch;
		Spi_Master_Transmit(chx);
		Spi_Master_Transmit(0X00);
		touch_x = SPDR;
		touch_x <<= 8;
		Spi_Master_Transmit(0X00);
		touch_x |= SPDR;
		touch_x >>= 7;//3-12бит,7-8бит
		//_delay_us(100);
		Spi_Master_Transmit(chy);
		
		Spi_Master_Transmit(0X00);
		touch_y = SPDR;
		touch_y <<= 8;
		
		Spi_Master_Transmit(0X00);
		touch_y |= SPDR;
		touch_y >>= 7;//3-12бит,7-8бит
		*x_kor = touch_x;
		*y_kor = touch_y; 
		bit_set(TFT_PORT,T_CS);//отключаем чип
}
//считываем данные и посылаем на экран
int main(void)
{
	volatile uint16_t touch_kor_x= 0;//координата х
	volatile uint16_t touch_kor_y= 0;//координата y
	//volatile uint8_t touch_kor_x= 0;//координата х
	//volatile uint8_t touch_kor_y= 0;//координата y
		
		if(!(PIND & (1<<T_IRQ)))
		{
			//Get_Touch_xy((uint16_t*)&touch_kor_x, (uint16_t*)&touch_kor_y);
			Get_Touch_xy(&touch_kor_x, &touch_kor_y);
			TFT_Cifra(32,0,RED,WHITE,(touch_kor_x/100)%10,2);
			TFT_Cifra(48,0,RED,WHITE,(touch_kor_x%100)/10,2);
			TFT_Cifra(64,0,RED,WHITE,touch_kor_x%10,2);
			
			TFT_Cifra(32,16,RED,WHITE,(touch_kor_y/100)%10,2);
			TFT_Cifra(48,16,RED,WHITE,(touch_kor_y%100)/10,2);
			TFT_Cifra(64,16,RED,WHITE,touch_kor_y%10,2);
			TFT_DrawPixel(touch_kor_x,touch_kor_y,BLACK);
			
			
		}
	}

Вот в таком виде все хорошо, но я использую 8-ми битный режим тача и подумал, а нафиг мне тогда touch_kor_x и touch_kor_y типа uint16_t и сделал uint8_t, соответственно поменял строку на Get_Touch_xy((uint16_t*)&touch_kor_x, (uint16_t*)&touch_kor_y); (закоментированная строка) и вот заливаю в железо и нет координаты X одни нули, а Y считывает все норм

меняю тупо местами переменные вот так 

volatile uint8_t touch_kor_y= 0;//координата y
 volatile uint8_t touch_kor_x= 0;//координата х

заливаю в железо и о чудо все работает. В чем чудо? не пойму. Проект в AtmelStudio v6.2. 

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

Функция опроса у вас ожидает указатели на uint16_t, а вы в неё пихаете указатели на uint8_t. Так нельзя.

Если уж так хочется рискнуть и оптимизировать код, то и в функции опроса тача надо все менять.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

3 минуты назад, ARV сказал:

Функция опроса у вас ожидает указатели на uint16_t, а вы в неё пихаете указатели на uint8_t. Так нельзя.

Если уж так хочется рискнуть и оптимизировать код, то и в функции опроса тача надо все менять.

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

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

Только что, Demonrostov сказал:

Ну почему же нельзя, я же в функцию передаю адрес переменной, какая разница функцие что по этому адресу однобайтное значение или двух

А подумать - не ваш метод? Переменная однобайтовая, вы передаете её адрес в функцию, которая по этому адресу намерена записать двухбайтовое значение... Что будет?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Хорошо, а если сделаем так

*x_kor = (uint8_t)touch_x;
 *y_kor = (uint8_t)touch_y;

Скажем что это один байт и запишем по адресу *x_kor? так правильно? Я еще учусь.

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

Только что, Demonrostov сказал:

Скажем что это один байт и запишем по адресу *x_kor? так правильно?

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

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, ARV сказал:

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

Почему когда я меняю последовательность переменных(писал выше) все работает?

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

Вы хотите, чтобы я вам подсказал, как сделать правильно, или чтобы угадал, почему у вас вышло чудо? Гадать я не обучен... Хотите - смотрите в ассемблерный листинг и разбирайтесь, что там у вас вышло. Все баги до поры до времени не дают о себе знать... но дадут обязательно!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, ARV сказал:

Вы хотите, чтобы я вам подсказал, как сделать правильно, или чтобы угадал, почему у вас вышло чудо? Гадать я не обучен... Хотите - смотрите в ассемблерный листинг и разбирайтесь, что там у вас вышло. Все баги до поры до времени не дают о себе знать... но дадут обязательно!

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

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

И в студии все так, как в железе. Неправильная программа не всегда работает неправильно, но всегда остается неправильной :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

15 минут назад, Demonrostov сказал:

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

Сделал вот так

(*(uint8_t*)x_kor) = (uint8_t)touch_x;
(*(uint8_t*)y_kor) = (uint8_t)touch_y;

работает.  Правильно я думаю, что типа компилятор в x_kor лежит адрес восьмибитного значения, возьми восемь бит от touch_x и помести по адресу x_kor?

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

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

Сделал вот так

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

Вы взяли указатель на 16-бит, заставили компилятор думать, что он на самом деле на 8 бит... ну не разунее ли было сразу объявить указатель на 8 бит и не парить мозг себе и компилятору?!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Цитата

Почему когда я меняю последовательность переменных(писал выше) все работает?

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

Учение - изучение правил. Опыт - изучение исключений.

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

В 02.11.2017 в 20:27, ARV сказал:

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

Вы взяли указатель на 16-бит, заставили компилятор думать, что он на самом деле на 8 бит... ну не разунее ли было сразу объявить указатель на 8 бит и не парить мозг себе и компилятору?!

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

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

9 минут назад, Demonrostov сказал:

интересно и поучительно посмотреть на ваш код

Я вам уже несколько раз намекал: перепоределите типы везде.

void Get_Touch_xy( volatile uint16_t *x_kor,volatile uint16_t *y_kor){
// это ваш вариант: x_kor и y_kor - это указатели на uint16_t
}

void Get_Touch_xy( volatile uint8_t *x_kor,volatile uint8_t *y_kor){
// это предлагаемый вариант: оба указателя на uint8_t
}

Если указатель на uint8_t, то при его разыменовании уже не надо ничего приводить принудительно к этому типу

/* ВЫЧЕРКИВАЕМ
(*(uint8_t*)x_kor) = (uint8_t)touch_x;
(*(uint8_t*)y_kor) = (uint8_t)touch_y;
*/

*x_kor = touch_x;
*y_kor = touch_y;

Но я тек же вам не раз намекал, что могут возникнуть еще проблемы

В 02.11.2017 в 17:42, ARV сказал:

если хочется рискнуть и

Дело в том, что меняя тип переменных мы рискуем нарваться на их переполнение. Но если вам так уж хочется - отследите этот момент самостоятельно.

Кстати, почему у вас и в параметрах функции, и за ее пределами переменные-координаты вдруг volatile? Я не вижу причин для этого, может, объясните?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 минуту назад, ARV сказал:

Я вам уже несколько раз намекал: перепоределите типы везде.


void Get_Touch_xy( volatile uint16_t *x_kor,volatile uint16_t *y_kor){
// это ваш вариант: x_kor и y_kor - это указатели на uint16_t
}

void Get_Touch_xy( volatile uint8_t *x_kor,volatile uint8_t *y_kor){
// это предлагаемый вариант: оба указателя на uint8_t
}

Если указатель на uint8_t, то при его разыменовании уже не надо ничего приводить принудительно к этому типу


/* ВЫЧЕРКИВАЕМ
(*(uint8_t*)x_kor) = (uint8_t)touch_x;
(*(uint8_t*)y_kor) = (uint8_t)touch_y;
*/

*x_kor = touch_x;
*y_kor = touch_y;

Но я тек же вам не раз намекал, что могут возникнуть еще проблемы

Дело в том, что меняя тип переменных мы рискуем нарваться на их переполнение. Но если вам так уж хочется - отследите этот момент самостоятельно.

Кстати, почему у вас и в параметрах функции, и за ее пределами переменные-координаты вдруг volatile? Я не вижу причин для этого, может, объясните?

Объяснить не могу, код нашел на просторах интернета. 

делал именно так, студия ругается Error    1    conflicting types for 'Get_Touch_xy'   

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

Только что, Demonrostov сказал:

студия ругается Error    1    conflicting types for 'Get_Touch_xy'

Ну так советам надо либо следовать буквально, либо не следовать вообще. Найдите ВСЕ объявления вашей функции, и ВО ВСЕХ местах замените типы. Ну и обращайте внимание на то, адреса каких именно переменных вы ей потом будете передавать - могут быть и варнинги о несовпадении типа указателя...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

3 минуты назад, ARV сказал:

Ну так советам надо либо следовать буквально, либо не следовать вообще. Найдите ВСЕ объявления вашей функции, и ВО ВСЕХ местах замените типы. Ну и обращайте внимание на то, адреса каких именно переменных вы ей потом будете передавать - могут быть и варнинги о несовпадении типа указателя...

Вот я хреновый отоларинголог))), этот вариант я пробовал несколько раз, из головы вылетело, что в header file надо исправить. Спасибо. Все гуд!

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

привет

скажите с какой скоростью фронты на выводах у  AVR формируются?  не нашел где бы это посмотреть. чему она равна, тактовой частоте? или нет?

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Monica Хорошие вопрос для начинающего! Вот несколько основных радиокомпонентов, которые я бы рекомендовал новичку: Резисторы - это базовый пассивный компонент, который используется для регулировки тока и напряжения в цепи. Выберите набор резисторов с разными номиналами сопротивления. Конденсаторы - еще один основной пассивный компонент, используемый для фильтрации, развязки и других применений. Рассмотрите электролитические, керамические и пленочные конденсаторы. Светодиоды - это простые и полезные активные компоненты, которые можно использовать для индикации и простых схем. Транзисторы - эти активные компоненты являются основой многих электронных схем. Я бы посоветовал начать с биполярных транзисторов. Микроконтроллеры - миниатюрные программируемые компьютеры, которые дают начинающим большие возможности для творчества и экспериментов. Также очень полезно иметь базовые инструменты, такие как мультиметр, паяльник и припой. Начните с этих основных компонентов и постепенно расширяйте свою коллекцию по мере роста знаний и интересов. Желаю успехов в ваших электронных проектах!
    • А, вы такую штуку пытались в спять обернуть ))  
    • Как озвучили выше - мультиметр (это как глаза и уши) , паяльник или паяльная станция - ее конечно для серьёзного применения, осциллограф. А все там резисторы, конденсаторы, диоды, транзисторы, микросхемы - всё это по мере необходимости, а то будут лежать" мертвым грузом" - много лет без применения. 
    • Обычный кольцевой ...этот ещё с хорошим распределением ! У меня есть ещё один который реально способен ЭДС вырабатывать ... (типа с одного полюса) ;-)   Перекошенный насмерть! Когда их ставят в динамики то провалы не имеют большого значения т.к. в центре такой конструкции расположен керн из магнитомягкой стали , что и выравнивает общую характеристику МП . А вообще какая разница что крутить ?  ;-)  Диск куда безопаснее , а надёжность сьёма - индукционной катухой ...тогда и щйётки сами по себе не нужны ... Вообщем с этим "униполяром " - сплошная лапша с макаронами на ушах студентов ....;-) Вот вырезка из учебника : Как мотор - устройство работает за счёт взаимодействия магнитным полей (на рисунке , конечно - никак не указано) Как генератор - таки нет !  Но утверждается , что таки-ДА ...опятьже никаких доказательств не приводится ... ;-) Ну и ляд с ним! Мне хватило одного разрыва ! ;-) На втором снимке - амплитуда от работы такого шума около 0,3вольт,  сигнал положительный , однако к практике такие уровни и нах никому не нужны ....а так в теории конечно -ДА !  Но есть одна загигулина - применялось ПОЛНОЕ покрытие полюса магнита диском. В таком эксе полно всяких интересных проявлений индукции и одно самое главное - это НЕ униполяр по Фарадею , а работа ИНДУКЦИИ при неполном покрытии диска магнитным полем.... Другая песня !  Однако - НЕ НУНО крутить магнит!! Вон у людей обычный диск из камня разрывало!  Я когдато накие диски пропитывал эпоксидкой и они работали вплоть по почти полного износа камня (конечно и бытовка была обычная -1200 об/мин)
    • Для этого хоть бы знать что за датчик. А так из Wireshark выгрузить в CSV а потом Exel уже.
    • А че за магнит то, с торсионными синфазно-поперечными полями?  Дураков много, а стиралок выпущено еще больше, на всех хватит.
  • Похожий контент

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