Форум » Для начинающих. » Непонятная команда » Ответить

Непонятная команда

Dmitro: Здравствуйте уважаемые! Подскажите пожалуйста, как осмысливается команда org ($ & 0xFF00)+0x0100 для PIC16F84A. То что переход- понятно, вопрос как(ой)? После импорта .HEX кода в MPlab смотрю память программ и вижу что в результате выполнения этой команды происходит досчет адреса до 100. Как сие понимать? Растолкуйте, плз.

Ответов - 22

MAZ: ($ & 0xFF00)+0x0100 На всякий случай, напомню. РС – 13 разрядный счетчик команд, указывает адрес выбираемой команды. Состоит из двух регистров PCL и PCH, РСL доступен пользователю для записи и чтения. PCH не доступен пользователю. Для обращения к нему используется дополнительный регистр PCLATH. Вся память разбита (для 84) на 4 блока памяти. В каждом блоке памяти сохраняется значение PCL (256). значок & , обозначает логическую операцию И 0хFF00 - маска для счетчика PC. По логике операции "И" сохраняем значение PCH и сбрасываем в 0 значение PCL. Т.е. выполняя goto ($ & 0xFF00)+0x0100 компилятор сохранят текущее значение PCLATH и выбирает 0х100 адрес в текущем блоке PCL. Так как для 84 значение PCLATH может принимать только 4 значение (1024/256) то учитывается в каком блоке находится данная команда. Для 84 мне кажется совершенно не нужная команда, проще goto metka. Хотя, надо внимательно посмотреть, где стоит эта команда. Возможно, что-то связано с выч. переходом. В лабе операции с PC удобно смотреть в панели "вид"(Wiev) -> "память программы" (Program Memory)

Alex: MAZ пишет: Возможно, что-то связано с выч. переходом.Скорее всего. Данная строка указывает на начальный адрес следующего блока памяти. Т.е. идущие за ней команды будут лежать в следующем блоке памяти.

Dmitro: Спасибо! Доходчиво разжевано, буду переваривать


Вячеслав: Dmitro пишет: как осмысливается команда org ($ & 0xFF00)+0x0100 для PIC16F84A. Осмелюсь дополнить маленьким замечанием разъяснения MAZ. Знак $ довольно коварен в использовании, означает "текущий" или здесь "от текущего". Вся приведенная команда меняет значение счетчика адреса. Посылает стартовый адрес куда надо конкретно ( и пусть там стоит метка). Начинающему нередко приходится исправлять программу (сверху или снизу) в отношении строки команды с таким знаком. А тогда- эта посылка уже не попадет на эту метку из-за этих исправлений. Хорошо, если программа короткая. А, если 6 листов? Можно и забыть (что со мной и бывало), что есть где-то этот знак. Делаю как MAZ - goto metka. У pic16f84 есть только 2 банка памяти, по сути управление ими сводится к изменению значения только одного разряда - RP0 регистра STATUS (RP1 -для данного МК всегда 0). А это проще.

MAZ: Наверно именно это запись, т.к. учитывает текущий блок памяти и даже страницу не сделает ошибку. Если просто $- или +, рискованно. Эта запись по сути не плохая на мой взгляд, и даже удобная. Если несколько страниц в памяти программ. Но тут речь про 84. А там и памяти программ почти нет, пол страницы. Помню Тестер тоже рекомендовал исключать из текстов $, чтобы потом не искать лишних ошибок. А вот goto metka, при переходе из одной страницы в другую не пройдет. Т.к. команда goto имеет 11 разрядную адресацию, а счетчик РС 13 разрядов. Я как то пытался кратенко объяснить своими словами эту простую вещь, которые многие считают очень сложной. Даже почти написал статью. Но друзья отговорили, типа опять самоучитель получится. Но там без летающих коров, ножей в спину, кирпичей и т.д. Всего 5-6 листиков и тема закрыта.

Вячеслав: MAZ пишет: Даже почти написал статью. Грамотный переход по адресному пространству - не такое простое дело. Судя по обилию статей, рекомендаций и указаний по вопросу. Вот и мой вопрос: При написании программ на С для PIC довольно часто используются вставки asm кода (куда же без них, для повышения быстроты реакции?). Компилятор регулирует процесс перехода по пространству адресов. Конструктор не думает об этом. Вопрос: Как исказится выполнение алгоритма (и исказится ли?), если во вставках будут применены команды типа goto metka, org ($ бла,бла..) и т.п.? Как грамотно отследить такое искажение? MAZ пишет: Всего 5-6 листиков и тема закрыта. Может быть вопрос мой надуман (хочется постелить соломки) или есть на него ответ в твоих листочках?

