Страница 1 из 2

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

Добавлено: Вс окт 06, 2013 12:39:57
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 контроллеры. Подскажите что значит символ "^" в данном куске кода?

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

Добавлено: Вс окт 06, 2013 13:21:20
pyzhman
В данном случае вообще не вижу смысла в этой пришлепке. Компилируется красиво что с ней, что без нее. Откуда взято-то?

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

Добавлено: Вс окт 06, 2013 13:27:35
nick458
Взял из книги Зайца "радиолюбительские конструкции на PIC контроллерах"

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

Добавлено: Пн окт 07, 2013 22:56:12
dalay-lama
nick458 писал(а):что значит символ "^" в данном куске кода?

Предполагаю, что кусок программы написан под PIC16F84A. Запись вида "^80Н" - указание того, что данные регистры находятся в 1-м банке, который у PIC16F84A расположен с адреса 80Н (OPTION_REG - 81Н, TRISA - 85Н, TRISB - 86Н и т.д., см. даташит). Прописывать подобное нет необходимости, т.к. "пришлёпка" в виде ^80Н не дает возможности производить какие-либо действия с регистрами 1-го банка.

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

Добавлено: Вт окт 08, 2013 04:49:25
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 и об этом должно быть написано в книге. Я книгу Зайцева, правда, не читал.

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

Добавлено: Вт окт 08, 2013 09:02:29
otest
Ser60
Вы дали исчерпывающие объяснение.
либо директивой ассемблера отменить вообще предупреждение 302 (но при этом можно пропустить реальную ошибку)

MPLAB ругается только на TRIS и STATUS. Если написать операцию с другим регистром , при этом не правильно выбрать банк, то MPLAB ошибки не видит. Поэтому errorlevel-302 можно смело использовать.

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

Добавлено: Вт окт 08, 2013 18:27:38
Ser60
Возможно Вы правы - я уже давно не работал с PIC и с тех пор могло что-то измениться (и однозначно правы по поводу данного куска кода). Но я попробовал сейчас скомпилировать пару своих старых ассемблерных программ под PIC16F9xx на MPLAB версии оставшейся у меня с тех времен (8.10). Компилятор выдает предупреждение 302 всякий раз, когда я обращаюсь к регистру памяти вне Банка 0, который не продублирован в Банке 0 (типа PORTB). Конкретно пробовал PIE1, OSCCON, ANSEL а также LCDCON, LCDDATAx, WDTCON. Для модификации адресов последних трех регистров из Банка 2 с целью блокировки предупреждения 302 я XOR-ил их с ^0x100.

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

Добавлено: Вт окт 08, 2013 19:48:16
BOB51
Гмм... Ни разу никаких проблем не замечал... :roll:
Правда всегда использую файл-заготовку из "джентльменского набора"
"диск":\Program Files\Microchip\MPASM Suite\Template\Object (относительная адресация) или из
"диск":\Program Files\Microchip\MPASM Suite\Template\Code (абсолютная адресация)
несколько подредактированную под свой целевой проект, т.е. использую ассемблер "по правилам" производителя (в отличии от древних "примитивов"). 8)

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

Добавлено: Вт окт 08, 2013 20:57:49
otest
Очевидно я не правильно выразился. Проще сказать, что предупреждение 302 и 305 вещи бесполезные и всякие ухищрения для борьбы с ними тоже. MPLAB не следит за правильностью выбора банка. Поэтому сам производитель предлагает отключать 302.

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

Добавлено: Вт окт 08, 2013 22:21:30
Dmitry Dubrovenko
Ser60 писал(а):В ассемблере PIC операция ^ - это XOR
А вот описание MPASM, где про это написанно. :wink:

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

Добавлено: Ср окт 09, 2013 12:00:12
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 (по умолчанию). :)))

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

Добавлено: Чт окт 10, 2013 12:59:28
koms48
Ничего интересного в этом крючке нет. Это Н.И.Заец так с банками работает. Порочная древняя практика. К адресу указанного регистра добавляется (или вычитается) с помощью этой загогулины 80h. Например STATUS - регистр по адресу 3. STATUS^80h - уже по адресу 83h (тоже STATUS).
PORTA (адр 5), PORTA^80h - уже TRISA (85h).
Переключай банки битом 5 в регистре STATUS (ещё вариант - BANKSEL [имя регистра]) и спокойно рули нужным регистром. Хотя на Заецовских косяках можно чему-то научиться. Только не лучший вариант. Количество книг перешло в нежелательное качество.

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

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

Ser60 писал(а):В ассемблере PIC операция ^ - это XOR.

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

Добавлено: Чт окт 10, 2013 17:57:33
dosikus
koms48 , +1000 Однозначно .

Dmitry Dubrovenko, документик уже пропах , да и вольности переводилы еще тот бред.

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

Добавлено: Чт окт 10, 2013 19:10:55
Аlex
Dmitry Dubrovenko писал(а):прежде чем постить всякую хрень.
Дмитрий, прежде чем какать на чужие высказывания, стоит их проверить. 0x03^0x80=0x83, 0x83^0x80=0x03 :) Так что в этой ситуации обкакались Вы, а не koms48 :))

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

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


dosikus писал(а):документик уже пропах , да и вольности переводилы еще тот бред.
Лёшь, давай поконкретнее.
Где ошибки?
^ в MPASM'е не XOR?

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

Добавлено: Чт окт 10, 2013 21:22:03
dosikus
Dmitry Dubrovenko писал(а):Лёшь, давай поконкретнее.
Где ошибки?


Юзать костыли вместо banksel .

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

Добавлено: Чт окт 10, 2013 21:27:45
Dmitry Dubrovenko
dosikus писал(а):Юзать костыли вместо banksel .
Как в старом анекдоте: "Соси, что хочешь, а шею мыть надо!" :)))
В смысле, юзай что угодно, а на вопрос-то ответь.

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

Добавлено: Чт окт 10, 2013 21:33:24
Аlex
Dmitry Dubrovenko писал(а):0x02^0x03=0x01
0x02+0x03=0x05
0x02-0x03=-0x01 (или 0xFF)
Где ошибка?
Не знаю откуда эти цифры, но процитировал ты эту фразу:
К адресу указанного регистра добавляется (или вычитается) с помощью этой загогулины 80h
и назвал её хернёй. Не вижу никакой херни в этом предложении.

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

Добавлено: Чт окт 10, 2013 21:38:10
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 документы

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