Jump to content
a_sergeevich

Язык Си Для Микроконтроллеров

Recommended Posts

18 minutes ago, mosfetx said:

(PIND&(1<<x)

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

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

Share this post


Link to post
Share on other sites
1 hour ago, mosfetx said:

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

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

Подробнее

Posted (edited)

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


 

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();
    }
}

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

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

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

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

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

Edited by pndbr

Share this post


Link to post
Share on other sites

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

56 minutes ago, pndbr said:

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

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

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

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

 

 

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

 

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

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

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

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

 

Share this post


Link to post
Share on other sites
6 hours ago, IMXO said:

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

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

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

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

 

6 hours ago, Yurkin2015 said:

 


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

 

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

Share this post


Link to post
Share on other sites
15 hours ago, Yurkin2015 said:

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

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры

      Test1.rar
      Вот код, чтоб не скачивать проект.

      #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } }
      вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
    • By igoryan
      нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
    • By P32L
      Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ.
      Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
    • By Zver2011
      Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки.
      В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается.
      В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил.
      Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись))

      КОД.txt
    • By sensey88
      Продам счетчики бета-гамма излучения новые заводская упаковка
      Си1Г (79г) 62 шт. 5000р
      Си21БГ (79г) 49 шт. 350р
      Си22БГ (79г) 70 шт. 700р
      Си3БГ (84г) 20 шт. 300р
      Си3БГ (78г) 46 шт. 250р
      Си3БГ (77г) 10 шт. 250р
      Си3БГ (79г) 18 шт. 250р
      Си3БГ (75г) 10 шт. 200р
      Си37Г (80г) 40 шт. 400р
      Си37Г (76г) 24 шт. 350р
      Си37Г (79г) 16 шт. 350р
      Си33Г (78г) 28 шт. 450р
      Си33Г (77г) 15 шт. 450р
      СБТ13 (78г) 2 шт. 3000р
      СБТ13 (76г) 3 шт. 2700р
      СБТ13 (69г) 3 шт 2500р.
      Си8Б (79г) 1 шт. 2500р
      Си8Б (78г) 1 шт. 2500р
      СБТ10 (79г) 3 шт. 4500р
      8 (910) 7051241 Евгений
      bishop-x@yandex.ru
  • Сообщения

    • Ну да, зарядил, хочешь воспользоваться, а он разряжен... Не обращай внимание)))
    • Ну так так и должно быть. Выставляешь значение, затем нажимаешь старт и обороты показывают реальные. А что там за кнопка? Может, её нужно удерживать??? Что за кнопка? Что от то делает эта кнопка? Что в инструкции сказано про кнопку? 
    • - Искажения всегда со знаком +, меняется фаза сигнала драйвера -Ну я же писал,  что ставил крутилки в анод и катод. Где получилась раб точка, не фиксировал, сориентировал на словах. -Зажатость - это не технический термин, так выразился музыкант.  Вылечилось так: убрал КП. Еще может сказать: нужна ламповость, приходится решать задачу со всеми неизвестными. Измерять нужно, к примеру динамический диапазон, который влияет на эту зажатость. Сразу скажу: я не умею. - Нам бы знания Авалса и опыт Василича, но увы. Авалс, Вы писали, что нет желания продолжать длинные диалоги ниочем, нужно заканчивать.
    • Alkarn, Именно от частоты. Там размеров он вроде не касался. Помимо размеров, якобы, эффективность зависит от частоты. Я тогда скачивал обучающие видео на флешку и все просмотренные удалял. Может быть я удалил это видео, может всё ещё он где то в сохраненных файлах есть. В данный момент, ищу..
    • Старый добрый спирт-бензин всегда хорошо растворяет канифоль. Может, если температура невысокая, подольше оставить (на часок другой).
    • Чушь полнейшая. Эффективнее всего как раз таки работать на низких частотах, ибо затухание ниже. Однако, чем ниже частота, тем ниже и скорость передачи данных с ее использованием. Потому частоты все время повышают, ибо объемы передаваемых данных растут. Возьми учебники по антеннам, теории цепей и радиосвязи. Тогда вопросы сами отпадут.   Сколь еще раз тебе повторить, что "микроамперметр и два диода" не дают ответ на этот вопрос?   Мне вот заняться больше нечем, только тащить домой прибор весом 10кг и стоимостью 5 лямов. При этом еще и микроволновку купить по пути, ибо у меня дома ее с успехом заменяет духовка. Кстати, раз ты такой весь из себя умник-измеряльщик. Расскажи, во сколько раз ослабнет излучение частотой 2,45 ГГц на расстоянии 1м.
×
×
  • Create New...