Страница 7 из 12

Re: Arduino

Добавлено: 29 мар 2017, 09:23
Академик Иосиф
neutrino писал(а):
Академик Иосиф писал(а):Появился иной вопрос. У меня в отладчике всё, как надо, а в протеусе не работает. Почему?
"Вычислительная машина делает не то, что вам хочется, а то, что вы ей прикажете" ))
Ты покажи, что именно не работает.
Попытаюсь объяснить.
В основном цикле у меня функция вывода на 7-сегментный индикатор. Настроен таймер, который вызывает прерывание по переполнению. В обработке прерывания идёт счёт количества этих переполнений, проще говоря, секундомер. Настроены соответственно порты на вывод всей этой бодяги на индикатор. В отладчике все биты на порту вывода выставляются правильно, всё работает. В протеусе же на выводах ничего не меняется, на индикаторе тупо светится 0, то есть начальное значение переменной.

Re: Arduino

Добавлено: 29 мар 2017, 12:07
neutrino
Академик Иосиф писал(а): Попытаюсь объяснить.
В основном цикле у меня функция вывода на 7-сегментный индикатор. Настроен таймер, который вызывает прерывание по переполнению. В обработке прерывания идёт счёт количества этих переполнений, проще говоря, секундомер. Настроены соответственно порты на вывод всей этой бодяги на индикатор. В отладчике все биты на порту вывода выставляются правильно, всё работает. В протеусе же на выводах ничего не меняется, на индикаторе тупо светится 0, то есть начальное значение переменной.
Таймеры в Протеусе работают не все. Это я чудом вспомнил, больше 10 лет назад уже было.
Попробуй для Протеуса вот такое решение, но только как пример! Не используй в реальных проектах. Не забывай, что int для AVR 16-битный, то есть 65535 - максимальное значение. И эта... когда просят показать, что не работает, показывай лучше код. Стесняться не надо, просто так быстрее найдем.

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

#define MAX_DLY_CNT 100 //fake timer initial value




void fake_tmr_isr(void)
{
/*
	Your timer interrupt service here
*/
}

int main(void)
{
	unsigned int dly_cnt = MAX_DLY_CNT;

	while(1)
	{
		if(!dly_cnt--)
		{
			dly_cnt = MAX_DLY_CNT;
			fake_tmr_isr();
		}	
	}

	return 0;
}


Re: Arduino

Добавлено: 29 мар 2017, 15:58
Академик Иосиф
neutrino, благодарю. Я бы показал код, но он дома.

Re: Arduino

Добавлено: 29 мар 2017, 16:37
neutrino
Академик Иосиф писал(а):neutrino, благодарю. Я бы показал код, но он дома.
Мы подождем.
Видишь - коллеги с красными от ярости глазами и рычанием рвут зубами программу из 3-х строчек? Здесь ни один баг не укроется )))

Re: Arduino

Добавлено: 16 апр 2017, 16:35
Aml
neutrino писал(а): Работе с их периферией, судя по всему.
Предполагаю, что разработать схему, развести и собрать плату, изучить язык и архитектуру контроллера - для новичка перебор. Увязнет и бросит, тем более - в одиночку и дома, без измерительных приборов. Вопрос в том, дойдет ли человек до уровня, при котором IDE из подспорья превратится в помеху. Это и будет признаком обучения )
Жена сейчас собирается учить студентов программировать Arduino на ассемблере. :)

Re: Arduino

Добавлено: 17 апр 2017, 12:50
neutrino
Aml писал(а): Жена сейчас собирается учить студентов программировать Arduino на ассемблере. :)
Я настойчиво рекомендую для этих целей язык C.
Насилие и глумление над детьми, безусловно, правильная вещь, но помимо понимания принципа вычислений на процессоре, необходим навык функциональной декомпозиции задачи и знание стандартных приемов проектирования. Так они, придя на производство, будут лучше готовы к реальным задачам.
Ассемблер плох еще и тем, что совершенно не задерживается в головах, если на нем не писать постоянно.

Re: Arduino

Добавлено: 18 апр 2017, 21:03
Академик Иосиф
Пытаюсь победить графический дисплей.

Re: Arduino

Добавлено: 18 апр 2017, 21:32
Академик Иосиф
Нужно было всего лишь подобрать задержку :facepalm:

Re: Arduino

