На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (18) [1] 2 3 ...  17 18 все  ( Перейти к последнему сообщению )  
    > Разбираемся с IAR , Обсуждаем небольшие коды на IAR.
      Понемногу в IAR разбираюсь, есть простенькая схема
      решил сделать чтобы светодиод на RB2 мигал, по команде PIC
      контроллера.
      Код мне potor дал для бегущей строки, хотел переделать в обыкновенный
      код для мигания. Тут ошибок тьма, покажите где?

      user posted image
      Нужен только светодиод подключённый к RB2......

      struct time // описание структуры время
      {
      unsigned char sec;// секунды
      } current_time;
      void init_io(void);
      void init_timer(void);
      void main(void)
      // тело программы
      {
      init_io(); //вызываем
      init_timer(); //функции инициализации
      __enable_interrupt();// разрешаем прерывания (описана в одном из хедерных файлов)
      out = 1; // инициализируем переменную out.
      old_sec = 0;// инициализируем счетчик секунд
      while(1)// организуем бесконечный цикл
      {
      PORTB = ~out;//записываем в PORTB инверсный код светодиода, который хотим зажечь (мы же
      // зажигаем их 0)
      while(current_time.sec == old_sec); // ждем одну секунду

      old_sec = current_time.sec; //присваиваем счетчику секунд текущее время (секунды)
      }
      }

      //-----------------инициализация портов ввода/вывода----------------
      void init_io(void)
      {
      DDRB = 0xff;//настрамваем PORTB на вывод
      PORTB = 0xfb;//все выходы в 1, светодиоды погашены
      }
      //------------------------------------------------------------------

      //-----------------инициализация таймара----------------------------
      void init_timer(void)
      {
      TIMSK |= Bit(1); //разрешаем прерывания от TC0 1 в TOIE0
      TCCR0 = 5; //говорим, что тактовую частоту будем делить на 1024

      current_time.sec = 0;// обновление времени
      current_time.min = 0;
      current_time.hour = 0;
      }
      //------------------------------------------------------------------

      Выделен красным цветом - объясните что за хедерные файлы, и для чего здесь нужна эта строчка
      Выделен синим цветом - нужно исправить/дописать чтобы светодиод загорался.
      ExpandedWrap disabled
        TCCR0 = 5; //говорим, что тактовую частоту будем делить на 1024

      Зачем делить на 1024
        Цитата
        bizar, 8.01.04, 14:03
        __enable_interrupt();// разрешаем прерывания (описана в одном из хедерных файлов)
        ...
        объясните что за хедерные файлы, и для чего здесь нужна эта строчка
        Это заголовочные файлы, содержащие прототипы функций и макросы.
        У меня IAR для PIC под рукой нет. В IAR EWAVR этот файл называется inavr.h
        Вызов этой функции нужен, чтобы разрешить прерывания и соответственно в одном из обработчиков происходило инкрементирование времени. см. ниже

        Цитата
        bizar, 8.01.04, 14:03
        PORTB = ~out;//записываем в PORTB инверсный код светодиода, который хотим зажечь (мы же
        // зажигаем их 0)
        Вообще-то непонятен алгоритм работы. По видимому,
        PORTB ^= 8; // зажигаем или гасим светодиод на RB2


        Цитата
        bizar, 8.01.04, 14:03
        Зачем делить на 1024
        Очевидно, это времязадающий таймер - в его обработчике инкрементируется время.
          TCCR0 = 5;//- это особенность конкретного контроллера (специальный регистр), в PICе это наверняка по другому
          чтобы мигал PORTB2 надо:
          while(1)// организуем бесконечный цикл
          {

          while(current_time.sec == old_sec); // ждем одну секунду
          old_sec = current_time.sec; //присваиваем счетчику секунд текущее время (секунды)
          if (PORTB == 0xff) PORTB = 0xfb;//горит portb 2
          else PORTB = 0xff;//все диоды погашены
          }

          еще раз говорю, это для пика не пойдет, там регистры специальных функций другие:)
          функция разрешения прерываний там тоже возможно называется по другому, но скорее всего так же
          по поводу дисплея попытаюсь сделать сегодня вечером:)
            что за г...?
            на PICке направление выбирается TRISB:
            00 - весь порт B работает на выход
            FF - весь порт B работает на вход

            я для PICков avr не использую, там много глюков. исп Hi-Tech . Скачай hi-tech и на сайте cracks.am к
            нему кряк подбери.
            В Hi-Tech:
            пишешь
            static bit _LED @ (unsigned)&PORTB*8+2; /* bit2 in port B */
            и оперируешь битом.

            // пример оформления прерываения

            static void interrupt
            GeneralInterruptRoutine(void){
            if (T0IF)
            {
            T0IF = 0;
            // Timer0 interrupt

            }

            if (TMR1IF)
            {
            TMR1IF = 0;
            // Timer1 interrupt
            /******** Сюда пишешь счётчика...короче подбираешь 1 сек. задержку *********/
            /* типа if (dwCounter >= 26) {
            /* _LED =~ _LED;
            /* dwCounter = 0;
            /* }
            /* dwCounter++;
            /*
            /******************************
            }
            if (RCIF)
            {
            RCIF = 0;
            RX_Buf[RX_Cursor++] = RCREG;
            if (RX_Cursor == RX_Size) RX_Cursor = 0;
            // RX interrupt
            }
            if (SSPIF)
            {
            SSPIF = 0;
            In_Buf_SPI[In_Cursor_SPI++] = SSPBUF;
            if (In_Cursor_SPI == In_Size) In_Cursor_SPI = 0;
            // SPI interrupt
            }
            }

            // включаем все прерывания...
            void InterruptsEnable(void)
            {
            GIE = 1;
            PEIE = 1;
            }

            посмоти в доках к твоему PICу как включать Timer1 (это таймер счётчик по 65536 ~ 40ms полный цикл)
            я привел пример для PIC16F877A

            а какой кстати проц?
              по поводу глючности IAR для пиков спорить небуду (не работал с ним и с пиками в частности)
              по поводу операции с битами IAR это тоже позволяет просто надо описать union из чара и соответствующей битовой области
              а вообще, это мое субъективное мнение, удобнее всего битовые операции реализованы в keil, там есть тип bit, переменная такого типа будет однозначно располагатся, только в битово адресуемой области:)
                SimpleSoft, что за Hi-Tech? Приведённый тобой код IAR ?

                ExpandedWrap disabled
                  а какой кстати проц?    

                всмысле

                ExpandedWrap disabled
                  RTCC таймер/счетчик
                  Режим таймера выбирается путём сбрасывания в ноль бита RTS, который находиться в регистре OPTION и т. д.
                  Или таймер Watch Dog.]

                Ты это имел ввиду.
                  Hi-Tech это еще одна среда разработки, я ее к сожалению не юзал
                  т е код тебе прислали не для IAR а для этой самой Hi-Tech
                  я кстати не врюхал??? ты пытаешься залить мой код написанный для AVR в свой PIC??? Если да то непойдет:)
                  это же другая архитектура, я тебе просто выслал пример программирования в IAR, но т.к. он у меня для AVR и дома тоже нашел AVR контроллер, я спаял на монтажке схему с диодиками, написал программку для моего контроллера, отладил и выслал тебе
                    У каждого микроконтроллера различна работа таймера???
                    :ph34r: :ph34r: :ph34r:
                      у разнах микроконтроллеров разная архитектура: разные таймеры, разрядность режимы работы, регистры специальных ф-й и т.п., т.е. прежде чем писать программу для конкретного контроллера в первую очередь читаешь документацию именно по нему

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

                      #include<имя файла, где описан твой пресловутый порт RB>
                      void main(void)
                      {
                      while(1)
                      {
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      if (RB == 0xff) RB = 0xfb;
                      else RB=0xff;
                      }
                      }
                      проверяем должно скомпилится запускаем эмулятор и смотрим работает, или нет, если все ок заливаем в контроллер, если не заработало, ищем плюхи в монтаже, если заработало, прекрасно!!!
                      внимательно читаешь про работу таймера и про прерывания и реализовываешь с использованием оных и т.д.....

                      Добавлено в :
                      извини немножко не так? взглянул тут на документацию по твоему контроллеру:

                      #include<имя файла, где описаны PORTB и TRISB>
                      void main(void)
                      {
                      TRISB = 0; // настраиваем PORTB на выход
                      while(1)
                      {
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      for (unsigned int i = 0xffff; i!=0; i--);
                      if (PORTB == 0xff) PORTB = 0xfb;
                      else PORTB=0xff;
                      }
                      }
                        Я думал без Таймера мигать не будет. :(
                        Что за 0xffff.
                          0xfb порт RB2, а порт RB3, RB4 и т. д. как обозначаются.
                          #include<имя файла, где описаны PORTB и TRISB>
                          void main(void)
                          {
                          TRISB = 0; // настраиваем PORTB на выход
                          while(1)
                          {
                          for (unsigned int i = 0xffff; i!=0; i--);// я так понял этот цикл включает светодиод,
                          for (unsigned int i = 0xffff; i!=0; i--);// но не понял смысл этого цикла, ещё
                          for (unsigned int i = 0xffff; i!=0; i--);//зачем их надо 4 штуки (чтобы сровнять i до ноля,
                          for (unsigned int i = 0xffff; i!=0; i--);//может используешь его вместо таймера)??????????
                          if (PORTB == 0xff) PORTB = 0xfb; //если порт RB равен 0xff, значит порт RB присваивает 0xfb (то есть светодиод на RB2 погашен??)
                          else PORTB=0xff; // иначе порт RB присваивает 0xff
                          }
                          }
                            #include<имя файла, где описаны PORTB и TRISB>
                            void main(void)
                            {
                            TRISB = 0; // настраиваем PORTB на выход
                            while(1)
                            {
                            //организуем задержку, чтобы ты видел как мигает светодиод
                            //если не сделать эту задержку, то ты увидишь просто горящий светодиод
                            for (unsigned int i = 0xffff; i!=0; i--);
                            for (i = 0xffff; i!=0; i--);
                            for (i = 0xffff; i!=0; i--);
                            for (i = 0xffff; i!=0; i--);
                            //-------------------------------------------------------------------------
                            //собственно мигание светодиода
                            if (PORTB == 0xff) PORTB = 0xfb;
                            else PORTB=0xff;
                            }
                            }
                              ExpandedWrap disabled
                                0xfb порт RB2, а порт RB3, RB4 и т. д. как обозначаются.

                              ExpandedWrap disabled
                                Что за 0xffff.
                              Сообщение отредактировано: bizar -
                                Если внимательно почитвть описание то увидишь:
                                RB2 - это второй разряд порта PORTB
                                0xЧИСЛО - так в С обозначаются 16-ричные числа
                                fb - шестнадцпатиричное, это 11111011 двоичное
                                т е PORTB = 0xfb; говорит буквально следующее:
                                Записать во 2-й разряд PORTB (т.е. в RB2) нолик, а в остальные разряды 1
                                Соответственно PORTB = 0xff говорит
                                записать во все разряды PORTB 1
                                вот и получили мигание...
                                  Ты мне так и не ответил что/зачем/почему в примере
                                  используешь 0xffff


                                  Может я тебя не правельно понял.
                                  Сообщение отредактировано: bizar -
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (18) [1] 2 3 ...  17 18 все


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