Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 17.02.2019
Сообщений: 116
1

(PIC16F84A) Вычислить логические функции (дополнительно - запрещено применять функцию OR)

31.05.2020, 20:10. Просмотров 870. Ответов 5
Метки нет (Все метки)

Здравствуйте, писал код для микроконтроллера, чтобы тот вычислял определенные логические функции. Мой код ниже:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
;****************************************************************************
; Filename: dz.asm
; Программа вводит тактовый сигнал через порт RA4, вычисляет очередной код
; заданной последовательности (7 11 5 3 8 2 4 6) с помощью логической функции
; и выводит результат через линии порта A (Q1-RA3, Q2-RA2, Q3-RA1, Q4 – RA0).
; P.S Автор почему-то использовал слова типа "копировать" и "переместить" в одном значении
;****************************************************************************
 
    list p=16F84A          ; list directive to define processor
#include <p16F84a.inc> ; processor specific variable definitions
 
    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
var1 EQU 0x0C ;
var2 EQU 0x0D ; - переменные
var3 EQU 0x0E ;
var4 EQU 0x0F ;
tmp EQU 0x10 ;
now  EQU 0x11 ; переменная, содержащая текущее состояние
d1   EQU 0x12 ; переменная для подпрограммы - задержки
d2   EQU 0x13 ; переменная для подпрограммы - задержки
;**********************************************************************
    ORG    0x000      ; processor reset vector
    bcf    STATUS,RP1 ; устанавливаем
    bsf    STATUS,RP0 ; банк памяти 1
    movlw  0x10       ; управляющее слово для порта A
    movwf  TRISA      ; RA4 - на ввод, RA3, RA2, RA1, RA0 - на вывод
    movlw  0x00       ; управляющее слово для порта B
    movwf  TRISB      ; все на вывод
    bcf    STATUS,RP0 ; возвращаемся в банк 0
; Приветливо мигнем индикатором на PORTA[3] и оставим его включенным -
    movlw  0xff
    movwf  PORTA      ; погасили
    call   del_200    ; подождали 200 мс
    movlw  0x00
    movwf  PORTA      ; зажгли
    call   del_200    ; подождали 200 мс
    movlw  0xff
    movwf  PORTA      ; погасили
    call   del_200    ; подождали 200 мс
;----------------------------------------------------------------------------
; Установка начального состояния
    movlw  0x07
    movwf  now
; --------------- Основной исполнительный цикл -----------------------
; --------------- выводим результат в порт -----
loop 
    movf   now, w      ; устанавливаем результат
    movwf  PORTA       ; выводим в порт
; ----- Ждем синхроимпульс на PORTA[4] ------
key1 
    btfsc   PORTA,4     ; анализ состояния бита 4 порта A
    goto    key1        ; если 1 - продолжаем анализировать сигнал
; если 1 - дождались импульса, продолжаем выполнять программу
     call    del_200     ; подождали 200 мс, пропустили дребезг
; ----- Ждем окончания синхроимпульса на PORTA[4] ------
key2 
    btfss   PORTA,4     ; анализ состояния бита 4 порта A
    goto    key2        ; если 0 - продолжаем ждать
; если 0 - дождались окончания импульса
     call    del_200     ; подождали 200 мс, пропустили дребезг
; выделяем разряды текущего кода по отдельности и помещаем их в ячейки var1, ;var2 и var3
    movf    now, w      ; копируем текущий код в аккумулятор
    andlw   0x01        ; накладываем маску 000000001 - выделяем младший разряд Q4
    movwf   var4        ; копируем Q4 в var4
    movf    now, w      ; копируем текущий код в аккумулятор
    andlw   0x02        ; накладываем маску 000000010 - выделяем младший разряд Q3
    movwf   var3        ; копируем Q3 в var3
    rrf     var3, f     ; сдвиг Q3 вправо - выравниваем с Q4 в младшем разряде 
    movf    now, w      ; копируем текущий код в аккумулятор w
    andlw   0x04        ; накладываем маску 000000100 - выделяем младший разряд Q2
    movwf   var2        ; копируем Q2 в var2
    rrf     var2, f     ; сдвиг Q2 вправо
    rrf     var2, f     ; сдвиг Q2 вправо - выравниваем с Q3 и Q4 в младшем разряде
    movf    now, w      ; копируем текущий код в аккумулятор w
    andlw   0x08        ; накладываем маску 000001000 - выделяем старший разряд Q1
    movwf   var1        ; копируем Q1 в var1
    rrf     var1, f     ; сдвиг Q1 вправо
    rrf     var1, f     ; сдвиг Q1 вправо
    rrf     var1, f     ; сдвиг Q1 вправо - выравниваем с Q4, Q3 и Q2 в младшем разряде
    clrf now ;
