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

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


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

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.

 

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

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

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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
Ссылка на комментарий
Поделиться на другие сайты

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

56 minutes ago, pndbr said:

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

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

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

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

 

 

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

 

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

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

  • Сообщения

    • Зачем же пугать человека? Он же правильно мыслит. Вопрос чтобы правильно все сделал. Гальванику...
    • Вероятно, в разделе "Работа" вам помогут. При условии предоставления чёткого и недвусмысленного технического задания.
    • Привет кто это еще читает. Знакомый купил в Москве по адекватной цене пару  B615D, дал на диагностику перед уверенной эксплуатацией. Одна сразу в защите, большой динамик спален, усилители на высокоомную нагрузку поют, буду позже разбираться. А вот вроде бы вполне работоспособная не сдюжила и 10 минут на хорошей мощности на плотном прогрессиве. Вылетели ключи в БП и драйвера на MMBTA56. Видно что был в ремонте, возможно ключи оказались палёнкой. Есть мысль впаять вместо FQPF13N50  чуток помощней по току 18N50-e. По параметру Qg аналогичные, а по  Сg будут потяжелей, 2350пф против 1800 у 13н50-х. 
    • Ну так теперь фигня вопрос. Проверить, что кнопки невозможно замкнуть одновременно, да определить, на какой ток транзисторы нужны. По характеристикам мотора или по максимально-допустимому току диодов D1-D4. Навскидку, моторчик низковольтный, диоды тоже. Транзисторы тогда на PBSS4350 можно заменить. Они на Али почти задаром продаются.
    • Сами же понимаете, что так не может быть. Или нет "сквозняка", или схема неправильно собрана, элементы не те, битые и пр., и схема защиты не работает. Проверьте сначала работу защёлки защиты при питании от 15 В, отпаяв R19 и подавая туда медленно увеличивающееся напряжение до 1,5 - 2 В (можно с потенциометра ом на 100-500). Добейтесь, чтобы работала. Порог срабатывания измерьте. Пересчитайте в ток через резистор 0,1 Ом. Соответствует ли "правильному"? Проверьте, что у этого резистора сопротивление действительно 0,1 Ом. Запаяйте 0,1 Ом обратно. Напишите, какая лампочка. А то мало ли какая, может она не от "сквозняка", а от броска тока заряда С18 С16 мигает. Транзисторы ключей проверьте. Впаяйте вместо первичной трансформатора резистор ом 150 - 300, чтобы ток с ключей в этот "эквивалент трансформатора" не больше 50-100 мА был. Посмотрите форму напряжения на выходе ключей, в точке соединения С16 и С18, на питании после лампочки. Ищите, где ляп. Умозрительно подсказать можно только по каким-то измеренным данным. Кроме вас никто их не добудет. В общем, как в анекдоте: - Молодой человек, ну делайте же уже хоть что-нибудь!
    • Ну так можно увеличить глубину ООС, тем самым понизив чувствительность и повысив линейность
    • Судя по этой картинке   в трухе передней панели под выступающие болты и шишки паек ЗК динамиков выковыряныфрезерованы выемки, иначе бы динамики так плотно не прилегали бы к ДВП.    А оно тебе надо? "Работает - не мешай"(с)/это уже аксиома, не требующая доказательств/ , пытаясь сделать лучше, чем сделано на заводе. Сanton-ят, т.е. поют, и лучше, чем есть, тебе не сделать. Ну перенесёшь ты динамики наружу, а что тебе это даст? Кроме того, что при попытке их продать(а продавать их когда-нибудь придётся, т.к. эта акустика бюджетного сегмента без потуг на высший класс Hi-Fi) , тебе придётся объяснять потенциальному покупателю причину, по которой какой-то умник заколхозил такую переделку с акустикой, ты ничего хорошего не получишь. Задуманная тобой переделка - это по сути возня ради возни. 
  • Похожий контент

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