Добавлено: 20 апр 2017, 21:10
Академик Иосиф

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

unsigned char string1[] = "cъешь еще этих";
	unsigned char string2[] = "мягких французских";
	unsigned char string3[] = "булок, да выпей";
	unsigned char string4[] = "чаю! @#;%:?*()_+";
	unsigned char string5[] = "СЪЕШЬ ЕЩЕ ЭТИХ";
	unsigned char string6[] = "МЯГКИХ ФРАНЦУЗСКИХ";
	unsigned char string7[] = "БУЛОК, ДА ВЫПЕЙ";
	unsigned char string8[] = "ЧАЮ?[]{}\|/`~";
Икран.jpg
Ну что за нах? :-(

Re: Arduino

Добавлено: 20 апр 2017, 22:43
neutrino
Академик Иосиф писал(а):
Ну что за нах? :-(
Выполняемый код покажи.

Re: Arduino

Добавлено: 21 апр 2017, 00:17
Aml
Я настойчиво рекомендую для этих целей язык C.
Ну, Си сейчас наши студенты на информатике 1-й и 2-й курс изучают. А потом на 3 курсе при знакомстве с микроконтроллерами сначала чуток Ассемблера для понимания работы с внутренней структурой микроконтроллера и реализации простейших программ. А потом привычный им Си для решения более-менее практических задач с тем же микроконтроллером. И вставки Ассемблера для критических фрагментов, где важна максимальная скорость исполнения кода.
Я про ассемблер к тому, что Ардуино является достаточно гибкой платформой, позволяющей пользователю работать с ней на трех уровнях сложности: стандартном ардуиновском IDE, на чистом Си через типовые программы и на ассемблере (для извращенцев или спецов).

Re: Arduino

Добавлено: 21 апр 2017, 09:23
FreemanNow
neutrino писал(а):
Академик Иосиф писал(а):
Ну что за нах? :-(
Выполняемый код покажи.
наверняка в цикле выводится массив string1 с неверно заданной длиной ))

Re: Arduino

Добавлено: 21 апр 2017, 09:41
Академик Иосиф
FreemanNow писал(а): наверняка в цикле выводится массив string1 с неверно заданной длиной ))
Нет, я же проверял. Но код мы теперь увидим не раньше понеделка.

Re: Arduino

Добавлено: 21 апр 2017, 09:48
FreemanNow
Академик Иосиф, да ты интриган)

Re: Arduino

Добавлено: 21 апр 2017, 11:43
John Prick
И вставки Ассемблера для критических фрагментов, где важна максимальная скорость исполнения кода.
Давно уже от них отказываются. Современные компиляторы могут оптимизировать программы в разы лучше самого программиста, а неумелое применение таких вставок может наоборот только всё ухудшить. Правило 80/20 по-прежнему работает (80% времени исполняется 20% кода). И поиск этих 20% задача непростая. Да и ясности при чтении кода эти вставки не добавляют.

Re: Arduino

Добавлено: 21 апр 2017, 13:58
neutrino
FreemanNow писал(а):наверняка в цикле выводится массив string1 с неверно заданной длиной ))
Маловероятно.

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

   unsigned char string1[] = "cъешь еще этих";     //14
   unsigned char string2[] = "мягких французских"; //18 
   unsigned char string3[] = "булок, да выпей";    //15
   unsigned char string4[] = "чаю! @#;%:?*()_+";   //16
   unsigned char string5[] = "СЪЕШЬ ЕЩЕ ЭТИХ";     //14
   unsigned char string6[] = "МЯГКИХ ФРАНЦУЗСКИХ"; //18
   unsigned char string7[] = "БУЛОК, ДА ВЫПЕЙ";    //15
   unsigned char string8[] = "ЧАЮ?[]{}\|/`~";      //13

Я для удобства указал в комментариях к каждой строке количество символов БЕЗ '\0'.

Теперь смотрим, что выводится после сбоя:

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

"cъешь еще "   //10 
"тих."         //4
"мягких фран"  //11
"узских."      //7
Опять-таки, без '\0'.

10+4 = 14 - это sizeof(string1) - 1; 11+7=18 - это sizeof(string2) - 1;
Точка в оригинальном тексте отсутствует, что как бы намекает на то, что она появляется из другой области памяти. Точками часто отображаются непечатаемые символы, но уверенности, что так в данном случае, нет. Скорее всего, молодой человек запутался в значениях счетчиков в цикле вывода строк.


