Форум » Программирование микроконтроллеров. » Особенности работы с PIC16F887 » Ответить

Особенности работы с PIC16F887

maxx: При компиляции даже тип процессора не определяется + половина команд и меток. Видимо, даже оформление шапки имеет какие-то особенности. По даташиту похож на 877А, система команд, регистры. Может кто работал с таким м\к?

Ответов - 32

Ewgen: А по-подробнее,как это:половина команд не определяется? Попробуйте использовать шапку из c:\Program Files\Mocrochip\MPASM Suite\Template\Code

maxx: Вот что выдает компилятор: MPASM LED887.asm /q MPASM.EXE reported error code (1L). Extracting debug data from LED887.LST... Error[132] :Unknown processor (16F887) 00001 LIST p=16f887 Error[131] :Processor type is undefined ............................................... Error[122] :Illegal opcode (TrisD) ............................................... Error[122] :Illegal opcode (movlw) ............................................... Error[122] :Illegal opcode (bcf) В скобки Illegal opcode он записывает все: команды, названия регистров( общих и спец) метки, числа. С шапкой из c:\Program Files\Mocrochip\MPASM Suite\Template\Code делает тоже самое А вот с 16f877А эта же программа работает идеально. Шапки у них оформляются одинаково. Может я какую особенность не улавливаю?

Alberto: А версия MPLAB'а какая? И, если можно, приведите весь код или еще лучше выложите в виде zip'а.


maxx: MPLAB с сайта http://ikarab.narod.ru/ + MPASM в Proteus'е дают одинаковый результат. Есть еще MPLAB IDE v 8.30, но с ним я пока не разобрался Как выложить в виде zip'а, к сожалению, не знаю. Это обыкновенный "бегущий огонь", с переключением направления кнопкой. (аналог проги из PicKit 2 Debug Express.) LIST p=16F887 __CONFIG 03F32h ;Регистры спец. назначения. OptionR equ 01h PCL equ 02h Status equ 03h PortA equ 05h TrisA equ 05h TrisB equ 06h PortB equ 06h PortC equ 07h TrisC equ 07h PortD equ 08h TrisD equ 08h PortE equ 09h TrisE equ 09h IntCon equ 0Bh ;Регистры общего назначения. Del1 equ 20h Del2 equ 21h Regim equ 22h Flag equ 23h ;Вход в программу org 0 goto Start Start bsf Status,5 ;устан в 1 бит 5 регистра Status (выбор банка 1 для определения направления работы портов) movlw .1 movwf TrisB movlw .0 ;все выводы порта D на выход movwf TrisD bcf Status,5 ;------------------------------------------------- ; выбор режима работы ;------------------------------------------------- movlw .0 movwf Flag movlw .0 movwf Regim AA3 movfw Regim addwf PCL,1 goto BEG1 goto BEG2 ;------------------------------------------------- ; один бегущий огонь ;------------------------------------------------- BEG1 movlw .1 movwf PortD call Prove call Delay movlw .2 movwf PortD call Prove call Delay movlw .4 movwf PortD call Prove call Delay movlw .8 movwf PortD call Prove call Delay movlw .16 movwf PortD call Prove call Delay movlw .32 movwf PortD call Prove call Delay movlw .64 movwf PortD call Prove call Delay movlw .128 movwf PortD call Prove call Delay goto BEG1 ;------------------------------------------------- ; один бегущий огонь инверс ;------------------------------------------------- BEG2 movlw .128 movwf PortD call Prove call Delay movlw .64 movwf PortD call Prove call Delay movlw .32 movwf PortD call Prove call Delay movlw .16 movwf PortD call Prove call Delay movlw .8 movwf PortD call Prove call Delay movlw .4 movwf PortD call Prove call Delay movlw .2 movwf PortD call Prove call Delay movlw .1 movwf PortD call Prove call Delay goto BEG2 ;------------------------------------------------------ ; ПП задержки ;------------------------------------------------------ Delay movlw .100 movwf Del1 AA1 movlw .255 movwf Del2 AA2 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop decfsz Del2,1 goto AA2 decfsz Del1,1 goto AA1 return ;------------------------------------------------------- ; ПП проверки кнопки ;------------------------------------------------------- Prove btfsc PortB,0 goto Perex bcf Flag,0 AA4 return ;------------------------------------------------------- ; ПП перехода на др функц ;------------------------------------------------------- Perex btfsc Flag,0 goto AA4 bsf Flag,0 incf Regim,1 goto AA3 end