MAZ: Конечно, но для для среднего семейства есть. И в принципе нормально пользуюсь. Но тут про Си, в котором я не силен. Тем более как отследить искажения на Си не знаю. Хотя если декомпилировать нех файл, то в принципе те же методы применяются, их видно. Но конструкции $ там не наблюдается. Для того чтобы грамотно отследить, на мой взгляд, надо тупо страховаться, если программа в нескольких страницах при выполнение call и goto операторами High Lov. "movlw High «метка в программе»", при переходе границы блока "movlw Lov «метка в программе»". Или совместно эти операторы. Естественно goto $, это не метка, а команда прибавить к PCL какое это число. Определить какой будет результат сложно. Например. текущее значение PCL 0xFA После выполнения команды goto $+2, PCL =0xFA+2=0xFC и все отлично. Предположим разработчик добавил 5 команд перед $+2 и перед выполнением этой команды адрес в PCL станет 0xFF. прибавляем 2 и оказываемся на 0x01 только этого же блока. Счетчик PCL переполнился, но переполнение не ушло в PCH, для выбора следующего блока. Однозначно, сбой программы. Поэтому goto metka верней, т.к. в пределах одной страницы памяти работает четко.

Alex: На Си, "правильные пацаны" , вообще не применяют операторы goto.

MAZ: нет имелось в виду вставки на асм. А там бывают и не правильные пацаны.

Вячеслав: MAZ пишет: нет имелось в виду вставки на асм Без вставок asm в С не обойтись. Может - очень коротких. Например - прием с досчётом в частотомере на С. Пока отслеживаю так: возвратно поступательно - компилирую исходник на С( с простой вставкой кода на asm), получаю proj.asm . Возвращаюсь в MPLAB (куда же без неё?). Ставлю этот файл в проект. Затем компилирую с помощью HI-TEACH, и если все срастается как надо, отлаживаюсь в MPLAB. Вот, пока так. Сложных вставок не писал, компилятор С ругается. Надо знать asm, с которым дружит компилятор С, и сам компилятор разумеется - BoostC. Оператор goto использую, наверное не совсем правильный пацан MAZ - спасибо. Упрусь в переходы, обращусь как к спецу.

MAZ: Могу кинуть черновик статьи. Немножко не до деланно. Но будет понятно, надеюсь. В личку свой адрес, на мыло и кину. Я не спец. Просто как будто когда то разобрался сам. Наверно, будет время до пишу и на чипмк выложу.

Вячеслав: MAZ пишет: Могу кинуть черновик статьи. Буду благодарен. На форумы часто не выхожу. Зарылся в С. Для меня это новое. Как представляю, без вставок asm работать с МК и с железом нельзя. Отсюда и забота. С уважением.

MAZ: Да, но я здесь в личке адреса, не получил. Отправлю тогда на что было в профиле.

Alex: Вячеслав пишет:Без вставок asm в С не обойтись.Приведите подобный пример, где без АСМа никак. Вячеслав пишет:получаю proj.asm . Возвращаюсь в MPLAB (куда же без неё?). Ставлю этот файл в проект. Затем компилирую с помощью HI-TEACH, и если все срастается как надо, отлаживаюсь в MPLAB. Вот, пока так. А не проще зайти в дизасм и "подсмотреть" что натворил HI-TECH ? Вячеслав пишет:компилятор С ругается Так Вы спрашивайте, вдруг кто знает как решить проблему. Вячеслав пишет:Оператор goto использую, наверное не совсем правильный пацан Я же в шутку сказал, без обид

Вячеслав: Аlex пишет: Приведите подобный пример, где без АСМа никак. С примером позже. Думается, для минимизации кода это может потребоваться. Для PIC c малой памятью. Дело во FlowCode ослажняетяся тем, что он не симулирует компилятор С и вставки asm игнорирует. Остается проверка работы вставок в Proteus или железе (ну и MPLAB). Пока осваиваю С. Вопрос может был задан не к месту. Баламут. Доброе отношение публики ценю. MAZ пишет: Отправлю тогда на что было в профиле Получил, ответ отправил. Благодарен.

