Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 23

Тема: Помогите разобраться с MPLAB

  1. #1

    Помогите разобраться с MPLAB

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

    call LCDTable
    movwf r0
    …………………………………………………… …………………………………………………
    …………………………………………………… ……………………………………………………
    decfsz Count1
    goto vyv_1
    bcf PortA,blink

    return
    ;******************* ******************** *****************
    ; Таблица кодов индикатора
    ;******************* ******************** *****************

    LCDTable
    addwf PC,f ; W + PC -> PC

    retlw b'00000010' ;data 0
    retlw b'10011110' ;data 1
    retlw b'00100100' ;data 2
    .................... .................... ......

    Встретился с проблемой, которой никогда не было. При отладке в MPLAB Sim благополучно доходим до
    addwf PC,f (выделил цветом)
    при выполнении следующего шага происходит переход куда попало, но не на нужную. Например, если в регистре w единица, должен выполняться переход на
    retlw b'10011110' ;data 1
    Причем, в счетчике команд указатель счетчика и содержимое w суммируется правильно. Переполнения младшего байта счетчика (PCL) нет.
    Сколько раз пользовался этим фрагментом, никогда никаких проблем не было.
    Что я мог сделать не так?


  2. #2
    call LCDTable
    movwf r0
    …………………………………………………… …………………………………………………
    …………………………………………………… ……………………………………………………
    decfsz Count1
    goto vyv_1
    bcf PortA,blink

    return
    ;******************* ******************** *****************
    ; Таблица кодов индикатора
    ;******************* ******************** *****************

    LCDTable
    addwf PC,f ; W + PC -> PC

    регистр PCL должен быть в этой строке. и смотри внимательно не переходишь ли ты в другой банк памяти.

  3. #3
    Цитата Сообщение от rv6hg Посмотреть сообщение
    регистр PCL должен быть в этой строке. и смотри внимательно не переходишь ли ты в другой банк памяти
    Заменил на PCL, результат то же (разницы нет, как его обозвать, главное чтобы он был определен в шапке программы под этим именем или в файле .inc).
    В другой банк тоже не перехожу.
    Вот обратите внимание на скрин: значение счетчика команд PCL (обведено), там сейчас 95 (5F) значение записанное в W, там сейчас 0. При выполнении команды
    addwf PCL,f, PCL должен увеличиться на единицу PCL=PCL+N+1, где N сейчас равно нулю. То есть должно быть 96(60). Как видите, перехода в другой банк нет.
    Делаем следующий шаг...

    Минуту.... Что-то тут не так.. Вот я еще окно открыл.. Видите обведено. Указатель счетчика 015F, это 351 впосле добавления единицы он должен быть 0160, а у меня происходит переход на команду под номером 0060. Где пропадает единица? Ведь в PCL число может быть до 256, то есть он не переполняется. Везьде в руководствах указано, что при выполнении команды рассчитанного перехода, недопускается переполнение PCL, так как PCH пи этом не инкрементируется и будет ошибка, но тут же переполнения нет, а единица просто где-то теряется...
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Безымянный.JPG 
Просмотров:	227 
Размер:	347.1 Кб 
ID:	123439   Нажмите на изображение для увеличения. 

