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

Помогите студенту-чайнику по МК


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

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

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

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

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

Вот эту функцию изменил. И она сейчас выполняется в вечном цикле.

void indication_func()
{
 if(flags_led==0)
 {
	  if (temp1>99)
	  {
	    temp1-=100;
	    temp_lcd3++;
	  }
	  else if (temp1>9 && temp1<100)
	  {
	    temp1-=10;
	    temp_lcd2++;
	  }
	  else if (temp1<10 && temp1!=0)
	  {
	    temp1--;
	    temp_lcd1++;
	  }
	  else if(temp1==0) flags_led=1;
 }
  else
  {
   if(temp<10)
   {
	  led_buff[1]=led_table[temp_lcd1];
	  led_buff[2]=led_table[10];
	  led_buff[3]=led_table[10];
   }
   else if(temp>9 && temp<100)
   {
	  led_buff[2]=led_table[temp_lcd1];
	  led_buff[1]=led_table[temp_lcd2];
	  led_buff[3]=led_table[10];
   }
   else if(temp>99)
   {
	  led_buff[3]=led_table[temp_lcd1];
	  led_buff[2]=led_table[temp_lcd2];
	  led_buff[1]=led_table[temp_lcd3];
   }

	 temp1 = temp;
	 flags_led=0;
	 temp_lcd1=temp_lcd2=temp_lcd3=0;
  }
}

А раньше была такая функция:

void indication_func()
{
    temp1 = temp;
   if (temp1<10)
	  {
	   led_buff[3]=led_table[10]; //Заполняем буфер разрядов
	   led_buff[2]=led_table[10];
	   led_buff[1]=led_table[temp];
	  }
	   if (temp1>9 && temp1<100)
	  {
	   led_buff[3]=led_table[10]; //Заполняем буфер разрядов
	   led_buff[2]=led_table[temp%10];
		 temp=temp/10;
	   led_buff[1]=led_table[temp%10];
	  }
	   if (temp1>99 && temp1<1000)
	  {
	   led_buff[3]=led_table[temp%10]; //Заполняем буфер разрядов
	   temp=temp/10;
	   led_buff[2]=led_table[temp%10];
	   temp=temp/10;
	   led_buff[1]=led_table[temp%10];
	  }
}

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

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

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

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

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

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

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

У тебя имеются глобальные переменные temp и temp1... за ними не уследить. если они у тебя где-то в прерываниях задействованы - ховайся.

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

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

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

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

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

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

у тебя имеется аппаратная причина глюков.

До изменения функции такого не было.

temp и temp1... за ними не уследить.

А можно подробнее?

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

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

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

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

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

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

Хм, я всегда старался переменные которые используются в нескольких функциях объявлять глобальными...

а будет ли корректно работать если я объявлю их локально в функции?

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

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

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

Ведь тогда очень легко проверить работу процедуры вне программы.

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

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

Здесь это не причем к сожалению...

У меня железяка не адекватно работает от такой функции:

void indication_func()
{
	 if(flags_led==0)
	 {
			  if (temp1>99)
			  {
				    temp1-=100;
				    temp_lcd3++;
			  }
			  else if (temp1>9 && temp1<100)
			  {
				    temp1-=10;
				    temp_lcd2++;
			  }
			  else if (temp1<10 && temp1!=0)
			  {
				    temp1--;
				    temp_lcd1++;
			  }
			  else if(temp1==0) flags_led=1;
	 }
	  else
	  {
	   if(temp<10)
	   {
			  led_buff[1]=led_table[temp_lcd1];
			  led_buff[2]=led_table[10];
			  led_buff[3]=led_table[10];
	   }
	   else if(temp>9 && temp<100)
	   {
			  led_buff[2]=led_table[temp_lcd1];
			  led_buff[1]=led_table[temp_lcd2];
			  led_buff[3]=led_table[10];
	   }
	   else if(temp>99)
	   {
			  led_buff[3]=led_table[temp_lcd1];
			  led_buff[2]=led_table[temp_lcd2];
			  led_buff[1]=led_table[temp_lcd3];
	   }

			 temp1 = temp;
			 flags_led=0;
			 temp_lcd1=temp_lcd2=temp_lcd3=0;
	  }
}

и нормально работает от такой:

void indication_func()
{
	   temp1 = temp;

	   temp_lcd1=temp_lcd2=temp_lcd3=0;
	  while (temp1>99)
	  {
	    temp1-=100;
	    temp_lcd3++;
	  }
	  while (temp1>9)
	  {
	    temp1-=10;
	    temp_lcd2++;
	  }
	  while (temp1<10 && temp1!=0)
	  {
	    temp1--;
	    temp_lcd1++;
	  }
   if(temp<10)
   {
	  led_buff[1]=led_table[temp_lcd1];
	  led_buff[2]=led_table[10];
	  led_buff[3]=led_table[10];
   }
   else if(temp>9 && temp<100)
   {
	  led_buff[2]=led_table[temp_lcd1];
	  led_buff[1]=led_table[temp_lcd2];
	  led_buff[3]=led_table[10];
   }
   else if(temp>99)
   {
	  led_buff[3]=led_table[temp_lcd1];
	  led_buff[2]=led_table[temp_lcd2];
	  led_buff[1]=led_table[temp_lcd3];
   }

}

