duminică, 17 noiembrie 2013

Константы. Булева логика.Операции с масками.

 Главная страница курса         in romana

Константы

    Константа-это идентификатор, наделённый значением, которое не может меняться в ходе выполнения программы, оно - постоянно. Используя константу вместо одного и того же значения, которое повторяется, мы упрощаем программу и упрощаем манипулирование ей. Дав определённое имя константе, упрощается  разработка программы и легче запоминается. Использование констант повышает безопасность и снижает риск ошибок в программе. Пропадает необходимости запоминать фактические значения, т.к. имя запоминать легче. Ошибки имени константы обычно выявляются компилятором автоматически (кроме того,когда имя не то которое принадлежит данной константе). Изменения в программе становятся проще,т.к. константа определена один раз и изменяя её значения, меняются все значения под этим именем.

Определение констант  

    Константы определяются один раз и сохраняют свое значение на протяжении всей программы.Для обозначения констант на языке ASM , существуют 2 директивы:

     Директива .EQU определяет имя константы.
   
    .EQU SIZE = 10
    .EQU PIN7 = 7


    Директива .DEF определяет дополнительное имя РОН.

    .DEF temp = R16 

    Теперь temp можно использовать вместо РОН R16 и всякое изменение temp будет происходить из-за изменения R16.


    Примеры:

       ldi temp, SIZE  ; запись значения константы size в temp
       sbi PORTA, PIN7 ; установка пина 7 порта А

Выражения над константами


    Выражения над константами-это выражения,для решения которых используются только константы и результат-тоже константа.Константные выражения вычисляются в процессе предкомпиляции.Для формирования константных выражений можно использовать любые арифметические и логические выражения, а также макро-функции.При выполнении этих выражений,учитывается их приоритет. 




Примеры:

    .EQU A = 1023
    .EQU B = 1375
    .EQU C = (A+B)/2-17
    .EQU LOW_VAL = LOW(C)
    .EQU PIN7 = 7
    .EQU MASK = 1<<PIN7

Представления константных чисел и преобразований


    Числа, которые мы привыкли использовать - это десятичные числа(с основание 10). Не только в этом формате может быть представлено число. Некоторые системы (форматы): двоичная, восьмеричная, десятичная, шестнадцатеричная и т.д. Любое число может быть представлено в любой системе (с любым основанием).



    Пример:


     28492(10)  = 67514(8) = 6F4C(16) = 0110111101001100(2)

    В программировании, в дополнении к десятичному основанию, наиболее часто используются двоичные и шестнадцатеричные числа, особенно для микроконтроллеров, которые работают на низком уровне аппаратных средств. 

    Для получения дополнительной информации об основаниях перечисления может помочь литература по данной теме, но здесь мы приведем простой метод перехода с одного основания на другое, и особенно с шестнадцатеричной системы в двоичную и наоборот.

    Каждый будет переведён из десятичной системы в двоичную, и таким образом, преобразования между этими двумя системами можно будет сделать используя приведенную ниже таблицу, в которую входят все цифры шестнадцатеричной системы представленные в двоичной.


    DEC |  BIN | HEX 
     0  | 0000 |  0
     1  | 0001 |  1
     2  | 0010 |  2
     3  | 0011 |  3  
     4  | 0100 |  4
     5  | 0101 |  5
     6  | 0110 |  6
     7  | 0111 |  7  
     8  | 1000 |  8
     9  | 1001 |  9
    10  | 1010 |  A
    11  | 1011 |  B  
    12  | 1100 |  C
    13  | 1101 |  D
    14  | 1110 |  E
    15  | 1111 |  F  


    Мы видим, что любое двоичное число представлено шестнадцатеричным. Таким образом шестн-ое число представлено 2-мя октавами по 8 бит, так 4 тетраеды могут быть представлены 4-мя шестн-ыми числами.



    Пример:
        1001_0010__1010_1110(2) = 92AE(16)
          9    2     A    E

    Это преобразование можно легко переносить из одной системы на другую, и практикующийся автоматизм может быть достигнут в течение короткого времени. Упрощенный метод для преобразования двоичных чисел в десятичные заключается в запоминании последовательности степеней 2: 1, 2, 4, 8, 16, 32, и т.д..



Пример:


11010101 = 213
1   1  0  1  0 1 0 1 x
128 64 32 16 8 4 2 1
128+64+ 0+16+0+4+0+1 = 213

Булева логика.


    Учитывая что МК работает с "1" и  "0" даются некоторые вводные понятия в булевой логики и примеры их использования в оптимизации конструкции программ на языке ASM. В булевой логики мы выделяем следующие основные логические операторы: AND, OR, XOR, NOT. Эти операторы имеют больше заметок для каждого из них. 


             AND  &  ∙  - Логическое И , пересечение
             OR   |  +  - Логическое ИЛИ , объеденение
             XOR  ^  ⊕  - Логическое исключительное ИЛИ 
             NOT  ~  x' - Негация


    Ниже представлены таблицы истинности для каждого из них:



       AND            OR             XOR        NOT
   |x1|x2|y |     |x1|x2|y |     |x1|x2|y |    |x |y |
   |0 |0 |0 |     |0 |0 |0 |     |0 |0 |0 |    |0 |1 |
   |0 |1 |0 |     |0 |1 |1 |     |0 |1 |1 |    |1 |0 |
   |1 |0 |0 |     |1 |0 |1 |     |1 |0 |1 |
   |1 |1 |1 |     |1 |1 |1 |     |1 |1 |0 |

    Логические операции могут иметь и другие значения,такие как: 

