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

Язык СИ для микроконтроллеров


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

18 minutes ago, mosfetx said:

(PIND&(1<<x)

В результате этой операции получится не 1, а тоже сдвинутая на х единица. Поэтому сравнение с просто 1 не работает. Надо сравнивать так

if ((PIND&(1<<x)) ! = 0)

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

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

1 hour ago, mosfetx said:

Хотел опрашивать все 8 пинов. на наличии лог1. так не работает

КМК то шо вы  написали вообще ни как не работает... если пин0=1, будет постоянный инкремент переменной темр и никакого опроса других пинов не будет.

и в выражении PIND&(1<<x) делать сдвиг переменной х , есть тупое бесполезное увеличение размера кода.

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

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

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

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

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

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

переменная x там вообще не нужна. номер пина задает переменная цикла i.

 

Мудрость приходит вместе с импотенцией...

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

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

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


 

Quote

#define  F_CPU  8000000UL
#define BUT4H PB0
#define BUT4L PB1
#define MODE4H (~(PINB&(1<<2))&&~(PINB&(1<<3)))//  проверка на минус на 23
#define MODE4L (~(PINB&(1<<4))&&~(PINB&(1<<5)))//  проверка на минус на 45
#define MODE2H (~(PINB&(1<<3))&&~(PINB&(1<<5)))//  проверка на минус на 35
#define LEFT PB6
#define RIGHT PB7
#define LIGHT4H PD0
#define LIGHT4L PD1
#define ERROR PD2
#define CONTROL4L PD3
#include <avr/io.h>
#include <util/delay.h>

void port_init()
{
    DDRB|=(1<<DDB6)|(1<<DDB7);//OUTPUTS
    DDRB&=~(1<<DDB0)&~(1<<DDB1)&~(1<<DDB2)&~(1<<DDB3)&~(1<<DDB4)&~(1<<DDB5);//INPUTS
    DDRD|=(1<<DDD0)|(1<<DDD1)|(1<<DDD2);//OUTPUT
    DDRD&=~(1<<DDD3);//INPUT
    PORTB&=~(1<<LEFT)&~(1<<RIGHT);//STOP
    PORTB|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
    PORTD|=(1<<LIGHT4H)|(1<<LIGHT4L)|(1<<ERROR);
    PORTD|=(1<<PD3);//
}
void set_to2h()
{
    if(MODE4H)
    {
        do
        {
            PORTB|=(1<<LEFT) ;
        }
        while (MODE2H);
        PORTD|=(1<<LIGHT4H);// ТУШИМ ЛАМПОЧКУ 4HI
    }
    
    else if(MODE4L && ~(PIND&(1<<3))) // ПРОВЕРКА УСЛОВИЯ ВКЛЮЧЕН 4ЛО И ВКЛЮЧЕН РУЧНИК(ПАРКИНГ)
    {
        do
        {
            PORTB|=(1<<LEFT) ;
        }
        while (MODE2H);
        PORTD|=(1<<LIGHT4L);// ТУШИМ ЛАМПОЧКУ 4LO
    }
    else
    {
        PORTD&=~(1<<ERROR)    ;
    }
}

void set_to4h()
{
    if(MODE2H)
    {
        do
        {
            PORTB|=(1<<RIGHT) ;
        }
        while (MODE4H);
        PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4HI
    }
    else if(MODE4L && ~(PIND&(1<<3))) // ПРОВЕРКА УСЛОВИЯ ВКЛЮЧЕН 4ЛО И ВКЛЮЧЕН РУЧНИК(ПАРКИНГ)
    {
        
        do
        {
            PORTB|=(1<<LEFT) ;
        }
        while (MODE4H);
        PORTD|=(1<<LIGHT4L);// ТУШИМ ЛАМПОЧКУ 4LO
        PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4HI
    }
    else
    {
        PORTD&=~(1<<ERROR)    ;
    }
}

void set_to4l()
{
    
     if(MODE2H && ~(PIND&(1<<3))) // проверка включен ли паркинг
    {
        do
        {
            PORTB|=(1<<RIGHT) ;
        }
        while (MODE4L);
        PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4LO
    }
    
    else if(MODE4L && ~(PIND&(1<<3)))
    {
        do
        {
            PORTB|=(1<<RIGHT) ;
        }
        while (MODE4L);
        PORTD|=(1<<LIGHT4H);// ТУШИМ ЛАМПОЧКУ 4H
        PORTD&=~(1<<LIGHT4L);// ЗАЖИГАЕМ ЛАМПОЧКУ 4L
    }
    else
    {
        PORTD&=~(1<<ERROR)    ;
    }
}


void button_read()
{
    
    if(~(PINB&(1<<0)))
    {
        set_to4h();
    }
    else if(~(PINB&(1<<1)))
    set_to4l();
    else
    set_to2h();

}

int main(void)
{
    port_init();
    while (1)
    {
        button_read();
    }
}

пытался вставить как код,но выдает ошибку,видимо плохой код)

