Jump to content

atmega 8, семисегментный индикатор, кнопка.


Recommended Posts

Здраствуйте читатели форума.  Относительно недавно я начал работать с микроконтроллерами .  Собрав конструкцию из кнопки ,мк и одного индикатора я написал вот такой код

 

 

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

int main(void)
{
     int button = 0;
     int i =0;
    DDRC = 0xFF;
    DDRB = 0xFF;
    DDRD = 0x00;
    PORTD = 0b000001000;
void segchar (unsigned char seg)
    {
     switch(seg){
     case 0:PORTB = 0b0110111; PORTC = 0b0000001;  break;
     case 1:PORTB = 0b0000001; PORTC = 0b0000001;  break;
     case 2:PORTB = 0b1111011; PORTC = 0b0000000;  break;
     case 3:PORTB = 0b0011011; PORTC = 0b0000001;  break;
     case 4:PORTB = 0b0001101; PORTC = 0b0000001;  break;
     case 5:PORTB = 0b0011110; PORTC = 0b0000001;  break;
     case 6:PORTB = 0b0111110; PORTC = 0b0000001;  break;
     case 7:PORTB = 0b0000011; PORTC = 0b0000001;  break;
     case 8:PORTB = 0b0111111; PORTC = 0b0000001;  break;
     case 9:PORTB = 0b0011111; PORTC = 0b0000001;  break; 
     case 10:PORTB = 0b0111110; break;
     }
            
    }    
    while (1) 
    {
        
        if (!PIND&&button==0)
        { _delay_ms(100);
            i++;
            button = 1;
            
        }
        if (PIND&&button==1)
        {
            _delay_ms(100);
            button = 0;
        }

     if (i==0)
     {
         segchar(0);
     }
   if (i==1)
   {
      segchar(1);
   }
     if (i==2)
     {
        segchar(2);
    }
      if (i==3)
      {
          segchar(3);
      }
       if (i==4)
            {
                segchar(4);
            }
     if (i==5)
          {
              segchar(5);
          }
     if (i==6)
          {
              segchar(6);
          }
      if (i==7)
          {
         segchar(7);
       }
      if (i==8)
      {
          segchar(8);
      }
      if (i==9)
      {
          segchar(9);
      }
      if (i==10)
      {
          segchar(10);
      }
       if (i==11)
       {
           i = 0;
       }

 

        


    
    }
}

 

Код отрабатывает только от 0 до 2 , а дальше не работает(

Подскажите пожалуйста что я написал не так . 

Заранее спасибо )

Link to comment
Share on other sites

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

41 минуту назад, глеб материкин сказал:

Подскажите пожалуйста что я написал не так . 

начиная с

 if (i==0)
     {

и заканчивая

  segchar(10);
      }

код бессмыслен по своей сути
все это заменяется на
 

  segchar(i);

Вангую, не считает выше 2х скорее всего из-за неопределенного состояния на PIND. Зачем Вы опрашиваете весь порт сразу не понятно...

Edited by IMXO
Link to comment
Share on other sites

1 час назад, глеб материкин сказал:

 PORTD = 0b000001000;

 

1 час назад, глеб материкин сказал:

case 0:PORTB = 0b0110111; PORTC = 0b0000001;  break;

Сначала разберись сколько бит в байте 7 или 9.

Edited by skripach
Link to comment
Share on other sites

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

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

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

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

13 часов назад, skripach сказал:

Сначала разберись сколько бит в байте 7 или 9.

Это я уже исправил , хотя код и до этого работал.

14 часов назад, IMXO сказал:

Вангую, не считает выше 2х скорее всего из-за неопределенного состояния на PIND. Зачем Вы опрашиваете весь порт сразу не понятно...

Если не трудно не могли бы подсказать как реализовать по другому ?

Link to comment
Share on other sites

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

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

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

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

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

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

Спасибо всем тем кто откликнулся .Я сумел подключить еще и вторую кнопку . Вот обновленный код:

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

int main(void)
{
    int button = 0;
    int button1 = 0;
    int i = 0;
    DDRC = 0xFF;
    DDRB = 0xFF;
    DDRD = 0b00000000;
 PORTD = 0b11111111; 
void segchar (unsigned char seg)
    {
     switch(seg){
     case 0:PORTB = 0b0110111; PORTC = 0b0000001;  break;
     case 1:PORTB = 0b0000001; PORTC = 0b0000001;  break;
     case 2:PORTB = 0b1111011; PORTC = 0b0000000;  break;
     case 3:PORTB = 0b0011011; PORTC = 0b0000001;  break;
     case 4:PORTB = 0b0001101; PORTC = 0b0000001;  break;
     case 5:PORTB = 0b0011110; PORTC = 0b0000001;  break;
     case 6:PORTB = 0b0111110; PORTC = 0b0000001;  break;
     case 7:PORTB = 0b0000011; PORTC = 0b0000001;  break;
     case 8:PORTB = 0b0111111; PORTC = 0b0000001;  break;
     case 9:PORTB = 0b0011111; PORTC = 0b0000001;  break; 
     case 10:PORTB = 0b0111110; break;
     }
            
    }    
    while (1) 
    {

  if ((PIND&(1 << PD3))==0&&button==0)
  {     
     i++;
     _delay_ms(100);
     button = 1;
  }
 if (!(PIND&(1 << PD3))==0&&button==1)
 {  _delay_ms(100);
     button = 0;
     
 }

 if ((PIND&(1 << PD4))==0&&button1==0)
 {
     i--;
     _delay_ms(100);
     button1 = 1;
 }
 if (!(PIND&(1 << PD4))==0&&button1==1)
 {  _delay_ms(100);
     button1 = 0;
     
 }

segchar(i);
 
if(i>9){
    
    i = 0;}
if(i<0){
     
 i = 9;}

    }
}

