На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (18) 1 [2] 3 4 ...  17 18 все  ( Перейти к последнему сообщению )  
    > Разбираемся с IAR , Обсуждаем небольшие коды на IAR.
      да я просто реализую задержку
      4 цикла котые считают от 65535 (0xffff) до нуля:)
        Значит через час/полтора, может больше
        светодиод перестанет мигать.
        Порт RB3 - fc???
        RB4 - fd???
        Сообщение отредактировано: bizar -
          нет, эти четыре while дадут тебе задержку порядка секунды +- лапоть в зависимости от частоты генератора микроконтроллера
          т.е. алгоритм до безобразия тупой :)
          while (1){//все что в этих скобках бесконечный циклъ
          // 1)сначала задержка порядка секунды
          while(...);
          while(...);
          while(...);
          while(...);
          // 2)теперь меняем состояние светодиода на противоположное
          if...
          // и опять к шагу 1
          }
            Ясно....
            Проверьте исходничёк (поочерёдное мигание светодиодов подключённых к RB2, RB3, RB4, RB5)
            У меня нет эмулятора (поэтому не могу проверить).
            А вообще что за эмулятор - программа/внешнее устройство проверяющая работу микроконтроллера
            Объясните bizar..у.?
            ExpandedWrap disabled
              #include<имя файла, где описаны PORTB и TRISB>
              void tik(unsigned int i)
                          {
                          for (i = 0xffff; i!=0; i--);
                          for (i = 0xffff; i!=0; i--);
                          for (i = 0xffff; i!=0; i--);
                          for (i = 0xffff; i!=0; i--);
                          }
              void tik1(void)
                      {
                      if (PORTB == 0xff) PORTB = 0xfb;
                      else PORTB=0xff;
                      }
              void tik2(void)
                      {
                      if (PORTB == 0xff) PORTB = 0xfc;
                      else PORTB=0xff;
                      }
              void tik3(void)
                      {
                      if (PORTB == 0xff) PORTB = 0xfd;
                      else PORTB=0xff;
                      }
              void tik4(void)
                      {
                      if (PORTB == 0xff) PORTB = 0xfe;
                      else PORTB=0xff;
                      }
              void main(void)
                      {
                      TRISB = 0;
                      while(1)
                          {
                          tik ();
                          tik1 ();
                          tik ();
                          tik2 ();
                          tik ();
                          tik3 ();
                          tik ();
                          tik4 ();
                          }
              }
            Сообщение отредактировано: bizar -
              что то я не понял, что ты изобразил???

              Добавлено в :
              это даже не скомпилится???
                Это чума зажигает поочерёдна 4 светодиода
                подключённые к RB2, RB3, RB4, RB5.
                Я создал несколько функций, поставил их поочерёдна
                и добавил бесконечный цикл.
                Ещё мне:::::
                Нужно заставить динамик пищать?????
                Прикреплённый файлПрикреплённый файлZvuk.rar (0.73 Кбайт, скачиваний: 864)
                  где у тебя в порограмме функция main()???

                  Добавлено в :
                  по поводу пищания динамика:
                  на RB7 подаешь 0
                  на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы)
                    Вот эта функция main (это то что будет выполняться).
                    ExpandedWrap disabled
                      void main(void)
                        {
                        TRISB = 0;
                        while(1)
                         {
                         tik ();
                         tik1 ();
                         tik ();
                         tik2 ();
                         tik ();
                         tik3 ();
                         tik ();
                         tik4 ();
                         }
                      }
                      а tick2()? tick3()? tick4()?
                        Цитата potor @ 13.01.04, 17:00
                        а tick2()? tick3()? tick4()?

                        tic2 зажигает RB3 (СВЕТОДИОД)
                        tic3 зажигает RB4 (СВЕТОДИОД)
                        tic4 зажигает RB5 (СВЕТОДИОД)
                        Если я неправельно написал, напиши как правельно.
                          ExpandedWrap disabled
                            на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы)

                          Как подавать импульсы на RB6, нужен кусочек кода с объяснением.
                          Я ещё многого не знаю, на словах не понимаю.
                            в общем дело в следующем:
                            void tic2 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xf7;
                            else PORTB=0xff;
                            }
                            void tic3 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xef;
                            else PORTB=0xff;
                            }
                            void tic4 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xdf;
                            else PORTB=0xff;
                            }
                            но дело в том, что такая реализация выглядит криво :(
                            предлагаю написать следующее:

                            main()
                            {
                            TRISB = 0;
                            PORTB = 0xdf;
                            while(1)
                            {
                            tick();
                            if (PORTB == 0xdf ) PORTB = 0xdf;
                            else PORTB <<= 1;
                            }
                            }

                            Добавлено в :
                            в общем дело в следующем:
                            void tic2 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xf7;
                            else PORTB=0xff;
                            }
                            void tic3 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xef;
                            else PORTB=0xff;
                            }
                            void tic4 (void)
                            {
                            if (PORTB == 0xff) PORTB = 0xdf;
                            else PORTB=0xff;
                            }
                            но дело в том, что такая реализация выглядит криво :(
                            предлагаю написать следующее:

                            main()
                            {
                            TRISB = 0;
                            PORTB = 0xdf;
                            while(1)
                            {
                            tick();
                            if (PORTB == 0xdf ) PORTB = 0xdf;
                            else PORTB <<= 1;
                            }
                            }

                            Добавлено в :
                            теперь, что касаемо пищалки:
                            я тебе сейчас не могу сказать как получить конкретную частоту на выходе (не хватает исходных данных: например частоы тактового генератора процессора), но могу натолкнуть. В общем существует два варианта:
                            1) использавать прерывание от таймера. Это наиболее предпочтительный вариант, но мы пока на прерывания не заморачиваемся
                            2) организовать программную задержку (как в случае с мигающим светодиодом)
                            ...

                            void delay (void)
                            {
                            for (unsigned char i = 0xff; i != 0; i--)
                            }
                            // теперь давай опишем макрос для более удобной работы с битами
                            #define Bit(x) (1<<(x))
                            main()
                            {
                            TRISB = 0;
                            PORTB =0x7f;//обнуляем восьмой бит PORTB, остальные в 1
                            while(1)
                            {
                            delay();
                            if (PORTB & Bit(6)) // RB6 в 1?
                            PORTB &= ~Bit(6);// если да то обнуляем
                            else
                            PORTB |= Bit(6);// если нет то устанавливаем
                            }
                            }
                              ExpandedWrap disabled
                                main()
                                          {
                                           TRISB = 0;
                                           PORTB = 0xdf;
                                           while(1)
                                                  {
                                                  tick();
                                                  if (PORTB == 0xdf ) PORTB = 0xdf;
                                                  else PORTB <<= 1;
                                                  }
                                          }


                              Это пример только к порту 0xdf?????

                              ExpandedWrap disabled
                                0xf7 ----RB3
                                0xef  ---- RB4
                                0xdf ---- RB5

                              Чё-то я закономерность не заметил, по назначению в Си портов RB.

                              Добавлено в :
                              ExpandedWrap disabled
                                if (PORTB & Bit(6)) // RB6 в 1?
                                PORTB &= ~Bit(6);// если да то обнуляем

                              Что значит "~", объясни по подробней этот кусок.
                              Сообщение отредактировано: bizar -
                                извиняюсь, ошибся

                                main()
                                {
                                TRISB = 0;
                                PORTB = 0xfd;// устанавливаем в ноль RB2
                                while(1)
                                {
                                tick();
                                if (PORTB == 0xdf ) // RB5 установлен в 0?
                                PORTB = 0fb; // если да, то устанавливаем в ноль RB2, остальные в 1
                                else PORTB <<= 1; иначе сдвигаем на 1 влево
                                }
                                я тебе кажется уже объяснял, что это не адреса портов, адрес порта PORTB описан в h файле, а это то что хотим в порт звписать
                                PORTB = 0xff; //записываем во все разряды PORTB единицы
                                PORTB = 0xfе;// записываем в RB0 0, в остальные разряды 1
                                PORTB = 0xfd;// записываем в RB1 0, в остальные разряды 1
                                PORTB = 0xfb;// записываем в RB2 0, в остальные разряды 1
                                PORTB = 0xf7;// записываем в RB3 0, в остальные разряды 1
                                PORTB = 0xef;// записываем в RB4 0, в остальные разряды 1
                                PORTB = 0xdf;// записываем в RB5 0, в остальные разряды 1
                                PORTB = 0xbf;// записываем в RB6 0, в остальные разряды 1
                                PORTB = 0x7f;// записываем в RB7 0, в остальные разряды 1

                                теперь далее
                                if (PORTB & Bit(6)) // делаем поразрядное логическое И содержимого POTRB и числа 01000000b, если результат не 0, значит в RB6 сейчас 1
                                PORTB &= ~Bit(6);// и если это так обнуляем RB6

                                ~- это операция поразрядной инверсии числа в данном случае что получается:
                                Bit(6) это 01000000b
                                ~Bit(6) это 10111111b
                                PORTB&=~Bit(6) это PORTB = PORTB & ~Bit(6), или попросту PORTB = PORTB & ~Bit(6), или совсем просто PORTB = PORTB & 0x40, или по человечески обнуление 6-го разряда PORTB (RB6)
                                  Усё отлично понял.
                                  У пищалки нужно убрать конденсатор к твоему примеру.????

                                  ExpandedWrap disabled
                                    else PORTB <<= 1; иначе сдвигаем на 1 влево


                                  А вроде нам нужно сдвигать на один в право.
                                  else PORTB >>= 1;
                                  RB2 - RB3 - RB4 - RB5 //Идёт в порядке возрастания.
                                  Как сделать так чтобы 2 светодиода загорались одновременно???
                                  Например RB2 и RB5. Я думаю так:
                                  PORTB = 0xdb; //проверьте так ли это

                                  Вот потренировался (проверь).
                                  Порядок загорания светодиодов:
                                  RB2 RB7 (одновременно)
                                  RB3 RB6 (одновременно)
                                  RB4 RB5 (одновременно)
                                  Гаснут и всё сначала.
                                  main()
                                  {
                                  TRISB = 0;
                                  PORTB = 0xdb;
                                  while(1)
                                  {
                                  tick();
                                  if (PORTB == 0xcf )
                                  PORTB = 0xff;
                                  else PORTB = 0xb7;
                                  if (PORTB == 0xb7)
                                  PORTB = 0xcf;
                                  else PORTB = 0xcf;
                                  }
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (18) 1 [2] 3 4 ...  17 18 все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0437 ]   [ 16 queries used ]   [ Generated: 19.03.24, 05:40 GMT ]