; --- Вычисляем D1=Q3*Q4*^Q1 ---
    comf    var1, w     ; инвертируем Q1 с сохранением в аккумуляторе w
    movwf   tmp         ; сохраняем в временной ячейке tmp
    movf    var4, w     ; копируем Q4 в аккумулятор w
    andwf   tmp, f      ; ^Q1*Q4 с сохранением в tmp
    movf    var3, w     ; копируем Q3 в аккумулятор w
    andwf   tmp, f      ; ^Q1*Q4*Q3 с сохранением в tmp
    rlf     tmp, f     ; сдвигаем влево с сохранением в var5
    rlf     tmp, f     ; сдвигаем влево с сохранением в var5
    rlf     tmp, w     ; сдвигаем влево с сохранением в w - выравниваем с 3-м разрядом
    andlw    0x08       ; накладываем маску 000001000 - чистим результат
    iorwf    now, f     ; устанавливаем D1 в 3-й разряд now
; --- Вычисляем D2=Q4*Q1+^Q4*Q1 ---
    comf    var4, w     ; инвертируем Q4 с сохранением в аккумуляторе w
    andwf   var1, w     ; ^Q4*Q1 с сохранением в w
    movwf   tmp         ; переносим полученный результать из w в tmp
    movf    var4, w     ; переносим Q4 в аккумулятор w
    andwf   var1, w     ; Q4*Q1 с сохранением в w
    iorwf   tmp, f      ; логическое сложение результатов w и tmp с получением D2 в 0-м разряде tmp
    rlf      tmp, f    ; сдвигаем влево с сохранением в f
    rlf      tmp, w    ; сдвигаем влево с сохранением в аккумуляторе w
    andlw    0x04       ; накладываем маску 000000100 - чистим результат
    iorwf    now, f     ; устанавливаем D2 во 2-й разряд now
; --- Вычисляем D3=^Q3+Q2 ---
    comf    var3, w     ; инвертируем Q3 с сохранением в аккумуляторе w
    movwf   tmp         ; сохраняем результат в tmp
    movf    var2, w     ; переносим Q2 в аккумулятор w
    iorwf   tmp, f      ; логическое сложение результатов w и tmp с получением D3 в 0-м разряде tmp
    rlf      tmp, w    ; сдвигаем влево с сохранением в аккумуляторе w
    andlw    0x02       ; накладываем маску 000000010 - чистим результат
    iorwf    now,f      ; устанавливаем D2 во 2-й разряд now
; --- Вычисляем D4=Q4*Q2+Q3*Q2+Q4*Q1=Q4*(Q1+Q2)+Q3*Q2 ---
    movf    var1, w     ; перемещаем Q1 в аккумулятор w
    movwf   tmp         ; перемещаем Q1 в tmp
    movf    var2, w     ; копируем Q2 в аккумулятор w
    iorwf   tmp, f      ; Q2+Q1 с сохранением результата в tmp
    movf    var4, w     ; копируем Q4 в аккумулятор w
    andwf   tmp, f      ; Q4*(Q2+Q1) с сохранением результата в tmp
    movf    var3, w     ; копируем Q3 в аккумулятор w
    andwf   var2, w     ; Q3*Q2 с сохранением результата в w
    iorwf     tmp, w    ; D4 в 0-м разряде var5
    andlw    0x01       ; накладываем маску 000000001 - чистим результат
    iorwf    now, f     ; устанавливаем D4 в 0-й разряд now - РЕЗУЛЬТАТ
    goto     loop       ; Зацикливаем программу