прошу Вас указать на критичные ошибки. 

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

спасибо за внимание.

сильно не пинать,только учусь,..)

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

56 minutes ago, pndbr said:

сильно не пинать,только учусь,..)

попробуйте   почитать/посмотреть что такое "конечные автоматы" или "машина состояний"  и как они реализуются . здесь в лекциях 298..305 есть не плохое введение. на ХАБРе есть пару статей по этой теме с примерами реализации.

для начала реализовать ее при помощи оператора swith/case

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

 

 

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

 

#define MODE4H (~(PINB&(1<<2))&&~(PINB&(1<<3)))//  проверка на минус на 23

Например, вот это MODE4H выражение и ему подобные всегда будет равно true при любых значениях PINB.

Я бы проверял вот так:

#define MODE4H !(PINB & (1<<2 | 1<<3)) //  проверка на минус на 23

 

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

6 hours ago, IMXO said:

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

Про подавления дребезга в курсе,,но это я оставил на потом)

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

Спасибо за ссылки и совет и за то что рассмотрели это мракобесие)

 

6 hours ago, Yurkin2015 said:

 


#define MODE4H !(PINB & (1<<2 | 1<<3)) //  проверка на минус на 23

 

Спасибо, а то я ломал голову почему не правильно работала написанная мной конструкция)

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

15 hours ago, Yurkin2015 said:

Я бы проверял вот так:

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

#define MODE4H (!(PINB&(1<<2))&& !(PINB&(1<<3)))//  проверка на минус на 23

 

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

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

Просьба не считать вопрос провоцирующим.

Нужно сотворить программку для несложного промышленного автомата, программа очень похожа на программу для ПЛК, но написать её надо на Си.

Если упрощенно, структура программы выглядит так.

При запуске программы опрашивается галетник на 10 положений,  и программа стартует с метки, указанным этим галетником.

Программа всегда последовательно проходит все шаги начиная с указанного галетником. 

Т.е. если выставили 1, то будут последовательно выполнены шаги с 1 по 10, если выставили 5, то будут исполняться шаги с 5 по 10. 

Назад программа возвращаться не будет никогда, перескакивать через шаги или пропускать их тоже. 

Как то напрашивается в такой ситуации goto. но больно уж си-воды на это goto блажат.

А чем заменить не пойму, ведь ни циклов, ни выбора путей в данном случае нет.

Для эксперимента проверил goto,  работает без замечаний.

 

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

применение goto оправданно только в одном случае - в случае недостаточного знания языка

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

5 минут назад, mail_robot сказал:

применение goto оправданно только в одном случае

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

43 минуты назад, optima сказал:

Попробуй  кейс 

Типа удалить из этого все break?

Оно будет без break работать?

Снимок.JPG

40 минут назад, mail_robot сказал:

goto оправданно только в одном случае - в случае недостаточного знания языка

А вот этого флуда никак нельзя было обойтись?  Не удержался? 

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

18 минут назад, optima сказал:

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

Блок не указывает на выход ни в другую процедуру, ни вообще куда либо. Потому как выходить не надо.

