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 серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

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

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

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

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

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

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

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

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

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

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

#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

это
 

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.
  • Сообщения

    • Звук опять стекломоем упоролся. Долго держался, однако.  
    • Алаверды, по теме будет, что? Зачем пришел сюда, накакать? Так мимо проходите, мимо, в колонку выстроились и куда вы любите ходить? А, точно, мне понравилось, поддерживаю "Цифровой концлагерь", Москва в 19 очищена была от тунеядцев, в час пик, в метро одни "по Делу" (5 таджиков и я, на улицу выходишь - красота какая, флюиды не летают (от вас, негатив), а здания блесят, по новому архитектуру видишь). Социальный рейтинг, как в Китае? Нужно! 1. Когда Сталин, на Красной, рядом с Лениным на постамент и вход беЗплатный. 2. Власовский дермантин забанят на всегда, можно ещё раз повторить - сжечь прилюдно.
    • @Zvuk. , ты темой не ошибся? Какое отношение к мощности бесколекторного мотора имеют твои геройские высеры? Ну а по поводу спец. служб советую тебе прикрыть свою брехливую хлеборезку - неровён час сам с ними близко познакомишься. 
    • о, в стадо привалило. )) Да, не буду я вас считать, спецслужбы уже давно вас пересчитали, это их тема.
    • единственно для чего нужен ЛТСпайс это ИИП строить, Ти, АДи модели выкладывает. А, так да, Петлевое удобней на одном графике смотреть, Лазер+Ток показывал, как в Мультисиме это делать, да я эту лекцию пропустил, в футбол играл (не когда было)
    • Спор априори не имеет смысла, каждый останется при своём мнении. Из недавнего, просто паять, просто слушать звук, мои темы по паяльникам и усилителям, кто то паяет буквально гвоздем и даже гордится этим, а кому то ersa тесновата, в опросе по усилителям как оказалось есть парочка глухих, считающих что все усилители усиливают одинаково и разницы в звуке нет и быть не может, пытаться их переубедить невозможно и не нужно.  
    • Безумству храбрых поём мы песню. (с)   
×
×
  • Create New...