XOR - Реверсивный упорядоченный компаратор - Результат 1 если отличается 

И - электронный ключ с блокированием ноля (Повторитель с блокирование ноля). 

ИЛИ - электронный ключ с блокированием 1.
Подробнее о булевой логики можно найти здесь!!!

Операции с масками.

    Часто мы должны изменить некоторые биты в ячейке памяти которая является регистром или периферийным регистром, не изменяя значения других битов. В таких случаях к нам на помощь приходят знания булевой логики и принцип применения маски. Например, предположим, что мы должны изменить  4 и 7 биты следующим образом: установка, сброс или инвертирование. 


Применение маски установки.

    Предположим, у вас есть 8-разрядное число 0bxxxx_xxxx и мы хотим изменить его так, чтобы мы имели в итоге биты 4 и 7 в "1" , 0b1xx1_xxxx а другие значения придется оставить теми же. Проводя анализ логических операций (таблица истинности) находим:

         x OR 0 = x  - не изменяет значение x

         x OR 1 = 1  - устанавливает в 1


    Таким образом, мы могли бы использовать это, чтобы оставить без изменений входное значение при помощи операции OR с 0 и с 1,в другом случае.Мы должны сформировать 8-битно число,чтобы оно удовлетворяло условиям задачи ,т.е. установить биты 4 и 7 в "1":


     X X X X  X X X X 
OR   1 0 0 1  0 0 0 0  - маска установки
     1 X X 1  X X X X 


    Маской установки мы называем комбинацию битов ,в которой мы ставим "1" на то значение,которое хотим установить в "1".Данная операция реализована на базе операции OR.


Применение маски установки.


    Делая такой же анализ логических операций, чтобы найти решение, для сброса этих же ячеек:

     

     x AND 0 = 0  - сбрасывает в 0
     x AND 1 = x  - не меняет значение x


    Как и в предыдущем случае будем использовать это же свойство для этой маски, чтобы сформировать сброс:


     X X X X  X X X X 
AND  0 1 1 0  1 1 1 1  - маска сброса
     0 X X 0  X X X X 


    Маска сброса - это комбинация битов в которой мы будем иметь "0" на местах , которые мы хотим сбросить.Операция сброса будет выполнена при помощи операции AND.Инвертируем данную маску следующим образом.


       X X X X  X X X X 
AND  ~ 1 0 0 1  0 0 0 0  - маска установки(инвертированная)
       1 X X 1  X X X X  


Инвертирование при помощи маски.


    Для инвертирования битов используется XOR с маской в которой интересующие нас позиции установлены в "1" ,а другие в "0":

     x XOR 0 =  x  - не изменяет значение x
     x XOR 1 = ~x  - инвертирует значение x


    получаем:


     X X X  X  X X X X 
XOR  1 0 0  1  0 0 0 0  - маска для инвертирования
    ~X X X ~X  X X X X


Формирование маски.


Формирование маски может быть реализовано при помощи константных выражений.Зная номер бита,который мы хотим изменить,например 4-ый,мы можем представить его используя константное выражение 1<<4 ,т.е. 1 сдвинута на 4 позиции влево.

   .EQU MASK = 1<<4  


Если мы хотим сформировать маску и для нескольких других бит,суммируем каждый сдвиг,например:


   .EQU MASK = (1<<7)+(1<<6)+(1<<4)
      
     0 0 0 0  0 0 0 1
   + 1 0 0 0  0 0 0 0  
   + 0 1 0 0  0 0 0 0  
   + 0 0 0 1  0 0 0 0
     1 1 0 1  0 0 0 0


    Такой же результат у нас будет, если мы оценивать это выражение при помощи OR :


   .EQU MASK = (1<<7)|(1<<6)|(1<<4)
      
     0 0 0 0  0 0 0 1
  OR 1 0 0 0  0 0 0 0  
  OR 0 1 0 0  0 0 0 0  
  OR 0 0 0 1  0 0 0 0
     1 1 0 1  0 0 0 0 


Работа с масками обычно используется для установки и сброса битов в периферийной регистре.Каждый бит в этом случае имеет имя, определенное в файле заголовка для каждого микроконтроллера отдельно, или мы могли бы определить имя в программе для этих битов, а затем использовать имя для подготовки битовых масок:


  .EQU BITA = 7
  .EQU BITB = 4
  .EQU MASK = (1<<BITA)(1<<BITB)


  cbr R16, MASK