А ведь первый код в симуляторе замечательно работает. И в реале обязан работать! Но к сожалению в ПИКе не работает.

Я обязательно его попробую на АВР в прерывание загнать.

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

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

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

  • 1 месяц спустя...

Помогите определиться с контроллером. Хочу собрать модель коптера, и нужен не очень сложный контроллер.

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

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

Если есть опыт работы с контроллерами - попробуйте на том что знаете, если нет - начните с чего попроще, с налету коптер не осилить.

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

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

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

на мк много устройств и кроме часов

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

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

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

  • 2 недели спустя...

Любой подходящий по требованиям флеш , быстродействие , периферия.

Я бы взял AVR AtmegaXX AttinyXXXX

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

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

  • 5 месяцев спустя...

Здравствуйте!

Подскажите, как сделать усреднение показаний АЦП в этом коде (замерить 30 отсчетов, сложить, разделить на 30, среднее вывести на экран). Заранее спасибо.

static unsigned char tmp_data=0;

ADMUX=0; // Определение канала АЦП

ADCSRA |= 0x40; // вкл АЦП

while((ADCSRA&0x10) == 0); // ожидание преобразования

ADCSRA |= 0x10; // сброс флага

data = ADCW;

V = (float) data*0.0048828125;

sprintf(string, " %1.2f ",V);

lcd_gotoxy(2,tmp_data);

lcd_puts(string);

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

Легко! Накапливаешь считанные данные в переменную большого размера и делишь потом ее на число сколько раз прочитал из АЦП в переменную.

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

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

я пока еще в коде не могу указать чтоб считывала данные. Код для АЦП научился писать, переменную я понял как сделать, а вот как в коде написать чтоб она начала отсчеты?

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

Небольшое замечание по вашему коду:

static unsigned char tmp_data=0;
...
data = ADCW;

Вы в байтовую переменную запихиваете слово. Возможна ошибка, если вы конечно не взвели ADLAR в настройках.

Возможно и я ошибся - не вижу объявления переменной data.

И интереснее делить на 32, машина-то двоичная. Т.е. деление будет просто сдвигом вправо на 5.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

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

переменную data я в начале объявлял

...

int data;

float V;

...

В протеусе все работает.

А вот как и где это в мой код внести 32 отсчета и сдвиг на 5?

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

переменная data, счетчик, результат;

по прерыванию АЦП(){

data+= АЦП;

счетчик++;

если сложили достаточное количество измерений (например, счетчик==32){

результат = data / счетчик;

data=0;

}

}

///////////////

Примерно такой псевдокод. В нормальный код превратить несложно. Как и оптимизировать под 8-битный контроллер.

Еще стоит обратить внимание что data и счетчик нужны только внутри обработчика прерывания, можно их там и объявить, с модификатором static, разумеется. А вот результат должен изменяться в прерывании, но быть доступным откуда угодно, то есть volatile.

Изменено пользователем COKPOWEHEU

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

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

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

  • 2 месяца спустя...

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

с АЦП микроконтроллера разобраться не могу, на одном входе висит термодатчик для измерения температуры(где U0 это ACP0)

ntc_a.png

Не знаю можно ли использовать другие входы АЦП для решения моей задачи?

спасибо

p.s мк avr mega

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

например преобразование кода в двоичный и 6 выходов на микроконтроллер
Внешний АЦП что ли? Или многопозиционный переключатель.
с АЦП микроконтроллера разобраться не могу, на одном входе висит термодатчик для измерения температуры(где U0 это ACP0)Не знаю можно ли использовать другие входы АЦП для решения моей задачи?
Посмотрите в сторону встроенного мультиплексора и регистра ADMUX. встроенный АЦП довольно быстрый: рекомендуемая тактовая частота 150кГц-200кГц, где-то 15 тактов на преобразование (округлил в большую сторону для простоты), то есть минимум 10000 выборок в секунду. Даже если усреднять, даже если вставлять холостые измерения, скорости хватит.
p.s мк avr mega
А поконкретнее? АЦП даже не во всех мегах есть (8515 например).

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

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

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

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

а "напишите за меня прогу" это в раздел работа с указанием размера вознаграждения, я понятно излагаю?

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

$regfile = "89c1051.dat"

On Int1 Int1_int

Enable Interrupts

Enable Int1

Tcon.2 = 1

P3.2 = 1

Do

nop

Loop

End

Rem The Interrupt Handler For The Int1 Interrupt

Int1_int:

P3 = P3 Xor 4

Return

преподователь говорит "синтаксически неполный, работать не будет"

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

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

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

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

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

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

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

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

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

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

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

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