Atmega8515 добавляем кнопку на языке С

Программу писал в MPLab X 5.35 и компилятор MPlab XC8 версии 2.10, как установить её на Linux смотрите здесь:

Скачать MPLAB X v5.35 + MPLAB XC8 можно здесь:
“https://web.archive.org/web/20200724202813/https://www.microchip.com/development-tools/pic-and-dspic-downloads-archive”

“rutube.ru/video/eb28c94503b777a0a6ffc61dc9a5b3ed/”

1. Учимся мигать светодиодом:

Схема подключения светодиода (мне попалась квадратная 8515, которая изображена слева):

Код на Си – мигать светодиодом будем на ножке RC3 (PORTC=0x08 или PORTC=00001000) :

#include <xc.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 1000000UL // 1 MHz clock speed
 
int main(void)
{
PORTC=0xFF;
DDRC=0xFF; 
 
while (1)
      {
      PORTC=0x08;
      //delay_ms(1000);
      _delay_ms(1000);
      PORTC=0x00;
      _delay_ms(1000);
      }
}

Скачать hex и Cи файлы для мигания светодиодом на Atmega8535:
– скачать в zip архиве
– скачать в tar.gz архиве

Фьюзы стандартные – по умолчанию (в PonyProg2000 будут такие же):

Программатор использовал самодельный AVRasp – “gameforstreet.ru/usb-programmator-na-atmega88/”

Но можно прошить и более легким – Программатор 5 проводков (“микроник.рус/4731/”) и программа PonyProg2000 (там есть Atmega8515. Скачать PonyProg можно с моего сайта – здесь. Скачать более новую PonyProg 2.08c можно здесь – “микроник.рус/6276/” – с моего сайта.

2. Добавляем кнопку к Atmega 8515

Добавлял кнопки на основе своей записи – “микроник.рус/6390/”

Код на СИ получился следующий:

#include <xc.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 1000000UL // 1 MHz clock speed
 
int main(void)
{
PORTC=0xFF;
DDRC=0xFF; 

DDRA = 0b0000110;  // Конфигурируем вывод порта PA1 - как вход
PORTA |= ( 1 << 1 ); // Подключаем к PA1 подтягивающий резистор на плюс питания
PORTA |= ( 1 << 2 ); // Подключаем к PA2 подтягивающий резистор на плюс питания
char in = 1;  // Объявляем переменную in и записываем в неё число 1
char ip = 0; // Объявляем переменную in и записываем в неё число 0 - будет показывать какая кнопка включена
 
while (1)
      {
      //PORTC=0x08;
      //delay_ms(1000);
      _delay_ms(1000);
      //PORTC=0x00;
      _delay_ms(1000);
      
      if (!(PINA & (1<<PINA1)) && in == 1 )    /* если PA1 стал равен нулю и значение in при этом = 1, то мы поймали замыкание кнопки на входе, т. е. перепад из 1 в 0 */
         {
in = 0;    // 1. Стало быть уровень входного сигнала стал равен нулю
ip = 1;    // Первая кнопка нажата
_delay_ms(100);    // 2. Задержка 100мс. Выжидаем окончания дребезга контактов
          }
   // Теперь ждём момента, когда копка будет отпушена:
if (PINA & (1 << PINA1) && in == 0)    /* если PA1 стал равен единице и in = 0,
то мы поймали на входе размыкание кнопки, т. е. перепад из 0 в 1 */
{
in = 1;    // В этот момент уровень входного сигнала стал равен нулю
_delay_ms(100);    /* Задержка 100мс - опять ждём окончания дребезга,
больше ничего в момент размыкания кнопки делать не будем */
}
      
      if (ip == 1)
{
PORTC = 0b0000010;    // 3. Включаем светодиод на ножке PC1
}
      
      }
}

То есть кнопка находится на PA1 – если подать питание в 5В, то светодиоды будут гореть на всех выходах PortC, но если на вход PA1 подать минус, то гореть будет только выход PC1 (PORTC = 0b0000010;).

————————————————-

Проверим работает кнопка на всех портах или нет

————————————————–

Кнопки на PA2 (зажигает порт PORTD = 0b11110000) и PB2 (зажигает порт PORTC = 0b11110000)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 1000000UL // 1 МГц
   
int main(void)
{
PORTC = 0b00000000; //
DDRC=0xFF; //vihod 

DDRA |= ( 1 << 2 ); // кнопка на PA2
PORTA |= ( 1 << 2 );

PORTD = 0b00000000; //vihod
DDRD=0xFF; //

DDRB |= ( 1 << 2 ); // кнопка на PB2
PORTB |= ( 1 << 2 );

char in = 1;  
char ip = 1; 


   
while (1)
      {
if (!(PINA & (1<<PINA2)) && in == 1 )    // кнопка PA2 нажата
{
in = 0;    
_delay_ms(100);   
}
 
if (PINA & (1 << PINA2) && in == 0)    // кнопка PA2 отжата
{
in = 1;    
_delay_ms(100);
PORTD = 0b11110000; 
_delay_ms(8000);
}
     //_delay_ms(8000);
      PORTD = 0b00000000; 


      
if (!(PINB & (1<<PINB2)) && ip == 1 )    //кнопка на PB2 нажата 
{
ip = 0;  
_delay_ms(100);   
}
   
if (PINB & (1 << PINB2) && ip == 0)    // кнопка на PB2 отжата
{
ip = 1;    
_delay_ms(100);
PORTC = 0b11110000; 
_delay_ms(8000);
}
     //_delay_ms(8000);
      PORTC = 0b00000000; 
      
      }
}

————————————————————-

Кнопки на PC4 (зажигает порт PORTA = 0b11111111 и PORTD = 0b11111111)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 1000000UL // 16 MHz clock speed
   
int main(void)
{


DDRC |= ( 1 << 4 ); // кнопка на PС4
PORTC |= ( 1 << 4 );

PORTD = 0b00000000; //vihod
DDRD=0xFF; 

PORTA = 0b00000000; //vihod
DDRA=0xFF; 

char in = 1;  
   
while (1)
      {
      if (!(PINC & (1<<PINC4)) && in == 1 )    //кнопка на PС4 нажата 
         {
in = 0;   

_delay_ms(100);    
          }
   
if (PINC & (1 << PINC4) && in == 0)    // кнопка на PС4 отжата
{
in = 1;   
_delay_ms(100);
PORTA = 0b11111111; 
PORTD = 0b11111111; 
_delay_ms(8000);

}
     
      PORTA = 0b00000000; 
      PORTD = 0b00000000;
    
      }
}

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