Спойлер
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
unsigned char massiv[101]; // Принимаемый массив кода брелка
unsigned char i_massiv = 0; // Его индекс
int main(void) {
/* Задействую порт B, прием сигнала на вывод 7
Индикация окончания приема вывод 0
(на нем будет светодиод через резистор).
Остальные порты на вход + подтягивающий резистор
против наводок
*/
DDRB &= 0;
DDRB |= (1<<0);
PORTB |= 0b11111111;
PORTB &= ~(1<<7);
PORTB &= ~(1<<0);
for (int i = 0; i < 101; i++) { // Запись массива левыми числами
massiv[i_massiv] = i_massiv;
i_massiv++;
}
i_massiv = 0;
while (1) {
if (PINB == 0b01111110) { // Проверка нуля на 7 ножке
for (int i = 0; i < 9; i++) { // Проверяем 9 раз по 800мкс = 720мкс (10мс разрыв между кодами)
if (PINB == 0b11111110) break; // Если '1', то прервать проверку
_delay_us(800);
if (i == 8) i_massiv = 1; // Если успешно, условный переход на запись данных в массив
}
if (i_massiv == 1) { // Сам условный переход
i_massiv = 0;
while (PINB != 0b01111110); // Ждем первой '1' (оставшаяся время до кода)
_delay_us(170); // Задержка в пол импульса
for (int i = 0; i < 101; i++) { // Запись данных в массив
massiv[i] = PINB>>7;
_delay_us(340);
}
}
}
if (massiv[97] == 1) PORTB |= (1<<0); // Собственно, записался ли код ('1' точно должна быть на 97 месте моего кода)
//if (massiv[97] == 0) PORTB |= (1<<0); // Проверка общая, вообще ли записывает что то в массив (0 или 1)
}
return 0;
}
Хотел сначала, но будет куча прерываний ложных + еще счетчик задействовать. И как эти "кривые" импульсы определить? Думаю, сложнее получилось бы)) А тут простая логика, проще. А что проще - то надежнееНу в простейшем случае - подаём на вывод INT
Пока дописывал сообщение, обнаружил баг у себя (светодиодик загорелся). Оказывается, к ночи эфир очищается и уровень 0 стоит достаточно долго. Вот и срабатывает. Получается, что проверка на 0 проходит и идет запись в массив. Надо добавить дальше одну проверку на первые импульсы. Да и хотя, когда добавлю код брелка, он не совпадет с записанным массивом, поэтому не особо и баг получается) Но чтобы лишний раз массив не записывался добавлю проверку.
И да, поле деятельности (пока что камень Atmega8A). То, что конденсатор мятый - знаю. Китайцы таким прислали
Спойлер



