nick458 писал(а):что значит символ "^" в данном куске кода?
Предполагаю, что кусок программы написан под PIC16F84A. Запись вида "^80Н" - указание того, что данные регистры находятся в 1-м банке, который у PIC16F84A расположен с адреса 80Н (OPTION_REG - 81Н, TRISA - 85Н, TRISB - 86Н и т.д., см. даташит). Прописывать подобное нет необходимости, т.к. "пришлёпка" в виде ^80Н не дает возможности производить какие-либо действия с регистрами 1-го банка.
Важнейшая задача цивилизации - научить человека мыслить. /Т. Эдисон/
В ассемблере 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 и об этом должно быть написано в книге. Я книгу Зайцева, правда, не читал.
либо директивой ассемблера отменить вообще предупреждение 302 (но при этом можно пропустить реальную ошибку)
MPLAB ругается только на TRIS и STATUS. Если написать операцию с другим регистром , при этом не правильно выбрать банк, то MPLAB ошибки не видит. Поэтому errorlevel-302 можно смело использовать.
Возможно Вы правы - я уже давно не работал с PIC и с тех пор могло что-то измениться (и однозначно правы по поводу данного куска кода). Но я попробовал сейчас скомпилировать пару своих старых ассемблерных программ под PIC16F9xx на MPLAB версии оставшейся у меня с тех времен (8.10). Компилятор выдает предупреждение 302 всякий раз, когда я обращаюсь к регистру памяти вне Банка 0, который не продублирован в Банке 0 (типа PORTB). Конкретно пробовал PIE1, OSCCON, ANSEL а также LCDCON, LCDDATAx, WDTCON. Для модификации адресов последних трех регистров из Банка 2 с целью блокировки предупреждения 302 я XOR-ил их с ^0x100.
Гмм... Ни разу никаких проблем не замечал... Правда всегда использую файл-заготовку из "джентльменского набора" "диск":\Program Files\Microchip\MPASM Suite\Template\Object (относительная адресация) или из "диск":\Program Files\Microchip\MPASM Suite\Template\Code (абсолютная адресация) несколько подредактированную под свой целевой проект, т.е. использую ассемблер "по правилам" производителя (в отличии от древних "примитивов").
Очевидно я не правильно выразился. Проще сказать, что предупреждение 302 и 305 вещи бесполезные и всякие ухищрения для борьбы с ними тоже. MPLAB не следит за правильностью выбора банка. Поэтому сам производитель предлагает отключать 302.
Ничего интересного в этом крючке нет. Это Н.И.Заец так с банками работает. Порочная древняя практика. К адресу указанного регистра добавляется (или вычитается) с помощью этой загогулины 80h. Например STATUS - регистр по адресу 3. STATUS^80h - уже по адресу 83h (тоже STATUS). PORTA (адр 5), PORTA^80h - уже TRISA (85h). Переключай банки битом 5 в регистре STATUS (ещё вариант - BANKSEL [имя регистра]) и спокойно рули нужным регистром. Хотя на Заецовских косяках можно чему-то научиться. Только не лучший вариант. Количество книг перешло в нежелательное качество.
Dmitry Dubrovenko писал(а):прежде чем постить всякую хрень.
Дмитрий, прежде чем какать на чужие высказывания, стоит их проверить. 0x03^0x80=0x83, 0x83^0x80=0x03 Так что в этой ситуации обкакались Вы, а не koms48