Link to comment
Share on other sites

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

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

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

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

это
 

if(i<0){
      i = 9;} 

очень плохая практика... и работает только по тому что использована знаковая переменная  int i = 0; к тому же в вашем коде абсолютно не нужна.

У вас  i  изменяется от 0 до 9, это беззнаковое целое размерностью байт, те должно быть unsigned char ( точно такое же, как Вы принимаете в функцию segchar (unsigned char seg).
К тому же у Вас нарушена последовательность действий в коде.
вывод значения i происходит раньше, чем проверка на выход из диапазона
попробуйте делать проверку на диапазон сразу при увеличении/уменьшении переменной

// инкремент i++ 
if(i<9) {i++;}
  else {i=0;}
// дикримент i--
if(i>0) {i--;}
  else {i=9;}

 

Edited by IMXO
Link to comment
Share on other sites

1 минуту назад, Огонёк сказал:

Можно без проверки:

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

Link to comment
Share on other sites

19 часов назад, IMXO сказал:

очень плохая практика... и работает только по тому что использована знаковая переменная  int i = 0; к тому же в вашем коде абсолютно не нужна.

У вас  i  изменяется от 0 до 9, это беззнаковое целое размерностью байт, те должно быть unsigned char ( точно такое же, как Вы принимаете в функцию segchar (unsigned char seg).
К тому же у Вас нарушена последовательность действий в коде.
вывод значения i происходит раньше, чем проверка на выход из диапазона
попробуйте делать проверку на диапазон сразу при увеличении/уменьшении переменной

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

Link to comment
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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Сообщения

    • Я пользуюсь предом с отключаемым темброблоком, так мне думается, самое оптимальное.
    • Закажите другие - Нормальные резонаторы, 10% отклонения - это много, как резонанс меряли? Осмотрите крепление рупора, затяните крепёж посильней  резонанс зависит от мелочей
    • Я похоже хотел решить задачу с налёту, не изыскав всех вариантов. Спасибо за подсказку. 
    • Как щитаешь, что автор хотел этим донести городу и миру? "не берусь сильно уж интерпретировать ибо 1 кГц снялся хорошо, а потом что-то пошло не так и появилась наводка толи на щуп толи на вход, ее видно на желтом сигнале и не заметно на синем, но полюбому на вход перло что-то кроме меандра."(С) Короче - все в сад. Афтор невзялся. Подытожил однако бодро: "Итак измерения показали отличное соответствие характеристик клона и оригинала."(С) Также фпечатлило прослушивание: "мне понравилось как они (колонки+усилитель) отрабатывают низ". Самое трогательное что низы прослушивались через -"миниколонки — полочники фирмы Филлипс". (С) Ну ладно, чо. "Автор не входит в состав редакции iXBT.com"  
    • Мое мнение, если интересно, "улучшайзеры" не нужны, если усилитель, акустика, источник сигнала и акустика помещения нормальные или лучше. Если что-то из перечисленного не удовлетворяет этим условиям, то без "улучшайзеров" бывает некомфортный звук. В любом случае делать выбор слушателю. ИМХО. По поводу второго вопроса. Не применял, так как нет в этом надобности.  Прохожу мимо.
    • Ну хотя бы)) ЗЫ. Иногда мелкому покупаю раскраски. Любит он раскрашивать картинки. Делает ли это его художнеком этих картин а сами эти картинки - шедеврами? Хм)) Трудолюбивые китайцы становятся всё технологичней и умнее, а блохеры доморощеные - ленивее и тупее. Потому што нет никаких причин называть любую из  СХЕМОТЕХНИЧЕСКИ и железно тождественных поделкок, оригиналом, или что ещё забавнее - оригиналом с оригинала. Одна и та же схема с железом с той же самой мировой фабрики, вдруг становится лучше чем.. што? Чем железо и измерения 50ти летней давности? Хто бы сомневалсо))) \кряхтя лезет потстол...\
    • инвертор на выход датчика, Вам даже стрелочками три года назад показали как 555таймер подключить надо...
×
×
  • Create New...