Странно но во многих радиомагазинах отсутствуют логические микросхемы – скорее всего в современной микроэлектронике их заменили обычные многофункциональные микроконтроллеры, например Atmega и PIC и др. Возможно я ошибаюсь…
Но давайте создадим, наприме, логическую микросхему К155ЛА3 (И-НЕ) на Atmega88 (на любом другом микроконтроллере всё будет абсолютно аналогично!).
Всё логика похожа на простую схему с кнопками и светодиодами!
Входы – это кнопки. Светодиод – выход!
Недавно я писал запись – “gameforstreet.ru/kod-na-c-neskolko-knopok-atmega88/” (Код на С (Си) несколько кнопок каждая со своим действием для Atmega88) – вот на основе неё и создадим логический элемент И-НЕ.
Микросхема К155ЛА3 (И-НЕ) работает:
Изначально на её выводах стоит напряжение в 3 В, а на выходе 0 В.
Таблица истинности элемента И-НЕ:
То есть по умолчанию (без какого-либо воздействия, начальное состояние) микросхема К155ЛА3 (И-НЕ) работает как – на обоих входах логическая единица, а на выходах логический ноль.
То есть К155ЛА3 (И-НЕ) регулируется – 0 (логическим нолём) – если на один из выходов подать 0, то выход измениться на 5 В (логическая единица). Также если на оба выхода подать 0 В – будет 5 В на выходе.
Вот видео теста К155ЛА3 (И-НЕ):
“rutube.ru/video/c2bc9ad09c0588855301feb30fda4e1d/”
Давайте создадим данный элемент И-НЕ с помощью двух кнопок (два входа) и светодиода (выход).
Схема будет следующая:
Если подумать, то логика для логических элементов должна быть следующая:
state1 = digitalRead(switch1); state2 = digitalRead(switch2); if (state1 ==1 && state2 ==1){outcome = 1;} // Логический элемент И else {outcome = 0;} if (state1 ==1 || state2 == 1){ outcome = 1;} // Логический элемент ИЛИ else {outcome = 0;} if (state1 ==1 && state2 ==1)(outcome = 0;} // Логический элемент И-НЕ else {outcome = 1;} if (state1 == 0 || state2 == 0){outcome = 0;} // Логический элемент ИЛИ-НЕ else {outcome = 1;}
Таблица истинности для проверки:
—————————————————————
Теперь перейдем к программированию микросхемы Atmega88, я буду программировать в Linux Rosa FResh R12 Plasma, программу буду использовать AVR Burn-O-Mat, фьюзы будут стандартные (на PonyProg2000 будут аналогичными):
Как скачать и настроить AVR Burn-O-Mat, но можете выбрать PonyProg2000 или другую прогу для прошивки: “https://gameforstreet.ru/linux-rosa-fresh-r11-avrdude-programmiruem-atmega88-i-dr/”
Писать код на Си (С) буду в MPLAB X IDE v5.35 – как установить на Linux читайте здесь: “gameforstreet.ru/proshivaem-pic-na-linux-video/”
—————————–
Один элемент И-НЕ на Atmega88
—————————–
Вход PB1 и PB2, выход PC1
Тогда код на Си (С) для элемента И-НЕ следующий (компилировал код в MPLAB X IDE v5.35 – где скачать и как установить здесь “gameforstreet.ru/proshivaem-pic-na-linux-video/”):
#include <xc.h> #define F_CPU 16000000UL // 1 MHz clock speed int main(void) { DDRC = 0xFF; //PORTB как выводы DDRB = 0b0000110; // Конфигурируем вывод порта PB1 - как вход PORTB |= ( 1 << 1 ); // Подключаем к PB1 подтягивающий резистор на плюс питания PORTB |= ( 1 << 2 ); // Подключаем к PB2 подтягивающий резистор на плюс питания while(1) { if ((PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) ) { PORTC = 0b0000000; } else { PORTC = 0b0000010; } } }
Скачать файл hex и с для логического элемента И-НЕ:
– скачать в формате tar.gz
– скачать в формате zip
—————————–
Два элемента И-НЕ на Atmega88
—————————–
Вход PB1 и PB2, выход PC1
Вход PB3 и PB4, выход PC2
#include <xc.h> #define F_CPU 16000000UL // 1 MHz clock speed int main(void) { DDRC = 0xFF; DDRB = 0b0000110; PORTB |= ( 1 << 1 ); PORTB |= ( 1 << 2 ); PORTB |= ( 1 << 3 ); PORTB |= ( 1 << 4 ); while(1) { if ((PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) ) { //PORTC = 0b0000000; PORTC &= ~(1 << PC1); } else { //PORTC = 0b0000010; PORTC |= (1 << PC1); } if ((PINB & (1<<PINB3)) && (PINB & (1<<PINB4)) ) { //PORTC = 0b0000000; PORTC &= ~(1 << PC2); } else { //PORTC = 0b0000100; PORTC |= (1 << PC2); } } }
Скачать файл hex и с для двух логических элементов И-НЕ на одной Atmega88:
– скачать в формате tar.gz
– скачать в формате zip
—————————–
Три элемента И-НЕ на Atmega88
—————————–
Вход PB1 и PB2, выход PC1
Вход PB3 и PB4, выход PC2
Вход PB0 и PB5, выход PC3
#include <xc.h> #define F_CPU 16000000UL // 1 MHz clock speed int main(void) { DDRC = 0xFF; DDRB = 0b0001110; PORTB |= ( 1 << 0 ); PORTB |= ( 1 << 1 ); PORTB |= ( 1 << 2 ); PORTB |= ( 1 << 3 ); PORTB |= ( 1 << 4 ); PORTB |= ( 1 << 5 ); while(1) { if ((PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) ) { //PORTC = 0b0000000; PORTC &= ~(1 << PC1); } else { //PORTC = 0b0000010; PORTC |= (1 << PC1); } if ((PINB & (1<<PINB3)) && (PINB & (1<<PINB4)) ) { //PORTC = 0b0000000; PORTC &= ~(1 << PC2); } else { //PORTC = 0b0000100; PORTC |= (1 << PC2); } if ((PINB & (1<<PINB0)) && (PINB & (1<<PINB5)) ) { //PORTC = 0b0000000; PORTC &= ~(1 << PC3); } else { //PORTC = 0b0001000; PORTC |= (1 << PC3); } } }
Скачать файл hex и с для двух логических элементов И-НЕ на одной Atmega88:
– скачать в формате tar.gz
– скачать в формате zip