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

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


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

18 minutes ago, mosfetx said:

(PIND&(1<<x)

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

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

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

1 hour ago, mosfetx said:

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

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

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

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

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

 

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

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

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

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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 серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

56 minutes ago, pndbr said:

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

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

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

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

 

 

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

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

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

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

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

 

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

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

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

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

 

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

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 пользователей онлайн

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

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