Что значит символ "^" в данном куске кода?

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
nick458
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт июн 22, 2010 19:41:29

Что значит символ "^" в данном куске кода?

Сообщение nick458 »

Код: Выделить всё

INIT
 BSF   STATUS,RP0      ;ПЕРЕХОДИМ В БАНК 1.
 MOVLW B'00000100'     ;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=32 =...100.
 MOVWF OPTION_REG^80H  ;
 MOVLW B'10100000'     ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0.
 MOVWF INTCON          ;
 MOVLW B'00000000'     ;ВСЕ НА ВЫХОД.
 MOVWF TRISA^80H
 MOVLW B'00000001'     ;RB0-НА ВХОД, ОСТАЛЬНЫЕ - ВЫХОД.
 MOVWF TRISB^80H

Изучаю PIC контроллеры. Подскажите что значит символ "^" в данном куске кода?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Подскажите начинающему

Сообщение pyzhman »

В данном случае вообще не вижу смысла в этой пришлепке. Компилируется красиво что с ней, что без нее. Откуда взято-то?
Docendo discimus
Аватара пользователя
nick458
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт июн 22, 2010 19:41:29

Re: Подскажите начинающему

Сообщение nick458 »

Взял из книги Зайца "радиолюбительские конструкции на PIC контроллерах"
Аватара пользователя
dalay-lama
Потрогал лапой паяльник
Сообщения: 328
Зарегистрирован: Вт ноя 20, 2007 17:30:36
Откуда: Раша

Re: Что значит символ "^" в данном куске кода?

Сообщение dalay-lama »

nick458 писал(а):что значит символ "^" в данном куске кода?

Предполагаю, что кусок программы написан под PIC16F84A. Запись вида "^80Н" - указание того, что данные регистры находятся в 1-м банке, который у PIC16F84A расположен с адреса 80Н (OPTION_REG - 81Н, TRISA - 85Н, TRISB - 86Н и т.д., см. даташит). Прописывать подобное нет необходимости, т.к. "пришлёпка" в виде ^80Н не дает возможности производить какие-либо действия с регистрами 1-го банка.
Важнейшая задача цивилизации - научить человека мыслить. /Т. Эдисон/
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Что значит символ "^" в данном куске кода?

Сообщение Ser60 »

В ассемблере PIC операция ^ - это XOR. Все дело в том, что в .INC файлах регистр TRISA прописан по 8-битному адресу 0х85, в то время как в операциях с памятью ассемблер использует 7-битные адреса и игнорирует старший бит 8-битного адреса. Поэтому получается, что при операции с TRISA мы обращаемся к нему по адресу 0х05 как будто он находится не в Банке памяти 1, а в Банке 0. При этом в окне Build у MPLAB IDE вылезает предупреждение 302 "Register in operand not in bank 0".

Имеется неколько способов рагирования на него: просто игнорировать т.к. все компилируется все равно без ошибок (но обилие этих предупреждений "не по делу" раздражает), либо директивой ассемблера отменить вообще предупреждение 302 (но при этом можно пропустить реальную ошибку), или как это сделано в программе - сказать ассемблеру обращаться по адресу 0х05 памяти путем сброса старшего бита адреса операцией ^: 0x85 ^ 0x80 = 0x05. Результирующий код будет в любом случае одинаковым и компилироваться в обоих случаях без ошибок, т.к. активный регистр памяти определяется не старшим битом адреса, а установкой соответствуюший битов в регистре STATUS. Зато компилятор предупреждением 302 ругаться не будет.

Короче - это стандартная практика при программировании PIC и об этом должно быть написано в книге. Я книгу Зайцева, правда, не читал.
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Re: Что значит символ "^" в данном куске кода?

Сообщение otest »

Ser60
Вы дали исчерпывающие объяснение.
либо директивой ассемблера отменить вообще предупреждение 302 (но при этом можно пропустить реальную ошибку)

MPLAB ругается только на TRIS и STATUS. Если написать операцию с другим регистром , при этом не правильно выбрать банк, то MPLAB ошибки не видит. Поэтому errorlevel-302 можно смело использовать.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Что значит символ "^" в данном куске кода?

Сообщение Ser60 »

Возможно Вы правы - я уже давно не работал с PIC и с тех пор могло что-то измениться (и однозначно правы по поводу данного куска кода). Но я попробовал сейчас скомпилировать пару своих старых ассемблерных программ под PIC16F9xx на MPLAB версии оставшейся у меня с тех времен (8.10). Компилятор выдает предупреждение 302 всякий раз, когда я обращаюсь к регистру памяти вне Банка 0, который не продублирован в Банке 0 (типа PORTB). Конкретно пробовал PIE1, OSCCON, ANSEL а также LCDCON, LCDDATAx, WDTCON. Для модификации адресов последних трех регистров из Банка 2 с целью блокировки предупреждения 302 я XOR-ил их с ^0x100.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Что значит символ "^" в данном куске кода?

Сообщение BOB51 »