Habble: А при переходе на другую страницу памяти можно и так делать: ;---работаем на 0-й странице---- .......... .......... PAGESEL metka call metka PAGESEL 0 .......... .......... ;---работаем на других страницах---- metka: .......... .......... RETURN Есть же удобные директивы: PAGESEL - для автоматического определения метки и BANKSEL - для автоматического определения банка памяти.

MAZ: Habble пишет: ;---работаем на других страницах---- metka: .......... .......... RETURN странно а если со второй надо перейти на третью. Может, не правильно выразился? lcall может имелось в виду? PAGESEL для возврата

Dmitry Dubrovenko: Вячеслав пишет: Вся приведенная команда меняет значение счетчика адреса.Я, конечно, извиняюсь, но насколько помню, org - директива, а не команда. И чего сия строка означает, я, честно говоря, что-то никак понять не могу.

Habble: MAZ пишет: странно а если со второй надо перейти на третью [pre2] LIST p=16f877a ;устанавливаем тип микроконтроллера __CONFIG 03F71H ;задаем слово конфигурации, бит защиты выключен, WDT выключен, ;стандартный XT - генератор. include "P16F877A.inc" REG_1 EQU 20 REG_2 EQU 21 REG_3 EQU 22 ORG 0 ;НАЧАЛО СТРАНИЦЫ 0 GOTO START ;ИДЕМ НА НАЧАЛО ПРОГРАММЫ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№---ПП ЗАДЕРЖКИ---№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ PAUSE: ; Длительность задержки 1 секунд ; Частота задающего генератора 4 МГц movlw .254 movwf REG_1 movlw .17 movwf REG_2 movlw .6 movwf REG_3 decfsz REG_1,F goto $-1 clrwdt decfsz REG_2,F goto $-4 decfsz REG_3,F goto $-6 nop nop RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ START: ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№---ИНИЦИАЛИЗАЦИЯ МК---№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ CLRF PORTC ;ОЧИСТИТЬ ПОРТ С BANKSEL TRISC ;АВТОВЫБОР БАНКА TRISC CLRF TRISC ;PORTC НА ВЫХОД BANKSEL 0 ;ВЫБИРАЕМ НУЛЕВОЙ БАНК ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ BSF PORTC,0 ;ЗАЖЕЧЬ ЖЕЛТЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 0-ОЙ СТРАНИЦЫ) CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. PAGESEL STRANICA_1 ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ STRANICA_1 CALL STRANICA_1 ;ВЫЗВАТЬ STRANICA_1 GOTO START ;ВСЕ СНАЧАЛА ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ORG 0X800 ;НАЧАЛО СТРАНИЦЫ 1 STRANICA_1: BCF PORTC,0 ;ТУШИМ ЖЕЛТЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 0-ОЙ СТРАНИЦЫ) BSF PORTC,1 ;ЗАЖИГАЕМ КРАСНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 1-ОЙ СТРАНИЦЫ) PAGESEL PAUSE ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ PAUSE CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. PAGESEL STRANICA_2 ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ STRANICA_2 GOTO STRANICA_2 ;ПЕРЕЙТИ НА STRANICA_2 ORG 0X1000 ;НАЧАЛО СТРАНИЦЫ 2 STRANICA_2: BCF PORTC,1 ;ТУШИМ КРАСНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 1-ОЙ СТРАНИЦЫ) BSF PORTC,2 ;ЗАЖИГАЕМ ЗЕЛЕНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 2-ОЙ СТРАНИЦЫ) PAGESEL PAUSE ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ PAUSE CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. PAGESEL STRANICA_3 ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ STRANICA_3 GOTO STRANICA_3 ;ПЕРЕЙТИ НА STRANICA_3 ORG 0X1800 ;НАЧАЛО СТРАНИЦЫ 3 STRANICA_3: BCF PORTC,2 ;ТУШИМ ЗЕЛЕНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 2-ОЙ СТРАНИЦЫ) BSF PORTC,3 ;ЗАЖИГАЕМ СИНИЙ СВЕТОДИОД (ИНДИКАЦИЯ 3-ОЙ СТРАНИЦЫ) PAGESEL PAUSE ;ВЫБРАТЬ СТРАНИЦУ МЕТКИ PAUSE CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. PAGESEL 0 ;ВЫБИРАЕМ НУЛЕВУЮ СТРАНИЦУ RETURN ;ВОЗВРАЩАЕМСЯ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ END [/pre2] Поюзать в симуляторе Proteus 7.7 - http://www.fayloobmennik.net/1275106 MAZ пишет: lcall может имелось в виду? PAGESEL для возврата Да, можно и так работать... [pre2] LIST p=16f877a ;устанавливаем тип микроконтроллера __CONFIG 03F71H ;задаем слово конфигурации, бит защиты выключен, WDT выключен, ;стандартный XT - генератор. include "P16F877A.inc" REG_1 EQU 20 REG_2 EQU 21 REG_3 EQU 22 ORG 0 ;НАЧАЛО СТРАНИЦЫ 0 GOTO START ;ИДЕМ НА НАЧАЛО ПРОГРАММЫ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№---ПП ЗАДЕРЖКИ---№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ PAUSE: ; Длительность задержки 1 секунд ; Частота задающего генератора 4 МГц movlw .254 movwf REG_1 movlw .17 movwf REG_2 movlw .6 movwf REG_3 decfsz REG_1,F goto $-1 clrwdt decfsz REG_2,F goto $-4 decfsz REG_3,F goto $-6 nop nop RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ START: ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№---ИНИЦИАЛИЗАЦИЯ МК---№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ CLRF PORTC ;ОЧИСТИТЬ ПОРТ С BANKSEL TRISC ;АВТОВЫБОР БАНКА TRISC CLRF TRISC ;PORTC НА ВЫХОД BANKSEL 0 ;ВЫБИРАЕМ НУЛЕВОЙ БАНК ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ BSF PORTC,0 ;ЗАЖЕЧЬ ЖЕЛТЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 0-ОЙ СТРАНИЦЫ) CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. LCALL STRANICA_1 ;ВЫЗВАТЬ STRANICA_1 PAGESEL START ;РАБОТАЕМ НА 0-ОЙ СТРАНИЦЕ CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. LCALL STRANICA_2 ;ВЫЗВАТЬ STRANICA_2 PAGESEL START ;РАБОТАЕМ НА 0-ОЙ СТРАНИЦЕ CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. LCALL STRANICA_3 ;ВЫЗВАТЬ STRANICA_3 PAGESEL START ;РАБОТАЕМ НА 0-ОЙ СТРАНИЦЕ CALL PAUSE ;ЗАДЕРЖКА 1 СЕК. GOTO START ;ВСЕ СНАЧАЛА ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ORG 0X800 ;НАЧАЛО СТРАНИЦЫ 1 STRANICA_1: BCF PORTC,0 ;ТУШИМ ЖЕЛТЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 0-ОЙ СТРАНИЦЫ) BSF PORTC,1 ;ЗАЖИГАЕМ КРАСНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 1-ОЙ СТРАНИЦЫ) RETURN ORG 0X1000 ;НАЧАЛО СТРАНИЦЫ 2 STRANICA_2: BCF PORTC,1 ;ТУШИМ КРАСНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 1-ОЙ СТРАНИЦЫ) BSF PORTC,2 ;ЗАЖИГАЕМ ЗЕЛЕНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 2-ОЙ СТРАНИЦЫ) RETURN ORG 0X1800 ;НАЧАЛО СТРАНИЦЫ 3 STRANICA_3: BCF PORTC,2 ;ТУШИМ ЗЕЛЕНЫЙ СВЕТОДИОД (ИНДИКАЦИЯ 2-ОЙ СТРАНИЦЫ) BSF PORTC,3 ;ЗАЖИГАЕМ СИНИЙ СВЕТОДИОД (ИНДИКАЦИЯ 3-ОЙ СТРАНИЦЫ) RETURN ;ВОЗВРАЩАЕМСЯ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ END [/pre2] Поюзать в симуляторе Proteus 7.7 - http://www.fayloobmennik.net/1275136 Дополнительной проблемой при работе на разных страницах памяти может быть чтение таблиц, тут уже нужно присматриваться более тщательно где она размещена, это та еще головоломка, хотя и вполне решаема.

