Вт окт 10, 2023 17:14:40
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint16_t signal[200]; // Массив хранения счетчика
uint8_t n_signal; // Переменная порядкового номера записи в массив
uint8_t sw; // Переменная последовательности действий Свитч1
ISR(INT0_vect){ // Обраьотчик внешнего прерывания (читаем импульсы)
switch (sw){
case 0:
TIMSK|=(1<<TOIE1); // Разрешаем прирывание по переполнению
TCCR1B|=(1<<CS10); // настройка таймер-счетчика без делителя, 1 такт=1мкс
TCNT1=0; // Обнуляем счетный регистр
sw=1; // Переход к следующему действию
PORTD&= ~(1<<PIND7);
break;
case 1:
signal [n_signal]=TCNT1; // Сохраняем значение счетчика в массив
TCNT1=0;
n_signal++; // Инкркментируем порядковый номер в массиве
break;
}
}
ISR(TIMER1_OVF_vect){ // Обработчик прерывания по переполнению (отклчаем все, если пауза длинная)
TCCR1B&= ~(1<<CS10); // Выключаем таймер-счетчик
TIMSK&= ~(1<<TOIE1); // Запрещаем прирывание по переполнению
GICR&= ~(1<<INT0); // Запрещаем работу внешнего прерывания
TCNT1=0; // Обнуляем счетный регистр
print_N_Signals(); //выводим количиство считаных имульсов
sw=0;
n_signal=0;
}
ISR(TIMER1_COMPB_vect){ // Обрпботчик прерывания по совпадению
n_signal++;
if (signal[n_signal]!=0)
{
PORTD^=(1<<PIND5); // Инвертируем состояние ИК светодиода
TCNT1=0; // Обнуляем счетный регистр
OCR1B= signal[n_signal]; // устанавливаем в регистр совпадения Новое сохраненное значение
}
else
{
TCCR1B&= ~(1<<CS10); // Выключаем таймер-счетчик
TIMSK&= ~(1<<OCIE1B); // Запрешаем прирывание по совпадению
OCR1B=0; // Обнуляем регистр сравнения
TCNT1=0; // Обнуляем счетный регистр
PORTD&= ~(1<<PIND5); // Отключаем ИК светодиод
print_N1_Signals(); // Выводим количиство Блинков имульсов
n_signal=0;
}
}
int main(void)
{
lcd_init();
DDRD &= ~(1<<2); // Порт пина 3 INT1 на вход
PORTD|=(1<<PIND2); // Пин порта 3 - Высокий потенциал
DDRD &= ~(1<<4); // Порт пина 4 (кнопка) на вход
PORTD|=(1<<PIND4); // Пин порта 4 - Высокий потенциал
DDRD &= ~(1<<1); // Порт пина 1 (кнопка) на вход
PORTD|=(1<<PIND1); // Пин порта 1 - Высокий потенциал
DDRD|=(1<<7); // Настройка порта Сигнального светодиода
PORTD&= ~(1<<PIND7); // Настройка пина Сигнального светодиода
DDRD|=(1<<5); // Настройка порта ИК светодиода
PORTD&= ~(1<<PIND5); // Настройка пина ИК светодиода
sei(); // разрешить глобально прерывания.
print_N_Signals(); //выводим количиство считаных имульсов
_delay_ms(5);
while (1)
{
if (~PIND&(1<<PIND4)){ // кнопка старта записи сигнала
_delay_ms(200);
n_signal=0;
print_N_Signals();
MCUCR|=(1<<ISC00); // Настраиваем прерывание по любому изменению уровня
GICR|=(1<<INT0); // Разрешаем работу внешнего прерывания
PORTD|=(1<<PIND7); // Зажигаем светодиод
}
if (~PIND&(1<<PIND1)){ // кнопка старта воспроизведения сигнала
_delay_ms(200);
n_signal=0;
if (signal[n_signal]!=0){
TCCR1B|=(1<<CS10); // Включаем таймер-счетчик без делителя
TIMSK|=(1<<OCIE1B); // Разрешаем прирывание по совпадению
PORTD|=(1<<PIND5); // Зажигаем IR светодиод
OCR1B|= signal[n_signal]; // устанавливаем в регистр совпадения первое сохраненное значение
}
}
}
}
Вт окт 10, 2023 18:01:42
Вт окт 10, 2023 22:29:27
Ср окт 11, 2023 10:08:24
Ср окт 11, 2023 10:11:54
Ср окт 11, 2023 11:21:20
Ср окт 11, 2023 11:50:51
Ср окт 11, 2023 11:58:34
Ср окт 11, 2023 12:43:10
Ср окт 11, 2023 12:46:40
Ср окт 11, 2023 13:08:07
Ср окт 11, 2023 13:23:30
Ср окт 11, 2023 13:41:49
Ср окт 11, 2023 13:56:43
Ср окт 11, 2023 14:58:32
u37 писал(а):Возьмите аппаратный таймер, с выходом наружу, запустите его на частоту 36 кГц. Теперь, ваш излучающий светодиод нужно подключить к двум выводам процессора (через резистор, конечно) - один на выход таймера, где всегда будет генерироваться 36 кГц, и другим портом, где вы выдаете последовательность вспышек.
//////////////////////////////////////////////////////////////////////////TX_TV:
unsigned char TX_TV_st; // счёт байт
unsigned char TX_TV_Mask; // маска
///////////////////////////////////////////////
void TX_TV(void)
{
/////////////////////////////////////////////// TX: NEC
// Преамбула 9000 us / 27 us = 324
//for (y=0; y<324; y++) {
// PORTC.0=1;
// delay_us(13);
// PORTC.0=0;
// delay_us(9);
//};
/////////////////////////////////////////////// TX: TV SAMSUNG
//TV SAMSUNG
//22h - длительность преамбулы. -4,5 mc
//22h - длительность преамбулы. -4,5 mc
//07h - адрес устройства (SAMSUNG).
//07h - адрес устройства (SAMSUNG).
//68h - адрес команды (номер кнопки).
//97h - инверсия адрес команды (номер кнопки).
TX_int[0] = 0x07;
TX_int[1] = 0x07;
//TX_int[2] = 0x68;
TX_int[3] =~ TX_int[2];
/////////////////////////////////////////////// TX: TV SAMSUNG
// Преамбула 4500 us / 27 us = 162
for (y=0; y<162; y++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
/////////////////////////////////////////////// TX: TV SAMSUNG
// Преамбула 4500 us
delay_us(4500);
/////////////////////////////////////////////// TX: байт SAMSUNG
//for (TX_Modem_st=0; TX_Modem_st<48; TX_Modem_st++) { // 48
for (TX_TV_st=0; TX_TV_st<4; TX_TV_st++) { // 4
/////////////////////////////////////////////// TX: Data: TV SAMSUNG
TX_TV_Mask=0b00000001;
do {
///////////////////////////////////////////// TX: Data: TV SAMSUNG
// Маркер 560 us / 27 us = 23
for (xTX=0; xTX<23; xTX++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
///////////////////////////////////////////// TX: 1 <> 0 SAMSUNG
delay_us(560);
if (TX_int[TX_TV_st] & TX_TV_Mask) {delay_us(1125);};
TX_TV_Mask=(TX_TV_Mask<<1);
}
while (TX_TV_Mask);
/////////////////////////////////////////////// TX: байт END TV SAMSUNG
};
/////////////////////////////////////////////// TX: стоп TV SAMSUNG
// Маркер 560 us / 27 us = 23
for (xTX=0; xTX<23; xTX++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
/////////////////////////////////////////////// TX:
//PORTC.0=0; // сброс TX
}
Ср окт 11, 2023 16:41:33
Ср окт 11, 2023 18:51:27
Vovik-78 писал(а):Ну так у вас, как я понимаю, тут уже все сигналы дешифрованы.
Зачем тогда приемник?
Ср окт 11, 2023 20:05:03
Чт окт 12, 2023 08:23:09
Чт окт 12, 2023 10:17:19