Гмм... Ни разу никаких проблем не замечал... :roll:
Правда всегда использую файл-заготовку из "джентльменского набора"
"диск":\Program Files\Microchip\MPASM Suite\Template\Object (относительная адресация) или из
"диск":\Program Files\Microchip\MPASM Suite\Template\Code (абсолютная адресация)
несколько подредактированную под свой целевой проект, т.е. использую ассемблер "по правилам" производителя (в отличии от древних "примитивов"). 8)
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Re: Что значит символ "^" в данном куске кода?

Сообщение otest »

Очевидно я не правильно выразился. Проще сказать, что предупреждение 302 и 305 вещи бесполезные и всякие ухищрения для борьбы с ними тоже. MPLAB не следит за правильностью выбора банка. Поэтому сам производитель предлагает отключать 302.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Dmitry Dubrovenko »

Ser60 писал(а):В ассемблере PIC операция ^ - это XOR
А вот описание MPASM, где про это написанно. :wink:
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Что значит символ "^" в данном куске кода?

Сообщение BOB51 »

Для топикстартера я б еще посоветовал почитать вот это:
http://pic24.ru/doku.php/osa/articles/mpasm_formatting
http://pic24.ru/doku.php/osa/articles/e ... out_errors
http://www.microchip.ru/files/d-sheets-rus/PIC16_29.pdf
ну и все размещенные на http://www.microchip.ru/lit/?mid=1x0 документы 8)
А вот насчет "бесполезности" предупреждения 305 наверняка погорячились - не слишком приятно в готовой программе обнаружить что компилятор сработал размещение результата не в W, как было задумано в команде автором, а в F (по умолчанию). :)))
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: Что значит символ "^" в данном куске кода?

Сообщение koms48 »

Ничего интересного в этом крючке нет. Это Н.И.Заец так с банками работает. Порочная древняя практика. К адресу указанного регистра добавляется (или вычитается) с помощью этой загогулины 80h. Например STATUS - регистр по адресу 3. STATUS^80h - уже по адресу 83h (тоже STATUS).
PORTA (адр 5), PORTA^80h - уже TRISA (85h).
Переключай банки битом 5 в регистре STATUS (ещё вариант - BANKSEL [имя регистра]) и спокойно рули нужным регистром. Хотя на Заецовских косяках можно чему-то научиться. Только не лучший вариант. Количество книг перешло в нежелательное качество.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Dmitry Dubrovenko »

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

Ser60 писал(а):В ассемблере PIC операция ^ - это XOR.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Что значит символ "^" в данном куске кода?

Сообщение dosikus »

koms48 , +1000 Однозначно .

Dmitry Dubrovenko, документик уже пропах , да и вольности переводилы еще тот бред.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Аlex »

Dmitry Dubrovenko писал(а):прежде чем постить всякую хрень.
Дмитрий, прежде чем какать на чужие высказывания, стоит их проверить. 0x03^0x80=0x83, 0x83^0x80=0x03 :) Так что в этой ситуации обкакались Вы, а не koms48 :))
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Dmitry Dubrovenko »

Аlex писал(а):прежде чем какать на чужие высказывания, стоит их проверить
"Золотые слова, Юрий Венедиктович!"
0x02^0x03=0x01
0x02+0x03=0x05
0x02-0x03=-0x01 (или 0xFF)
Где ошибка?


dosikus писал(а):документик уже пропах , да и вольности переводилы еще тот бред.
Лёшь, давай поконкретнее.
Где ошибки?
^ в MPASM'е не XOR?
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Что значит символ "^" в данном куске кода?

Сообщение dosikus »

Dmitry Dubrovenko писал(а):Лёшь, давай поконкретнее.
Где ошибки?


Юзать костыли вместо banksel .
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Dmitry Dubrovenko »

dosikus писал(а):Юзать костыли вместо banksel .
Как в старом анекдоте: "Соси, что хочешь, а шею мыть надо!" :)))
В смысле, юзай что угодно, а на вопрос-то ответь.
Последний раз редактировалось AlekseyEnergo Вс окт 13, 2013 11:46:52, всего редактировалось 2 раза.
Причина: .
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Что значит символ "^" в данном куске кода?

Сообщение Аlex »

Dmitry Dubrovenko писал(а):0x02^0x03=0x01
0x02+0x03=0x05
0x02-0x03=-0x01 (или 0xFF)
Где ошибка?
Не знаю откуда эти цифры, но процитировал ты эту фразу:
К адресу указанного регистра добавляется (или вычитается) с помощью этой загогулины 80h
и назвал её хернёй. Не вижу никакой херни в этом предложении.
Аватара пользователя
nick458
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт июн 22, 2010 19:41:29

Re: Что значит символ "^" в данном куске кода?

Сообщение nick458 »

Спасибо всем. Дали исчерпывающие ответы.
Для топикстартера я б еще посоветовал почитать вот это:
http://pic24.ru/doku.php/osa/articles/mpasm_formatting
http://pic24.ru/doku.php/osa/articles/e ... out_errors
http://www.microchip.ru/files/d-sheets-rus/PIC16_29.pdf
ну и все размещенные на http://www.microchip.ru/lit/?mid=1x0 документы

Буду грызть гранит.
Закрыто

Вернуться в «PIC»