Академик Иосиф
, если ты хочешь быстрой квалифицированной помощи, не стесняйся сразу показывать код. Здесь не Главный, и тем более - не Политика )))), народ адекватный, интересующийся и готовый помочь без насмешек (я на это очень надеюсь). Иначе скорость разработки станет неудовлетворительной, увязнешь.

Re: Arduino

Добавлено: 21 апр 2017, 14:03
neutrino
Aml писал(а): Ну, Си сейчас наши студенты на информатике 1-й и 2-й курс изучают. А потом на 3 курсе при знакомстве с микроконтроллерами сначала чуток Ассемблера для понимания работы с внутренней структурой микроконтроллера и реализации простейших программ. А потом привычный им Си для решения более-менее практических задач с тем же микроконтроллером. И вставки Ассемблера для критических фрагментов, где важна максимальная скорость исполнения кода.
Я про ассемблер к тому, что Ардуино является достаточно гибкой платформой, позволяющей пользователю работать с ней на трех уровнях сложности: стандартном ардуиновском IDE, на чистом Си через типовые программы и на ассемблере (для извращенцев или спецов).
Хорошо, только давайте им азы теории конечный автоматов, а то они, бывает, совсем не врубаются, что же такое программа вообще ) А настоящим извращениям, попади они к нам, научим быстро ))
Новенький, кстати, очень даже хорош )

Re: Arduino

Добавлено: 24 апр 2017, 07:51
barmoglot
neutrino, реализовать умный дом сможешь?

Re: Arduino

Добавлено: 24 апр 2017, 11:06
Академик Иосиф
barmoglot писал(а):neutrino, реализовать умный дом сможешь?
Интересная штука. В теории, мне кажется, это не слишком то и сложно.

Re: Arduino

Добавлено: 24 апр 2017, 11:07
FreemanNow
Академик Иосиф, умный дом для бармаглота это не просто сложно, это непостижимо))

Re: Arduino

Добавлено: 24 апр 2017, 11:41
neutrino
barmoglot писал(а):neutrino, реализовать умный дом сможешь?
К сожалению, нет. Я не занимаюсь крупными системами. Если только отдельный датчик или манипулятор, но их уже много готовых, нет смысла изобретать велосипед.

Re: Arduino

Добавлено: 24 апр 2017, 12:12
neutrino
Академик Иосиф писал(а):
barmoglot писал(а):neutrino, реализовать умный дом сможешь?
Интересная штука. В теории, мне кажется, это не слишком то и сложно.
Это очень обманчивое впечатление. Даже поддержание постоянной температуры воздуха в помещении - непростая задача в теории.

Re: Arduino

Добавлено: 24 апр 2017, 15:20
Академик Иосиф
neutrino писал(а): Это очень обманчивое впечатление. Даже поддержание постоянной температуры воздуха в помещении - непростая задача в теории.
Ну почему? Жарко - открыл окно. Холодно - включил топку. И так пока не будет ровно +22. :nez-nayu:

Re: Arduino

Добавлено: 24 апр 2017, 15:23
FreemanNow
Академик Иосиф, а еще при этом экономить энергию и следить за влажностью и кислородом )

Re: Arduino

Добавлено: 24 апр 2017, 15:29
neutrino
Академик Иосиф писал(а): Ну почему? Жарко - открыл окно. Холодно - включил топку. И так пока не будет ровно +22. :nez-nayu:
Что ж, попробуем рассуждать. На примере нагрева воздуха для начала.
Ты выключаешь топку когда воздух ровно +22, она остывает, продолжая отдавать тепло воздуху, когда остынет полностью, температура станет 24, а то и 25. Что будешь делать?

Re: Arduino

Добавлено: 24 апр 2017, 16:36
Академик Иосиф
neutrino писал(а): Что ж, попробуем рассуждать. На примере нагрева воздуха для начала.
Ты выключаешь топку когда воздух ровно +22, она остывает, продолжая отдавать тепло воздуху, когда остынет полностью, температура станет 24, а то и 25. Что будешь делать?
Вряд ли. Живу ж с котлом, и штоб по инерции нагрело на 2-3 градуса сверху, такого не было никогда и ни разу.

Re: Arduino