MAZ: Я думаю, что MPLAB очень старый для такого контроллера. Перейдите на более современную версию. Документация на этот контроллер на сайте микрочип датированна 2009 годом. MPLAB же пишет: Error[132] :Unknown processor (16F887) 00001 LIST p=16f887 Error[131] :Processor type is undefined Тип процессора не определен.

miv: Поверил в MPLAB v8.33, изменил шапку: LIST p=16F887 #include <p16f887.inc> __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR21V Компилятор ошибок не выдает. Проверил работу с помощью отладчика PicKit 2. Работает нормально.

MAZ: Все правильно. Так и есть.

Ewgen: Воспользуйтесь директивой include,Вы прописываете некоторые регистры спецназначения кардинально отлично от его карты регистров. К тому же в одну ячейку "загоняете" по два регистра PortA equ 05h TrisA equ 05h. И проверьте правильность синтаксиса MPASM. И меня с этим МК(из комплекта демо-платы) всё срастается .

maxx: Большое спасибо за помощь. Буду разбираться. Вот это не совсем понял: Ewgen пишет: К тому же в одну ячейку "загоняете" по два регистра цитата: PortA equ 05h TrisA equ 05h Они же в разных банках и у TrisA в 1-м банке адр точно такой же как у PortA в 0-м. Об этом еще Евгений Александрович писал в самоучителе.

Ewgen: у TrisA в 1-м банке адр точно такой же как у PortA в 0-м-это как!? Из datashet-а на PIC16F887,стр 27:PORTA-банк 0,адрес 05h,TRISA-банк 1,адрес 85h.

Алексей: Ewgen пишет: -это как!? Вспомните самоучитель и все станет ясно...

Alberto: Ewgen пишет: -это как!? именно поэтому и переключаются банки памяти. Если мы находимся в нулевом банке, то обращение к регистрам с адресами (например) 0CH, 8CH, 10CH и 18CH приведет к обращению к одному и тому же регистру 0CH, находящемуся в нулевом банке памяти данных. Поэтому и не суть важно как обозначить, главное правильно обратиться.

maxx: В datasheet-e на PIC16F87x и PIC16F84 и PIC16F62x Вы увидите тоже самое (остальные не изучал). Адрес 85h - это адрес на абсолютном адресном пространстве, которое разделено на банки(страницы) по 128 (80h) регистров в каждом, и регистр TrisA находится по адр 85h на абс. адр. пр-ве и по адр. 05h в своем 1-м банке. Т.е. 1-й банк - это область в 128 регистров, смещенная на 80h отабсолютного 0. А самое главное, что на практике такая форма записи прекрасно работает.

MAZ: Кажется все говорят об одном и том же. Понимают одинаково. Но подходят по разному. Суть то не меняется.

Ewgen: Вспомните самоучитель и все станет ясно... Вспомнил,перечитал,признаю,в чём-то был неправ.Просто пользовался директивой include.

Илья: MAZ пишет: все говорят об одном и том же. Понимают одинаково. Но подходят по разному. Суть то не меняется. Это до поры - до времени. Примеры: 1. bsf STATUS, RP0 bcf STATUS, RP1 addwf Var1 это для стандартного ядра PIC16 (Mid-Range) в новых Enhanced Mid-Range нет переключения банков через RP0, RP1 (банков стало 32шт:). но есть регистр BSR и обращение к переменной в банке N будет выглядеть так: movlb HIGH Var1 (загрузка в BSR старшей части адреса Var1) addwf Var1 Правило хорошего тона не обращаться через RP0 и RP1, а задавать адрес через BANKSEL (компилятор сам поставит правильные RP0, RP1). Тогда запись вида BANKSEL Var1 addwf Var1 будет работать одинаково на старом ядре и новом. (лирическое отступление) лично я даже не пытаюсь вникать в коды, где нет #include xxx.inc (стандартного микрочиповского файла с описанием регистров конкретного контроллера) и присутствуют записи типа bsf Status,5 и подобные - во-первых, проверять правильные ли адреса задал вопрошающий, и во-вторых, никогда не пытался запоминать номера битов в регистрах - для этого есть стандартные имена соответствующие даташиту. пример 2 (опять же для Mid-Range и Enhanced Mid-Range и совместимый код) Mid-Range: movlw high My_Function movwf PCLATH call My_Function Enhanced Mid-Range: movlp high My_Function call My_Function совместимый код PAGESEL My_Function call My_Function Мораль. Пользуйтесь средствами что вам дает компилятор, нечего изобретать свои подходы - сделаете код более понятным для других и для себя (через 2-3 года вы не поймете программу с строками типа bsf Status,5), и вдобавок сделаете код более портируемым под другие контроллеры - PIC10, PIC18)

MAZ: Илья пишет: в новых Enhanced Mid-Range Да уж. Тут в Москве не найдешь 18 пики. А про наши дали и говорить нечего.

Илья: да и появились они недавно, но суть-то не в этом, а в стиле написания программы. Согласитесь, что с BANKSEL запись гораздо понятнее чем с bcf STATUS,4 и bsf STATUS,5, а можно было вообще написать вот так: bcf 3,4 bsf 3,5 (и такие записи встречал). p.s. я не знаю есть ли это в самоучителе, если нет, то ликбез по использованию стандартных средств MPASM был бы весьма полезен.

Evgeny Korabelnikov: Илья, вся моя работа "базируется" на расстановке приоритетов. То есть, есть абсолютно четкое и сознательное разделение на "основу" (смысл/стратегия) и "обслугу" (детали/тактика). Главное - понять первое (абсолютный приоритет), а второе человек волен выбирать в соответствии со своими вкусами/привычками/и т.д. ("на вкус и цвет товарища нет"). Если "обслуга" оптимальна/выигрышна до такой степени, что человек считает нужным изменить свои вкусы/привычки, то никаких возражений против этого нет и быть не может (многовариантность только приветствуется). Если рассуждать в общем виде, то наш "царь, Бог и воинский начальник" - аргументированная и доходчивая мотивация (не в приложении ко всему человечеству, а в приложении к НАШИМ нуждам). Если что-то предлагается, и в итоге обсуждения, вопросы заканчиваются, то обсуждение прекращается "по умолчанию". После этого, люди сами решат, подходит ли им это или не подходит, или еще как-то.

Sergey Roslik: Илья пишет: BANKSEL Var1 addwf Var1 Стандартные процедуры железобетонны, никакой манипуляции. Если у меня программа работает, только в нулевом и первом банке зачем мне прописывать bcf Status,6 . А при BANKSEL работа с этим битом принудительно ведётся. Таким образом можно и макросы использовать. Но с BANKSEL программа будет читаться хуже чем с макросами, макрос можно назвать BANK1. Чтобы определиться в каком банке происходит работа прийдёться смотреть, в каком банке находится Var1. Короче, кто как привык, тот так и делает. Дело вкуса.

Илья: Согласен. Макросы это отличный инструмент, тем более что при переносе на другое железо макрос проще модифицировать, чем лопатить всю программу и разбираться с RP0:RP1. Если нужна экономия, то можно описать "разные" BANK1 (условно BANK01 и BANK1 - с RP1 и без) либо BANKSEL. Т.е. или оптимально, или универсально. Естественно, что если код пишется под 1 задачу и не предполагается его поддержка/развитие, портирование или "показать другу", то писать можно как угодно и даже через 3,5 и 3,6 ;)

Алексей: Илья пишет: bsf STATUS, RP0 Дык а чем же не нравится эта запись? Все понятно... Да и выигрышь по командам присутсвует по сравнение с BANKSEL...

MAZ: Так наверно тяжело работать, когда много банков. Но для 16 семейства, обычно определяюсь так. #DEFINE BANK0 BCF STATUS,RP0 #DEFINE BANK1 BSF STATUS,RP0 Вариантов в любом случае много.