Название:	Безымянный_1.JPG 
Просмотров:	166 
Размер:	440.2 Кб 
ID:	123440  
    Последний раз редактировалось Владимир_К; 02.11.2012 в 12:10.

  4. #4
    Когда-то давно встречался с этим, но уже не помню что точно было. Скорее всего все-таки будь внимателен с банками и внимательно смотри предупреждения после компиляции.
    Вот фрагмент моей таблицы. Все работает на ура.

    ;******************* ******************** ******************** ********
    ;----------------------------------------------
    ; разместим здесь таблицы т.к. рег PCL не работает а адр. более одного байта
    org 0x0800
    ;******************* ******************** ******************** ********
    ;******************* ******************** ******************** ***
    ;таблицы
    table_1
    clrwdt
    movfw band
    addwf PCL,f
    nop
    retlw h'07' ;1
    retlw h'07' ;2
    retlw h'07' ;3 1.8
    retlw h'07' ;4


    retlw h'0D' ;5
    retlw h'0D' ;6
    retlw h'0E' ;7
    retlw h'0E' ;8 3.5
    retlw h'0E' ;9
    retlw h'0E' ;10


    retlw h'1B' ;11
    retlw h'1B' ;12 7.0
    retlw h'1B' ;13
    retlw h'1B' ;14

  5. #5
    Цитата Сообщение от rv6hg Посмотреть сообщение
    Скорее всего все-таки будь внимателен с банками и внимательно смотри предупреждения после компиляции.
    Тут закрадывается догадка, что в этой версии при выполнении вычисляемых переходов отладчик берет во внимание только те цифры, что видны в окошке Special Function Register. В окошке мы видим 5F, на самом деле адрес этой команды 15F. Добавляем единицу, будет 160, а он тупо переходит на 60, единицу проигнорировал.
    Скорее всего, надо озаботиться тем, чтобы эти команды и таблица были там, где адреса не содержат единицы в третьем разряде, то есть должно быть 00ХХ, но не 01ХХ. Сейчас переделаю программу, отпишусь..

    Да, все верно. Перенес таблицу в начало программы. Теперь все нормально. Надо наверное другой MPLAB ставить. У меня еще 5.70.00. Пока вроде устраивал...
    Кстати, если посмотреть на окошко указатель стека, то там адрес возврата указан то правильно. Наверное эта версия MPLAB только с командой retlw глючит...
    Последний раз редактировалось Владимир_К; 02.11.2012 в 12:43.

  6. #6
    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Сколько раз пользовался этим фрагментом, никогда никаких проблем не было.
    Что я мог сделать не так?
    Скорее всего проблема не в MPLAB.
    Посмотрите в приложении как должно вызываться табличное чтение.
    Перед вызовом программы табличного чтения нужно предварительно
    занести в регистр PCLATH старший байт адреса таблицы.

    Владимир.
    Вложения Вложения
    Последний раз редактировалось UA0LFK; 02.11.2012 в 13:24.

  7. #7
    Цитата Сообщение от UA0LFK Посмотреть сообщение
    Перед вызовом программы табличного чтения нужно предварительно
    занести в регистр PCLATH старший байт адреса таблицы.
    Да, Вы совершенно правы!!! Спасибо. Теперь все нормально, и не надо думать, где ее размещать эту таблицу. Надо лишь малость подправить программку, так как после чтения PCLACH я в W потерял код цифры. Но это мелочи...
    И еще один вопрос... Почему при запуске симулятора в автоматическом режиме, чтобы быстро пройти до точки останова (для определения времени работы в этом отрезке), первый раз время прохода порядка нескольких секунд (время выдержки, заданное в программе - 100 миллисек.) Второй раз это довольно долго. Диспетчер задач показывает, что процессор не загружен. Чем это можно обьяснить? Сейчас приходится закрывать программу, открывать проект по новой и запускать. Иначе, второй раз очень долго.
    Последний раз редактировалось Владимир_К; 02.11.2012 в 14:50.

  8. #8
    На размещение таблицы в любом месте программы есть ограничения.
    Таблица должна располагаться внутри области адресов PCL от 00 до FF.
    Иначе при переходе через адрес FF нужно снова изменять значение записаное в регистр PCLATH.
    Поэтому при размещении таблицы по произвольному адресу нужно усложнять
    программу работы с таблицей так, чтобы она сама отслеживала переход адреса PCL через FF
    и корректировала значение PCLATH.

    Или поступить проще - разместить таблицу в начале программы и проверить
    не пересекает ли таблица границу адресов самому.
    В дальнейшем при изменении программы таблица будет оставаться на старом месте.

    По поводу работы задержек.
    У меня программы задержки в симуляторе работали не корректно.
    Задержки получались во много раз больше чем в реальной программе.
    Поэтому на период работы с симулятором я делал задержки минимальными.

    Про отличие работы при первом запуске и при повторных ничего сказать не могу.
    Если при повторном запуске начинать работу c RESET все должно работать одинаково.

  9. #9
    Аватар для UN7GCE
    Регистрация
    18.01.2004
    Адрес
    РФ ТиНАО
    Сообщений
    2,212
    Записей в дневнике
    1
    Позывной
    ex UN7GCE
    Цитата Сообщение от UA0LFK Посмотреть сообщение
    На размещение таблицы в любом месте программы есть ограничения.
    Таблица должна располагаться внутри области адресов PCL от 00 до FF.
    Иначе при переходе через адрес FF нужно снова изменять значение записаное в регистр PCLATH.
    Поэтому при размещении таблицы по произвольному адресу нужно усложнять
    программу работы с таблицей так, чтобы она сама отслеживала переход адреса PCL через FF
    и корректировала значение PCLATH.
    Совершенно верно! И делается это так:
    ;******************* ******************** ******************** ***********
    ; Применение вычисляемого перехода
    ; (преобразуем двоично-десятичный код в код 7-сегментника)
    ;******************* ******************** ******************** ***********
    TABLE movlw high PC_ADR
    movwf PCLATH
    movf LD,W
    addlw low PC_ADR
    btfsc STATUS,C
    incf PCLATH,F
    movf LD,W
    addwf PCL,F ;содержимое счетчика команд PC увеличивается
    ;на величину содержимого аккумулятора W
    ;EDCGBAFH
    PC_ADR retlw b'11101110' ;EDC.BAF. = 0 скачек по таблице 0000
    retlw b'00101000' ;..C.B... = 1 0001
    retlw b'11011100' ;ED.GBA.. = 2 0010
    retlw b'01111100' ;.DCGBA.. = 3 0011

    '''''''''''''''''''' '''''''''''''''''''' '''''''''''''''''''' '''''''''''''''''''' '''''''
    И теперь можно работать из любого места памяти.

    Добавлено через 5 минут(ы):


    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Почему при запуске симулятора в автоматическом режиме, чтобы быстро пройти до точки останова (для определения времени работы в этом отрезке), первый раз время прохода порядка нескольких секунд (время выдержки, заданное в программе - 100 миллисек.) Второй раз это довольно долго. Диспетчер задач показывает, что процессор не загружен.
    Внимательней просмотрите исходник, - это Ваш косяк.

    Добавлено через 21 минут(ы):

    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Надо наверное другой MPLAB ставить. У меня еще 5.70.00.
    Версии MPLab ни при чём. Но, лично я работаю в 6,40. Компактный и есть цветовое деление исходника, что здорово помогает. В отличие от 570, где всё уныло черное. Высокие версии (8,00 и далее) страшно громоздкие, напихано чёрти-что. Ну, это на любителя.
    Последний раз редактировалось UN7GCE; 03.11.2012 в 05:20.
    Евгений (since 1975 UL7RAW, 1977 UL7GCE, 1991 UN7GCE) пос. Коммунарка


  10. #10
    Цитата Сообщение от UA0LFK Посмотреть сообщение
    Или поступить проще - разместить таблицу в начале программы и проверить
    не пересекает ли таблица границу адресов самому.
    В дальнейшем при изменении программы таблица будет оставаться на старом месте.

    По поводу работы задержек.
    У меня программы задержки в симуляторе работали не корректно.
    Задержки получались во много раз больше чем в реальной программе.
    Поэтому на период работы с симулятором я делал задержки минимальными.
    Добрый день! Что-то я отвлекся, пропустил новые сообщения...
    Да я сначала так и сделал. Выше я писал, перенес таблицу в начало программы. Потом решил все же проверить с размещением в любом месте. В симуляторе все показало нормально. Но. Включил частотомер. На индикаторе цифры 671167, вместо нулей. Подозреваю, что дальше тоже бы стояло две 11. Но у меня индикатор собран давно, на 6 цифр, а двигал я на восемь. Заподозрил, что что-то опять не то с обращением к таблице. После обращения, добавил команду сброса PCLATH. Стало работать нормально.
    Но, Вы правы, лучше ее размещать вначале и не морочить голову.
    С задержками тоже нормально. Заданный цикл выдерживает практически точно. Немного скомпенсировал подстроечником.
    При отладке, понятно, я или коэффициенты беру малыми или вообще кусок программы обхожу.

    Цитата Сообщение от UN7GCE Посмотреть сообщение
    Внимательней просмотрите исходник, - это Ваш косяк
    Так а что там может быть? Я же программу не меняю. Просто закрываю проект, потом открываю снова. Все работает нормально. Но не один раз, как я думал, а даже несколько. Потом почти в сотню раз начинает работать медленнее. В окошке Stopwatch, если работает нормально, цифра времени прохода меняется примерно на 1,0-1,5 миллисекунды за секунду работы симулятора, а потом всего на десяток микросекунд. Представьте, сколько приходится ждать, если задана например задержка - 100 миллисек.
    Причем это проход участка программы, где нет ничего, влияющего на время. Вычитается единица, проверяется ноль или нет, не ноль-еще цикл, ноль-возврат, и точка останова. Все. Где там можно накосить? Хотя согласен, наверное можно.. Но как, хотя бы знать, что может это вызвать?
    Поставил версию 5.70.40. Теперь вроде нормально. (А может так кажется)

    Цитата Сообщение от UN7GCE Посмотреть сообщение
    Версии MPLab ни при чём. Но, лично я работаю в 6,40.
    Надо будет поставить, если бесплатный. Вы правы, унылый он. AVR Studio как то больше нравится, с ним и больше работал.
    Но, теперь новая задача. Пытаюсь малость разобраться с С++. Пока туго продвигается. Видать мозги уже высыхают. Собрал почти все железо SDR трансивера по схеме от UR4QBP, но синтезатор работает не корректно. А он его благополучно забросил (на AD9832), перешел на другую ДДС и отказался от PLL. Теперь у него синтезатор прямого синтеза. Оно и понятно,там ничего настраивать не надо.
    За кусок кода, спасибо, пригодится.
    Последний раз редактировалось Владимир_К; 21.11.2012 в 12:22.

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Полосовой фильтр
    от Rulya в разделе Технический кабинет
    Ответов: 18
    Последнее сообщение: 09.11.2011, 13:46
  2. Вопрос по MPLAB IDE
    от RU0ANX в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 11
    Последнее сообщение: 05.08.2010, 18:53
  3. БП для миниЕС
    от UY3IG в разделе Технический кабинет
    Ответов: 15
    Последнее сообщение: 24.09.2007, 21:33
  4. подключить устройство через преобразователь RS232 <> ИРПС
    от ГЕША в разделе Технический кабинет
    Ответов: 5
    Последнее сообщение: 17.05.2007, 07:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •