Страница 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
Академик Иосиф
Нужно было всего лишь подобрать задержку
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.
Re: Arduino
Добавлено: 24 апр 2017, 15:23
FreemanNow
Академик Иосиф, а еще при этом экономить энергию и следить за влажностью и кислородом )
Re: Arduino
Добавлено: 24 апр 2017, 15:29
neutrino
Академик Иосиф писал(а):
Ну почему? Жарко - открыл окно. Холодно - включил топку. И так пока не будет ровно +22.
Что ж, попробуем рассуждать. На примере нагрева воздуха для начала.
Ты выключаешь топку когда воздух ровно +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 писал(а):
Это частный случай. Ты же не будешь, получив задание спроектировать умный дом, предлагать всем переехать к тебе или чаще проветривать?
Есть условие задачи. Нужно решение.
Если кладовку какую топить, то может. Целую квартиру, и уж тем более дом - не по физике как-то.
Re: Arduino
Добавлено: 24 апр 2017, 18:50
neutrino
Академик Иосиф писал(а):
Если кладовку какую топить, то может. Целую квартиру, и уж тем более дом - не по физике как-то.
Зависит от соотношения мощности нагревателя и объема помещения.
Эффект обычный, техническое решение существует, вопрос сформулирован недвусмысленно. Не виляй, ты же не в Политике )))
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;
}
}
Сами символы берутся из отдельного файла, и я ещё не вникал, как они это делают.