MAZ: Все равно не понял. Как то все не законченно. PAGESEL, всего лишь корректирует 3.4 бит PCLATH. Вы перед каждым call и goto ставить будете? И плюс доп. проблема с чтением таблиц. Протеусом не пользуюсь. Не серьезно, только не бейте. Не знаю, для чтения таблиц возможно тоже есть макрос. Пока обходился по старинке. Hign и Lov На все случаи жизни. Вот простой пример. Работаем со всем PCLATH и со всем PCL. Контролируем таблицу, верней не обращаем внимание на пересечение таблицей блоков памяти. [pre2] list p=16f877a #include <p16f877a.inc> ERRORLEVEL -302,-305,-306 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF CBLOCK 0x020 temp ; временный регистр проходов reg ; регистр сохранения числа проходов ENDC org 0x000 goto Start Start ; пример программы из работы с МЭЛТ 12864А movlw .255 ; movwf temp ; записать во временный регистр число проходов WR_4 movf temp,W ; Копирование содержимого регистра temp в W. sublw .255 ; ..255 - temp = ... (результат записывается в W). movwf reg ; reg сохраняем число для перехода ;------------------------------------------------------------------------------------------------------------------------------------------------------------------- movlw high TEXT_4 ; записать старший байт счетчика команд метки TEXT_4 в w movwf PCLATH ; записать W в PCLATH (выбрали страницу памяти где наход. метка TEXT_4) call TEXT_4 ; Переход в ПП TEXT_4. ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------- movwf PORTD ; записать константу из выч. перех. в PORTD ;---------------------------------------------------------------------------------------------------------------------------------------------------------------- movlw high zap_dan ; записать старший байт счетчика команд метки zap_dan в w movwf PCLATH ; записать W в PCLATH call zap_dan ; записать данные ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------- decfsz temp,F ; Подготовка к выводу на индикацию следующего перехода goto WR_4 ; Если результат декремента не=0, то переход в ПП WR_4 movlw high m1 ; тоже самое с goto movwf PCLATH ; записать W в PCLATH goto m1 m_2 nop goto $-1 zap_dan return ; просто показал как еще раз вернуться по стеку org 0x191B ; вот другая страница, с произвольным адресом. TEXT_4 movlw high ctpa_4 ; записать старший байт счетчика команд метки ctpa_4 в w movwf PCLATH ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 ) movf reg,w ; переслать в w (насколько перейдем) addlw low ctpa_4 ; cложить w и младший байт PC метки ctpa_4 btfsc STATUS,C ; проверить бит С (переполнение) incf PCLATH,f ; было, +1 к PCLATH movf reg,w ; не было,просто выч. переход. addwf PCL,F ; Приращение PCL на величину содержимого W. ctpa_4 dt 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16 dt 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32 dt 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48 dt 0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64 dt 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16 dt 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32 dt 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48 dt 0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64 dt 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16 dt 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32 dt 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48 dt 0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64 dt 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16 dt 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32 dt 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48 dt 0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63 m1 nop nop movlw high m_2 ; записать старший байт счетчика команд метки m_2 в w movwf PCLATH ; если помним, m2 в 1 странице, можно просто goto m_2 end[/pre2]