Наверное проще объяснить это применением goto.

If (var == 1) goto label 1;

if (var == 2) goto label 2;

....

if (var == 10) goto label 10;

label 1:

{

;

}

label 2:

{

;

}

....

label 10:

{

;

}

 

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

1 минуту назад, optima сказал:

но после выполнения к примеру label 1: куда далее пойдет 

на label 2:  А после исполнения тела по label2: на label 3:, и так до label 10:  

 

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

Если так? 

 switch(значение выключателя)
                        case 01:    label 1 (); break;
                        case 02:    label 2 (); break;
                        case 03:    label 3 (); break;
                        case 04:    label 4 (); break;
                        case 05:   label 1 (); label 2 (); label 3 (); label 4 (); break;
                         ................
              

Оператор goto

Кроме goto, в языке С есть другие операторы управления (например break, continue), поэтому необходимости в применении goto практически нет. В результате чрезмерного использования операторов goto программа плохо читается, она становится "похожей на спагетти". Чаще всего такими программами недовольна администрация фирм, производящих программный продукт. То есть оператор goto весьма непопулярен, более того, считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto. Но в некоторых случаях его применение все же уместно. Иногда, при умелом использовании, этот оператор может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы

Сергей.

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

это вопрос для пеcочницы

switch (stage)

{

case: 0:

stage++;

break;

case 1

stage++;:

break;
}

можно переходить с любой стадии на любой

switch (stage)

{

case: 0:

case 1

case 2
}

а можно так. Какой stage будет в начале с той и начнет дальше выполнятся все остальные последовательно

Читайте основы Си

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

Точно, даже не задумался что значение можно увеличить!

switch(stage)

                      {
                        case 01:    label 1 (); stage++;
                        case 02:    label 2 (); stage++;
                        case 03:    label 3 (); stage++;
                        case 04:    label 4 (); stage++;
                        case 05:   label 5 ();  break;
                         }

Сергей.

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

Первый вариант понятен, но выглядит громоздким. А во втором очепятки нет?

3 минуты назад, optima сказал:

Точно, даже не задумался

Я правильно понял, что тут придется всю программу на процедуры разбивать? 

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

Хоть я и не хотел в эту тему встряваь, но, поскольку тут стали всякую чушь писать, все-таки вступлю.

switch(galetnik){
  case 0 : 
  	// здесь сколько угодно действий 0-го этапа
    // break НЕ НУЖЕН!
  case 1 : 
  	// здесь сколько угодно действий 1-го этапа
    // break НЕ НУЖЕН!
  case 2 : 
  	// здесь сколько угодно действий 2-го этапа
    // break НЕ НУЖЕН!
  case 3 : 
  	// здесь сколько угодно действий 3-го этапа
    // break НЕ НУЖЕН!
  case 4 : 
  	// здесь сколько угодно действий 4-го этапа
    // break НЕ НУЖЕН!
  case 5 : 
  	// здесь сколько угодно действий 5-го этапа
    // break НЕ НУЖЕН!
  case 6 : 
  	// здесь сколько угодно действий 6-го этапа
    // break НЕ НУЖЕН!
  case 7 : 
  	// здесь сколько угодно действий 7-го этапа
    // break НЕ НУЖЕН!
  case 8 : 
  	// здесь сколько угодно действий 8-го этапа
    // break НЕ НУЖЕН!
  case 9 : 
  	// здесь сколько угодно действий 9-го этапа
    // break НЕ НУЖЕН!
}

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Действий можешь указать сколько угодно, если нужно делать их по порядку тогда в кейсе нужно galetnik++,  и не вписывать break, тогда все кейсы будут выполнятся по порядку, но если инкремента не достаточно тогда galetnik нужно присвоить конкретное значение, зависит от значения galetnik

break прописать только в последней строчке.

То есть если твой переключатель в позиции 5, то и кейсы будут выполнятся с 5 по 9 к примеру

Сергей.

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

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

Тогда получается, что сначала описываем все 10  процедур, а в программе указываем только порядок их исполнения, пользуясь для обеспечения  последовательного их выполнения  инкрементом galetnik. 

