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

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


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

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

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

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

Кстати, по поводу _delay_ms.

Это просто пустой цикл, а значит - пустая трата времени процессора. Подумайте, как его потратить с умом. Представьте, сколько можно всего полезного делать за эти миллисекунды ( а то и целые секунды ! ) ?

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

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

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

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

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

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

Кстати, по поводу _delay_ms.

Это просто пустой цикл, а значит - пустая трата времени процессора. Подумайте, как его потратить с умом. Представьте, сколько можно всего полезного делать за эти миллисекунды ( а то и целые секунды ! ) ?

А как можно по другому задержки выставлять? Задействовал еще каналы ШИМ (всего 3 получилось) и при симуляции протеуса загрузка процессора МК порядка 88%. Чем это грозит в реальном МК? Переделал немного под себя вот эту библиотеку (свой алгоритм значений RGB)

#include <avr/io.h> //Стандартная библиотека ввода/вывода

#define R_channel OCR1AL //Определяем канал OCR1AL для Красного цвета
#define G_channel OCR1BL //Определяем канал OCR1BL для Зеленого цвета
#define B_channel OCR2 //Определяем канал OCR2 для Синего цвета

#define RGB_pause 2000 //Пауза для задержки

//Программа формирования задержки
void pause (unsigned int a)
{
unsigned int i; //Переменная для задержки
for (i=a;i>0;i--); //Цикл формирования задержки
}

//Программа инициализации ШИМ
void init_pwm (void)
{
//Инициализация порта
DDRB=0x0e; //OC1A,OC1B,OC2 - выхода

TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); //Конфигурация счетчика OC1A
TCCR1B=(1<<CS10); //Конфигурация счетчика OC1B
TCCR2=(1<<CS20)|(1<<COM21)|(1<<WGM20); //Конфигурация счетчика OC2

//Установка начальных значений счетчиков
OCR1AL=0xff; //Соответсвует Красному цвету
OCR1BL=0x00; //Выключен 0
OCR2=0x00; //Выключен 0
}

//Основная программа
int main(void)
{
unsigned char i;

init_pwm(); //Инициализация ШИМ каналов

while (1) //Вечный цикл
{
for(i=0;i<255;i++) //Переход от красного к зеленому
{
R_channel--;
G_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++) //Переход от зеленого к синему
{
G_channel--;
B_channel++;
pause(RGB_pause);
}

for(i=0;i<255;i++)//Переход от синего к красному
{
B_channel--;
R_channel++;
pause(RGB_pause);
}
}
}

Или для этой задачи такая нагрузка на проц норма?

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

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

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

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

Нагрузка на проц всегда будет 100%, он (МК) ПОСТОЯННО что-то выполняет ! Он не может остановиться ! Не считая, конечно, слип-режима.

Я писал не об этом. А о том, что delay_ms - это тупое зацикливание программы на долгое время, которое можно тратить на полезные действия. Вам бы ШИМ менять, или другой ногой дёргать, а нет - идёт задержка. Причём просто тупо пустая и глупая ! И программа не сможет что-то выполнять, пока она не завершиться. По этому она и "глупая" :)

Вот я о чём говорил.

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

Понятно :) мне в принципе и надо такое зацикливание. Тоесть выставились определенные ШИМ сигналы и логические 1 на нужных портах, потом ожидание , снова изменение по придуманному алгоритму и ожидание.... И так по кругу. Это будет управление светодиодными лентами и насосом фонтана садового. Спасибо большое за советы. Они помогли значительно продвинуться в написании задуманного. И еще вопросик, каково максимальное значение у delay_ms ? Если допустим нужны большие задержки минут по 10 как лучше поступить?

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

Если допустим нужны большие задержки минут по 10 как лучше поступить?
Коли "мне в принципе и надо такое зацикливание", тогда в цикле. Типа:

void Delay_Ms(unsigned long val){
while(val--) __delay_ms(1);
}

Вызов:

Delay_Ms(4*60*1000);  // Задержка на 4 минуты

ЗЫ: Но я Вам, если что, такого стиля не советовал. Иначе сейчас меня тут коллеги помидорами закидають :lol:

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

Если допустим нужны большие задержки минут по 10 как лучше поступить?

Тупой способ

void _delay_s(unsigned int time){
for(;i;i--)_delay_ms(1000);//нет, это не черная магия
}

Правильный способ - выделить таймер и по нему вести независимый отсчет времени.

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

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

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

Делаю суточный таймер. И не получается ни как с алгоритмом проверки часов.

if ((hour >= hour_on_1) & (hour <= hour_off_1))
{
 if ((minute >= minute_on_1) && (minute <= minute_off_1))
 {
  OUTPUT_ON;
 }
}

Первый оператор прохожу спокойно, а вот с проверкой минут проблема :umnik2:

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

А почему в первом условии "&", а во втором "&&" ? :)

И в чём конкретно проблема с проверкой ? Условия, на первый взгляд, написаны правильно.

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

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

Проблема в том что в одних сутках есть 24 часа, и проверить в каком месте суток я нахожусь, не проблема. Но минут, то, в каждом часе 60 :umnik2: и тут есть нюанс... Вдумайтесь

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

Что не то то ?

Условие

if ((minute >= minute_on_1) && (minute <= minute_off_1))

нормальное. И при правильных данных должно выполняться.

Говорю же Вам, пройдитесь по-шагово (хотябы в том же протеусе) и посмотрите на данные. Скорее всего именно с ними у Вас проблема. Но мы тут бессильны, ибо это уже - экстрасенсорика.

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

Vitemk, Вы вообще о чём ? У него в условии и так стоит "&&".

Вам нужно второе.
Да и "&" тут тоже подойдёт, ибо побитовое "И" для булевых значений эквивалентно логическому "И".

Ещё раз повторюсь. С условием у него всё в порядке. Если оно не выполняется, значит проблема со значениями переменных !

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

а если взять число 0b00000100 (4)

и поделить его на 2 >>2

то мы получим 0b00000001 (1)

это я напутал или это просто нечестно???

Не знаеш как? Спроси у Google'а !!!

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

Вы вообще о чём ? У него в условии и так стоит "&&".

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

это я напутал

Да напутали.

">>2" означает деление на 4.

Один сдвиг вправо ">>1" - это деление на 2.

Сдвиг влево умножение на 2.

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

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

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

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

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

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

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

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

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

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

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

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