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

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


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

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

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

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

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

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

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

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

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

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

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

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

void pr(void)			 // Проверка пина один
{
x=~(PIND);		 // Если кнопка нажата,икс будет равен единице

}

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

void vkl1s(void)
{
/*Первая лампа*/


if (y==0)
 {
PORTB=0b00000001;
set1;
unset1;
y++;
_delay_ms(t);
 }

/*Вторая лампа*/


pr();
if (x==1)
{
if (y==1)			 // Если первая лампа включена
{

PORTB=0b00000011;
set1;
unset1;
y++;
_delay_ms(t);
}
}
else
{
return;
}

/*Третья лампа*/


pr();
if (x==1)
{
if (y==2)
{

PORTB=0b00000111;
set1;
unset1;
y++;
_delay_ms(t);
}
}
else
{
return;
}

/*Четвертая лампа*/

pr();
if (x==1)
{
if (y==3)
{

PORTB=0b00001111;
set1;
unset1;
y++;
_delay_ms(t);
}
}
else
{
return;
}

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

BiBOX, у Вас функция pr() объявлена до того как Вы ее вызываете? Или после? Компилятор выдает ошибку или предупреждение?

P.S. Зачем Вам функция если в ней всего лишь одно действие?

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

Объявлена до и выдает предупреждение.Прога работает,просто интересно разобраться.

void pr(void)			 // Проверка пина один
{
x=~(PIND);		   // Если кнопка нажата,икс будет равен единице

}
int main(void)
{
DDRD=0;
PORTD=255;
DDRB=255;
DDRC=255;
PORTB=0;
PORTC=0;

   while(1)
   {
pr();			  // Проверка кнопки
 if (x==1)
 {

 vkl1s();

Макрос не стал делать,так как хотел разобраться с оператором return

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

/*

*/
#define set1 PORTC|=(1<<PC0);
#define unset1 PORTC&=~(1<<PC0);
#define set2 PORTC|=(1<<PC1);
#define unset2 PORTC&=~(1<<PC1);
#define set3 PORTC|=(1<<PC2);
#define unset3 PORTC&=~(1<<PC2);
#define set4 PORTC|=(1<<PC3);
#define unset4 PORTC&=~(1<<PC3);
#define t 250
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
volatile unsigned char x;     // Состояние кнопки
volatile unsigned char y;     // Счетчик включения или отключения
volatile unsigned char z;
void vkl1s(void)
{ 
/*Первая лампа*/


  if (y==0)
       {
  PORTB=0b00000001;
  set1;
  unset1;
  y++;
  _delay_ms(t);
       }

 /*Вторая лампа*/


pr();
if (x==1)
{
 if (y==1)             // Если первая лампа включена
 {

 PORTB=0b00000011;
 set1;
 unset1;
 y++;
 _delay_ms(t);
 }
}
else
{
 return;
}

/*Третья лампа*/


 pr();
 if (x==1)
 {
  if (y==2)
  {

   PORTB=0b00000111;
   set1;
   unset1;
   y++;
   _delay_ms(t);
  }
 }
 else
 {
  return;
 }

 /*Четвертая лампа*/

 pr();
 if (x==1)
 {
  if (y==3)
  {

   PORTB=0b00001111;
   set1;
   unset1;
   y++;
   _delay_ms(t);
  }
 }
 else
 {
  return;
 }

 /*Пятая лампа*/

  pr();
  if (x==1)
  {
   if (y==4)
   {

    PORTB=0b00011111;
    set1;
    unset1;
    y++;
    _delay_ms(t);
   }
  }
  else
  {
   return;
  }

  /*Шестая лампа*/

    pr();
    if (x==1)
    {
     if (y==5)
     {

      PORTB=0b00111111;
      set1;
      unset1;
      y++;
      _delay_ms(t);
     }
    }
    else
    {
     return;
    }

    /*Седьмая лампа*/

      pr();
      if (x==1)
      {
       if (y==6)
       {

        PORTB=0b01111111;
        set1;
        unset1;
        y++;
        _delay_ms(t);
       }
      }
      else
      {
       return;
      }

      /*Восьмая лампа*/

        pr();
        if (x==1)
        {
         if (y==7)
         {

          PORTB=0b11111111;
          set1;
          unset1;
          y++;
          _delay_ms(t);
         }
        }
        else
        {
         return;
        }

}
void vkl2s(void)
{
PORTB=0b00000001;
set2;
unset2;
_delay_ms(t);
PORTB=0b00000011;
set2;
unset2;
_delay_ms(t);
PORTB=0b00000111;
set2;
unset2;
_delay_ms(t);
PORTB=0b00001111;
set2;
unset2;
_delay_ms(t);
PORTB=0b00011111;
set2;
unset2;
_delay_ms(t);
PORTB=0b00111111;
set2;
unset2;
_delay_ms(t);
PORTB=0b01111111;
set2;
unset2;
_delay_ms(t);
PORTB=255;
set2;
unset2;
_delay_ms(t);
}
void vkl3s(void)
{

PORTB=0b00000001;
set3;
unset3;
_delay_ms(t);
PORTB=0b00000011;
set3;
unset3;
_delay_ms(t);
PORTB=0b00000111;
set3;
unset3;
_delay_ms(t);
PORTB=0b00001111;
set3;
unset3;
_delay_ms(t);
PORTB=0b00011111;
set3;
unset3;
_delay_ms(t);
PORTB=0b00111111;
set3;
unset3;
_delay_ms(t);
PORTB=0b01111111;
set3;
unset3;
_delay_ms(t);
PORTB=255;
set3;
unset3;
_delay_ms(t);
}
void vkl4s(void)
{
PORTB=0b00000001;
set4;
unset4;
_delay_ms(t);
y++;
pr();              // Проверка кнопки
if (x==1)
{
 PORTB=0b00000011;
 set4;
 unset4;
 _delay_ms(t);
 y++;
}
else
{
 return;
}

PORTB=0b00000111;
set4;
unset4;
_delay_ms(t);
PORTB=0b00001111;
set4;
unset4;
_delay_ms(t);
PORTB=0b00011111;
set4;
unset4;
_delay_ms(t);
PORTB=0b00111111;
set4;
unset4;
_delay_ms(t);
}
void pr(void)             // Проверка пина один
{
x=~(PIND);           // Если кнопка нажата,икс будет равен единице

}
int main(void)
{
DDRD=0;
PORTD=255;
DDRB=255;
DDRC=255;
PORTB=0;
PORTC=0;

   while(1)
   {
pr();              // Проверка кнопки
 if (x==1)
 {

    vkl1s();
// vkl2s();
// vkl3s();
// vkl4s();
 //  while(1)
  // {

  // }
 }
   }
}

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

BiBOX, вот теперь понятней! У Вас функция vkl1s(void) вызывается функцию pr(void), а она объявлена ниже! Перенесите функцию pr(void) вверх кода( сразу после объявления переменных) и предупреждение должно исчезнуть ;)

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

Я же давал ссылку... правда на английском.

You are using a function for which the compiler has not seen a declaration ("prototype") yet.

For example:

int main()

{

fun(2, "21"); /* The compiler has not seen the declaration. */

return 0;

}

int fun(int x, char *p)

{

/* ... */

}

You need to declare your function before main, like this, either directly or in a header:

int fun(int x, char *p);

Ну ладно переведу:

Вы используете функцию, для которой компилятор еще не видел объявление ("прототип"). Например:

int main()

{

fun(2, "21"); /* Компилятор не видит объявление. */

return 0;

}

int fun(int x, char *p)

{

/* ... */

}

Вы должны объявить свою функцию прежде основной, как это, или непосредственно или в заголовке:

int fun(int x, char *p);

Синтаксис языка так сказать ;)

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

В студии 6 ваш код, который выше. Откомпилился нормально

По пятницам мы с коллегой мучаем старые платы (ненужные или не рабочие). Они либо горят либо взрываются.

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

А можно было объявить прототип функции. Написать сразу после инклюдов void pr();

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

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

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

Да , порядок надо соблюдать , я сталкивлся с этим , даже не функции , а забыл написать F_CPU ... , студия на меня матерно отругалась , ну я с перепугу быстро вставил F_CPU 1000000UL , но ниже #include <util/delay.h> , студия опять меня обругала , почесав репу , передвил все насвои места , ))

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

А новая студия не позволяет указать частоту в makefile? AVRStudio4.18 позволяла выставить флаг -DF_CPU=<> Указывать это в начале основного файла - плохая идея.

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

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

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

Скорее всего нет , не позволяет . Сразу в шапке мак файла написано - # Automatically-generated file. Do not edit!

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

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

А если несколько исходных файлов - в каждом указывать? Вот vusb использует константу из makefile (правда он у них свой).

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

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

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

Точно не скажу , по моему достаточно в файле с main . Я собирал термостат на ds18b20 , использовал готовую библиотеку , а она была написана под WinAVR , так там библиотека состояла из кучи файлов , студия по началу очень сильно ругалась , почти страница ерроров и варнингоф , вы мне еще помогали с прогмем , я что бы ни парится навтыкал F_CPU , во все файлы где студия ругалась на F_CPU ))

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

Доброй ночи ! Парни , ни как не могу победить Протеус , вернее его отладчик . Протеус мне всегда подсовывает для отладки один и тот же файл , это файл библиотеки delay.h , перечитал массу форумов , пересмотрел тучу видио , перерыл весь Протеус , но как сделать что бы он показывал нужные мне файлы , так и не сумел . Вот смотрите , всегда одно и тоже

post-187724-0-66668400-1451164225_thumb.jpg

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

В выпадающем списке, где написано тратата/delay.h нет других файлов?

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

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

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

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

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

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

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

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

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

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

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

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

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

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