Добавлено: 24 апр 2017, 16:45
neutrino
Академик Иосиф писал(а): Вряд ли. Живу ж с котлом, и штоб по инерции нагрело на 2-3 градуса сверху, такого не было никогда и ни разу.
Это частный случай. Ты же не будешь, получив задание спроектировать умный дом, предлагать всем переехать к тебе или чаще проветривать?

Есть условие задачи. Нужно решение.

Re: Arduino

Добавлено: 24 апр 2017, 18:38
Академик Иосиф
neutrino писал(а): Это частный случай. Ты же не будешь, получив задание спроектировать умный дом, предлагать всем переехать к тебе или чаще проветривать?

Есть условие задачи. Нужно решение.
Если кладовку какую топить, то может. Целую квартиру, и уж тем более дом - не по физике как-то. :ne_ne_ne:

Re: Arduino

Добавлено: 24 апр 2017, 18:50
neutrino
Академик Иосиф писал(а): Если кладовку какую топить, то может. Целую квартиру, и уж тем более дом - не по физике как-то. :ne_ne_ne:
Зависит от соотношения мощности нагревателя и объема помещения.

Эффект обычный, техническое решение существует, вопрос сформулирован недвусмысленно. Не виляй, ты же не в Политике )))

Re: Arduino

Добавлено: 24 апр 2017, 18:50
Академик Иосиф
neutrino писал(а): Выполняемый код покажи.
Главная:

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

int main()
{
	unsigned char string1[] = "cъешь еще этих";
	unsigned char string2[] = "мягких французских";
	unsigned char string3[] = "булок, да выпей";
	unsigned char string4[] = "чаю! @#;%:?*()_+";
	unsigned char string5[] = "СЪЕШЬ ЕЩЕ ЭТИХ";
	unsigned char string6[] = "МЯГКИХ ФРАНЦУЗСКИХ";
	unsigned char string7[] = "БУЛОК, ДА ВЫПЕЙ";
	unsigned char string8[] = "ЧАЮ?[]{}\|/`~";


	LCD12864_Init();
	_delay_ms(1);
	LCD12864_Clr();
	_delay_ms(1);
	
	LCD12864_String(0,0,string1,sizeof(string1)-1);
	LCD12864_String(1,0,string2,sizeof(string2)-1);
	LCD12864_String(2,0,string3,sizeof(string3)-1);
	LCD12864_String(3,0,string4,sizeof(string4)-1);
	LCD12864_String(4,0,string5,sizeof(string5)-1);
	LCD12864_String(5,0,string6,sizeof(string6)-1);
	LCD12864_String(6,0,string7,sizeof(string7)-1);
	LCD12864_String(7,0,string8,sizeof(string8)-1);
	while(1);
}
Вывод строки:

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

void LCD12864_String(unsigned char x0,unsigned char y0,char* buffer, unsigned char count)
{
	unsigned char x=x0;
	unsigned char y=y0;
	if((x>8)||(y>127)) return;
	LCD12864_GotoXY(x,y);
	for(unsigned char i=0;i<count;i++)
	{
		LCD12864_Char(x,y+6*i,buffer[i]); // игрэком задаётся интервал меж символами
	}
}
Вывод символа, который используется в выводе строки:

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

void LCD12864_Char(unsigned char x0, unsigned char y0, unsigned char code)
{
	unsigned char x=x0;//0..8 - задаем строку где буква выводится
	unsigned char y=y0;
	if(code<0x80)
		code-=0x20;//установка начала стандартных символов
	else
		code-=0x60;//установка начала русских символов					

	if(CS==0)
	{
		CMD_PORT |= (1<<RST)|(1<<CS2);
		CMD_PORT &= ~(1<<CS1);
	}
	else
	{
		CMD_PORT |= (1<<RST)|(1<<CS1);
		CMD_PORT &= ~(1<<CS2);
	}
	if(x>63 || y>127) return;
	for(unsigned int i=0;i<5;i++) // здесь задаётся ширина символа
	{
		LCD12864_GotoXY(x,y);
		if(i<=4)
		{
			if(MODE==0) LCD12864_Data(symbol[code][i]);  // МОДЕ - если 0, то чёрные символы на белом фоне, если 1 - наоборот
			else LCD12864_Data(~symbol[code][i]);
		}
		
		y+=1;
	}	
}
Сами символы берутся из отдельного файла, и я ещё не вникал, как они это делают.