На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (18) « Первая ... 12 13 [14] 15 16 ... Последняя » все  ( Перейти к последнему сообщению )  
    > Разбираемся с IAR , Обсуждаем небольшие коды на IAR.
      повторюсь:
      вышли сюда ассемблерный код функции TransmitBitDelay, я тебе обьясню как вычислить эти числа
        Я всё довно понял, времени просто не было
        Прикреплённый файлПрикреплённый файлwood.rar (1.71 Кбайт, скачиваний: 419)
          слуай, ты случайно в следующем коде точку с запятой после первого for не ставил???
          ExpandedWrap disabled
             
            void TransmitBitDelay(void)
            {
            for (int i= число1; i!=0; i--) // здесь точка с запятой ненужна
              for (int j= число2; j!=0; j--);
            }

          если не ставил, значит оптимизатор что то намудрил, уменьши уровень оптимизации и вышли еще раз:)

          Добавлено в :
          или попробуй вот так записать:
          ExpandedWrap disabled
             
            void TransmitBitDelay(void)
            {
            for (int i= число1; i!=0; i--)
              {
              for (int j= число2; j!=0; j--);
              }
            }
            Млин откуда там точка с запятой взялась не понимаю
            вроде всё правельно наберал.
            Ну ладно вот без неё.
            Прикреплённый файлПрикреплённый файлwoodd.rar (2.46 Кбайт, скачиваний: 397)
              ok завтра на работе посмотрю:)
                вот это больше на правду похоже, но извини, я опять намудрил:)
                переделай функцию вот так, а то компилятор много избыточного кода вставляет:
                ExpandedWrap disabled
                   
                  void TransmitBitDelay(void)
                  {
                  for (unsigned char i= число1; i!=0; i--) // здесь точка с запятой ненужна
                    for (unsigned char j= число2; j!=0; j--);
                  }


                Добавлено в :
                ссори вот так:
                ExpandedWrap disabled
                   
                  void TransmitBitDelay(void)
                  {
                  unsigned char i,j
                  for (i= число1; i!=0; i--) // здесь точка с запятой ненужна
                    for (j= число2; j!=0; j--);
                  }
                  Кстати я там поменял:
                  ExpandedWrap disabled
                    void TransmitBitDelay(void)
                    {
                    int i,j
                    for (i= число1; i!=0; i--)
                      for (j= число2; j!=0; j--);
                    }

                  А зачем unsigned char?
                    int занимает 2 байта, char 1 байт, контроллер восьмиразрядный, т е вся арифметика побайтовая, и если использовать тип int получается больше по коду, в твоем случае рационально использовать unsignrd char

                    Добавлено в :
                    я тебе уже раньше писал, что int надо использовать по возможности реже
                      Ну вот всё готово.
                      Что там на счёт чисел?
                      Прикреплённый файлПрикреплённый файлchar.rar (2.39 Кбайт, скачиваний: 419)
                        сейчас, разбирусь с тем, что он накомпилил, и расскажу:)
                          ExpandedWrap disabled
                             
                            ;------------------------------------------------- этот код выполняется 1 раз-------------------------------------
                            TransmitBitDelay:           ;сюда попадаем по call2 цикла
                            ;    12 {
                            ;    13 unsigned char i,j;
                            ;    14 for (i= 10; i!=0; i--)
                                    MOVLW   10                            ;W=10                                         1 цикл  
                                    MOVWF   i                             ;i=W (i=10)                                   1 цикл
                                    GOTO    TransmitBitDelay_0            ;                                             2 цикла  
                            ;----------------------------------------------------------------------------------------------------------------
                                                                                                                           итого 6 циклов
                             
                             
                             
                            ;    15   for (j= 10; j!=0; j--);
                            ;--------------------------------------------этот код выполняется i*j раз----------------------------------------
                            ;-------------------причем команда BTFSS   _A_STATUS,2  выполняется за два цикла i раз---------------------------
                            ;-----------------------------------------------а за один цикл i*(j-1) раз---------------------------------------
                            ;-------------------команда GOTO    TransmitBitDelay_1 выполняется i*(j-1) раз-----------------------------------
                            TransmitBitDelay_1:
                                    DECF    j,1                           ; вычитаем из j 1                             1 цикл
                            TransmitBitDelay_2:
                                    MOVF    j,1                           ; (j==0)?                                     1 цикл
                                    BTFSS   _A_STATUS,2                   ; если не равно                               1(2)цикла
                                    GOTO    TransmitBitDelay_1              ; идем вычитать j                             2 цикла
                            ;-----------------------------------------------------------------------------------------------------------------
                                                                                                                       итого i*(5*j-1) циклов
                             
                             
                             
                            ;--------------------------------------------этот код выполняется i раз----------------------------------------
                            ;-------------------есть тонкость, команда BTFSС i-1 раз выполняется за 2 цикла и 1 раз за 1 цикл--------------
                            ; ------------------а команда  GOTO    TransmitBitDelay_4   выполнится всего один раз-------------------------
                                    DECF    i,1                                      ; а если равно вычитаем из i  1    1 цикл
                            TransmitBitDelay_0:
                                    MOVF    i,1                                      ;(i==0)?                           1 цикл
                                    BTFSC   _A_STATUS,2                              ;если равно  заканчиваем ф-ю       1(2)цикла
                                    GOTO    TransmitBitDelay_4                       ;на завершение ф-и                 2 цикла
                                    MOVLW   10                                       ;если не равно W=10                1 цикл  
                                    MOVWF   j                                        ;j=W (j=10)                        1 цикл
                                    GOTO    TransmitBitDelay_2                       ;идем разбираться с j              2 цикла
                            ;-----------------------------------------------------------------------------------------------------------------                                                                                              итого 8*i+1 циклов
                            ;    16 }
                            ;----------------------------------и этот код 1 выполняется 1 раз-----------------------------------------------
                            TransmitBitDelay_4:
                                    RETURN                                           ; возврат в основную прогу         2 цикла
                            ;------------------------------------------------------------------------------------------------------------
                                     получаем всего циклов i*(5*j + 7)+9 циклов. Один цикл при твоем кварце 2MHz=2000000Hz
                            допустим нам надо работать со частотой 9600Hz, решаем уравнение
                            9600=2000000/(i*(5*j+7)+9)
                            мы видим, что оно имеет множество решений, но нам нужны целые, или максимально приближенные к целым, решается оно методом подбора
                            P.S.проверь правильность моих вычислений, а то я мог где то ошибитьсяJ
                            Ok
                            если использовать 8Mhz = (8000000)
                            Что лучше использовать 2Mhz или 8Mhz
                            для передачи таких небольших чисел.
                            Но чтобы не было ни каких задержек тормажений?
                              нет, читайте доки, они рулез:)
                              один такт-8MHz
                              машинный цикл состоит у твоего пика из четырех тактов, т е 2MHz
                              т е это я тебе сказал для твоего кварца
                                ExpandedWrap disabled
                                  Один цикл при твоем кварце 2MHz=2000000Hz

                                Мой кварц вобще-то 8Mhz
                                ExpandedWrap disabled
                                  т е это я тебе сказал для твоего кварца


                                ExpandedWrap disabled
                                  Что лучше использовать 2Mhz или 8Mhz
                                  для передачи таких небольших чисел.
                                  Но чтобы не было ни каких задержек тормажений?
                                  еше раз обьясняю, машинный цикл и тактовая частота разные вещи
                                  считай машинным циклом время выполнения самой быстрой команды
                                  у PIC16 два типа команд, одни выполняются за один машинный цикл, другие за два, есть правда команды, время выполнение которых зависит от результата
                                  у PIC16 один машинный цикл = 4 такта, т е я тебе привел вычисления для кварца 8MHz
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0561 ]   [ 15 queries used ]   [ Generated: 3.05.24, 16:36 GMT ]