Илья: немного неправильно меня поняли. я против записей типа bcf STATUS,5 и bsf STATUS,6 и тем более bcf 3,5 и bsf 3,6 - т.е. использования числовых значений регистров/битов вместо символьных. я против описания СТАНДАРТНЫХ регистров/битов в теле программы вместо использования СТАНДАРТНОГО #include - все это ДОПОЛНИТЕЛЬНЫЙ источник ошибок в программе. как следствие я против присвоения, к примеру, PORTA и TRISA одинаковых адресов (в этом случае MPLAB вас не предупредит что нужно следить за банками и не будет правильно работать BANKSEL). Зачем усложнять себе жизнь? проще вставить 1 строчку с #include p16F887.inc, чем сидеть с даташитом и тупо вбивать десяток строк с определением регистров. В примере выше я показывал, что применение стандартных макросов типа BANKSEL автоматически ведет к портируемости кода на новые контроллеры. Записи типа bcf 3,5 bcf 3,6 и далее movwf 0x05 (куда мы обратились - к PORTA Или TRISA?) наглядности и читабельности коду не добавляют

Sergey Roslik: Ну и я выскажу своё мнение. Я не против записей типа bcf STATUS,RP0. Я против записи bcf 3,5 и bsf 3,6. Я всегда описываю СТАНДАРТНЫЕ регистры/биты в теле программы вместо использования СТАНДАРТНОГО #include. И не считаю это ДОПОЛНИТЕЛЬНЫМ источник ошибок в программе, а наоборот, всё наглядно. Я против присвоения, к примеру, PORTA и TRISA одинаковых адресов, уж если прописываешь то пиши реальные адреса. Илья пишет: Зачем усложнять себе жизнь? проще вставить 1 строчку с #include p16F887.inc, чем сидеть с даташитом и тупо вбивать десяток строк с определением регистров. Я просто использую другой тип написания регистров (PortA. Option_Reg, Status), а с #include надо писать всё с большой буквы. При этом методе сразу видно, какие регистры используются в программе. Это ещё раз говорит о том, что сколько людей, столько и мнений. Уже не первый раз с этим сталкиваемся.

Dmitry Dubrovenko: Sergey Roslik пишет: Я всегда описываю СТАНДАРТНЫЕ регистры/биты в теле программы вместо использования СТАНДАРТНОГО #include. Я тоже так делаю, с одной поправкой. Эти описания я копирую из *.inc-файла (на который должна указывать include).

igor: Я делаю также как Дмитрий. Поэтому, перешёл на написание регистров заглавными буквами. Так даже удобнее.

Alberto: Dmitry Dubrovenko пишет: Эти описания я копирую из *.inc-файла а зачем копировать? Какой смысл? В последнее время я тоже перешёл на стандартные названия, так даже проще: знаешь название регистра и не паришься ни номером бита, ни адресом регистра. P.S. Хотя надпись PortB мне нравится больше чем PORTB. Приходится отвыкать.

RW1ZK: Alberto пишет: а зачем копировать? Какой смысл? Абсолютно никакого. Мартышкин труд и засорение текста программы. Пора-бы всем от этого отвыкнуть. Я уже как-то писал об этом на форуме. Нравится вам писАть PortB - пишите так. Подключаете в проект стандартный .inc - файл, отключаете чувствительность к регистру (Case Sensitive) и пишите хоть PoRtB.

Alberto: RW1ZK пишет: отключаете чувствительность к регистру (Case Sensitive) тоже выход.

Dmitry Dubrovenko: Alberto пишет: Какой смысл?Люблю, когда всё в одном месте. Скажу больше. Затем я ещё засоряю текст, переназначая регистры. Например, если 7-сегментный индикатор обслуживается портом B, то [pre2]PORTLD EQU PORTB ; Порт вывода 7-ми сегментного кода[/pre2] и далее, в программе, фигурирует уже PORTLD (то же относится и к отдельным битам, и константам). Таким образом, при переходе с одного типа МК на другой, достаточно изменить одну строку в "шапке".

Alberto: Dmitry Dubrovenko пишет: Затем я ещё засоряю текст, переназначая регистры... то же относится и к отдельным битам, и константам. это из другой оперы, я тоже так делаю, это удобно. А копировать inс-файл ... Прости великодушно, но не убедил.



полная версия страницы