Заменяем логические микросхемы (К155ЛА3, К155ЛЕ3 и др) – Atmega-ой

Странно но во многих радиомагазинах отсутствуют логические микросхемы – скорее всего в современной микроэлектронике их заменили обычные многофункциональные микроконтроллеры, например 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

Добавить комментарий