ИМХО должно выглядеть неплохо.

Спасибо, буду пробовать этот вариант.

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

2 часа назад, optima сказал:

кейсе нужно galetnik++,  и не вписывать break, тогда все кейсы будут выполнятся по порядку,

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

2 часа назад, optima сказал:

break прописать только в последней строчке

А это ещё нафига?

Нафига огород, если мой вариант выполняет все требуемое: выполняет шаги от galetnik и до последнего?!

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Уже даже нет желания объяснять, что такое двойка и тройка ВК ... Скажу по секрету, это никак не связано с количеством парт транзисторов ВК.
    • @irfpsДоброго А какое напряжение автогена вам необходимо?  в теме про магнитные усилители выкладывал автоген пуш-пул с напряжением запуска 2,2 В с "катушкой зажигания", но потом забросил, остался лишь макет, работает от одного литиевого аккумулятора.  В том случае(с "катушкой зажигания") можно пускать любой автоген при любом напряжении. Успехов
    • Уже который день пытаюсь разобраться с дисплеем. Слишком там как то в коде дисплея запутано. Я ещё разок наверное попробую сделать. Но если не получится, то я откажусь от дисплея и поставлю семисегментные индикаторы и многоцветные светодиоды и буду выводить кое какую информацию так. Ими управлять намного проще. Разве что имя воспроизводимого файла вывести не удастся. Но не велика потеря. Можно ведь просто номер музыки выводить. Всё лучше чем ничего. С самим плеером там всё понятно сложностей не будет точно нужно всего будет уточнить несколько деталей по командам, а то в описаниях не очень понятно. С UART там тоже всё понятно никаких сложностей нет.Но вот с дисплеем какой то затык получается.
    • Приветствую. Ревер запустил, побаловался - ну, такое себе. Не именно качество пружинного ревера, а сама по себе идея эха не понравилась. Зачем? Хорошая гитара с хорошими активными звучками и так звучит отлично. Причем, довольно объемно и без эха. Наваял вот такой девайс для управления ревером по схеме отсюда: https://sound-au.com/project34.htm Схема такая: Данная схема приглянулась тем, что можно отдельно регулировать уровень "чистого" сигнала и добавлять к нему сигнал ревера. Все заработало с первого раза. Если кому-то интересно - выложу мой вариант схемы и печатку сюда. На моей схеме и плате (при помощи джамперов) предусмотрел возможность использования схемы с разными реверами согласно таблице: Данная схема не понравилась тем, что ревер в ней всегда работает "на всю мощь" - регулируется только его громкость. Мне кажется, если схему добавить возможность ограничения усиления перед ревером, то это даст возможность регулировать итенсивность эха. Или нет? Стоит по этому поводу заморочиться и дать схеме еще один шанс? Интерес к данному проекту я потерял, планирую попробовать цифровой ревер. Если кому-то интересно продолжить проект или просто поэкспериментировать - могу поделиться новым ревером и спаянной платой. Советы и замечания по прежнему принимаются - может я не туда копаю? Кстати, сам ревер установлен внутри комбика и совершенно не зависит от его громкости и вибрации корпуса. Как говорили выше. Опробовано на практике. Звук, да - как из консервной банки. Но я еще пока не занимался настройкой схемы и самим ревером.
    • Тут ещё какая штука- сечение от диаметра имеет квадратичную зависимость. Увеличение диаметра в 2 раза даёт увеличение сечения в 4. Поэтому ошибка получается очень большая.  ПЕРЕСЧЁТ ДИАМЕТРА ПРОВОДА НА ПОПЕРЕЧНОЕ СЕЧЕНИЕ.xls
    • Хорошо, если вам хочется называть проценты попугайчиками, то пожалуйста. Но, хотелось бы спросить. Вы всё-таки понимаете разницу между измерением напряжения 1 В с точностью +-0,1% и измерением отношения напряжений Х В и 0,5Х В с такой же точностью? 
  • Похожий контент

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