Habble: Ну,....мой код как новичка сойдет А так то нужно делать все толково! MAZ Спасибо вам за исходник , мне уже говорили так делать, но я все до конца не понял как и что там делается, но знаю по опыту, не нужно пугаться чего то не знакомого, лучше разобраться раз и на всегда Не пользуетесь протеусом? Я уже без него не представляю разработку, хороший симулятор, можно увидеть много чего интересного в своем коде во время отладки А с MPLAB у меня не получается, он хорош, но не может вести отладку в живую с включенным WDT, а у меня проги в основном написаны с задействованием WDT, сам не знаю для чего его использую, типа для надежности. А вы MAZ используете WDT?

MAZ: Да я тоже, типа не "старичок". Протеус, просто для меня совершенно бесполезная и не серьезная штука. Возможно для начинающего изучение ЖК;1wire; светодиоды и т.д. будет полезно. Но чуть в сторону, бессмысленно. Или нет библиотеки, или математические способности на нуле. Все таки, на меня обижаются, это игрушка. С моделируйте простейшую вещь. Уравнивающий реактор с 12 тиристорами. Или драйвер с IGBT. Просто взять готовый модуль с SPI, и попробуйте его там протестировать. Особенно. если его в библиотеке нет. Очень много условностей. И сразу поймете, что это игрушка. Не давно, кто то из друзей мучился. В Протеусе все работает, в железе нет. Не помню причину, но зачем так мучиться? На мой взгляд, любой внутрисхемный отладчик даст реальный результат. Вспомнил. Коротил выход пика при прямом опросе порта. Выручило, опрос флага, а не порта. Протеус на ура, в железе нет. В MPLAB есть логический анализатор, с ним удобно отлаживать прямо в симуляторе. Раньше лепил сторожевой таймер без всякого смысла. Здесь можно почитать и про него тоже. Хорошо написано.



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