На основе предыдущей записи:
“микроник.рус/7491/”
Ниже Вы сможете скачать hex, с файлы для прошивки 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. Учимся мигать светодиодом:
…
Теперь давайте создадим игровой автомат из казино на Atmega8515 – сделаем пока простое устройство из 6 светодиодов (два ряда по 3 светодиода) и кнопки – нужно зажечь светодиоды так, чтобы они были в одном ряду – как на автомате “однорукий бандит”.
Вот схема устройства:
То есть 3 зелёных светодиода подключены к ножкам PC0 PC1 PC2, остальные 3 жёлтых светодиода к ножкам PA0 PA2 PA3, кнопка подключена к ножке PD2.
Вот код устройства на языке С:
#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;
PORTA=0xFF;
DDRA=0xFF;
DDRD = 0b0000110; // ????????????? ????? ????? PA1 2 - ??? ????
PORTD |= ( 1 << 1 ); // ?????????? ? PA1 ????????????? ???????? ?? ???? ???????
PORTD |= ( 1 << 2 ); // ?????????? ? PA2 ????????????? ???????? ?? ???? ???????
char in = 1; // ????????? ?????????? in ? ?????????? ? ??? ????? 1
char ip = 0; // ????????? ?????????? in ? ?????????? ? ??? ????? 0 - ????? ?????????? ????? ?????? ????????
while (ip==0)
{
PORTC = 0b0000001;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
PORTC = 0b0000010;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
PORTC = 0b0000100;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
}
while (ip==1)
{
PORTA = 0b0000001;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
PORTA = 0b0000100;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
PORTA = 0b0001000;
_delay_ms(100);
if (!(PIND & (1<<PIND2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
}
}
Скачать hex файл и файл с можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве
Видео, работы устройства:
“rutube.ru/video/1585e9eeb53b12e11a952c474569898b/”
Теперь увеличим количество светодиодов, первое, что сделаю – перекину кнопку на ножку PB2:
DDRB |= ( 1 << 2 ); PORTB |= ( 1 << 2 );
И нужно заменить проверку нажатия кнопки соответственно на PB2:
if (!(PINB & (1<<PINB2)) && in == 1 ) /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
{
in = 0; // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1; // ?????? ?????? ??????
_delay_ms(100); // 2. ???????? 100??. ???????? ????????? ???????? ?????????
}
// ?????? ???? ???????, ????? ????? ????? ????????:
if (PINB & (1 << PINB2) && in == 0) /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1; // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
Вот код – скачать си файл:
Скачать си файл в tar.gz архиве.
Скачать си файл в zip архиве.
Подключил 12 светодиодов (3 ряда по 4 светодиода).
Видео:
“rutube.ru/video/bf95adf6879527e6e31e735f22672313/”
Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве
————————————–
Добавил световой эффект “змейки” по кругу при зажигании трёх светодиодов в одном ряду, как в казино!!!
Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве
Добавил переменные, при их равенстве срабатывает выигрышная подсветка!
—————————————
Немного замедлил мигание светодиодов (для тестирования устройства – самое то), добавив код задержки перед зажиганием светодиодов – результат мне понравился – стабильная работа устройства:
Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве
————————————-
Сделал прототип устройства – упаковал в коробку из под конфет:
Сделал выходы под + и -, а также под перепрограммирование: reset, sck, miso и mosi, а также перемычку – отключающую светодиоды при перепрограммировании.
———————————————-
Чтобы перезапустить игру – нужно выключить и включить его заново. Можно поставить перезапуск на кнопку, а также добавить музыку…









