Программу писал в 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;
}
}