; Подпрограмма - задержка 200 мс
; Переменные: d1 и d2
del_200  movlw   0xCC
    movwf   d2
d200_2   movlw   0xF9
    movwf   d1
    nop
    nop
d200_1   nop
    decfsz d1,f
    goto   d200_1
    nop
    decfsz d2,f
    goto   d200_2
    return
; --------- end of DEL_200 -------------
    end ; directive 'end of program'

Вопрос в чем. Мне, оказывается, запретили использовать команду iorwf, делающую логическое сложение. Но чем её можно заменить, чтобы реализовать логическое сложение?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2020, 20:10
Ответы с готовыми решениями:

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

Задача логические функции (составить функцию, которая определяет верно ли что сумма цифр числа четное число)
Помогите нужно составить функцию, которая определяет верно ли что сумма цифр числа четное число....

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором...

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором...

5
Модератор
6691 / 3267 / 1309
Регистрация: 01.02.2015
Сообщений: 10,360
Записей в блоге: 1
31.05.2020, 20:30 2
Лучший ответ Сообщение было отмечено ZamyatinDanya как решение

Решение

Правило де Моргана
https://ru.wikipedia.org/wiki/Законы_де_Моргана

https://www.cyberforum.ru/cgi-bin/latex.cgi?A\,  or\,  B = not (not (A\,  or\,  B))=not((not \, A)and(not \, B))=\bar{\bar{A} \, and \, \bar{B}}
1
2 / 2 / 0
Регистрация: 17.02.2019
Сообщений: 116
31.05.2020, 20:32  [ТС] 3
ФедосеевПавел, то есть фактически мне следует функции D преобразовать по правилу Де Моргана и переработать код?
0
Модератор
6691 / 3267 / 1309
Регистрация: 01.02.2015
Сообщений: 10,360
Записей в блоге: 1
31.05.2020, 20:58 4
Не буду обманывать - не понимаю происходящее в коде.
Раз вы утверждаете, что вычисляется некая логическая функция - верю.

Работа с логической функцией всегда состоит в
1. минимизации функции
2. реализации функции

После минимизации у вас будут операции OR. По правилу де Моргана замените каждую на инверсию и AND, в некоторых случаях может быть увидите XOR.

Если минимизация невозможна - забудьте о ней.
1
2 / 2 / 0
Регистрация: 17.02.2019
Сообщений: 116
31.05.2020, 21:00  [ТС] 5
ФедосеевПавел, спасибо за Вашу отзывчивость. Мне кажется, раз мне дают такое задание, то минимизация тут возможна. Пойду почитать про XOR
0
Модератор
6691 / 3267 / 1309
Регистрация: 01.02.2015
Сообщений: 10,360
Записей в блоге: 1
31.05.2020, 21:04 6
Да, переработать код.

Причём правило применимо не обязательно к двум операндам - оно справедливо для произвольного их числа.

Добавлено через 2 минуты
XOR не обязательно должен присутствовать. Это если в месиве формул сможете разглядеть.

Просто замена OR на AND - и лаба сдана. Только вывод формул покажите преподавателю.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2020, 21:04

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

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции

Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем
Решил выложить свои лабораторные работы 1-10 за первый курс, первого семестра...

Дополнительно перегрузить логическую операторную функцию для операции | (побитовая дизъюнкция), определяющую параллельность двух отрезков
Собственно все задание Разработать класс Line для работы с объектами типа отрезок. Члены-данные...

Как применять функции?
Вот я делал задание программа работаает но сделать это надо с использованием функции то есть я...

Стоит ли применять рекурсивные функции?
Здравствуйте, есть вопросик. Подскажите, пожалуйста, а вообще в средних или больших проектах...

Построить график функции, определив дополнительно на графике произвольную сетку и границы
Найти область определения функции. Указать диапазон изменения аргумента с определенным шагом при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.