Перейти к содержанию

Как отсчитать такты на си ATTINY2313?


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

13 часов назад, tifaso сказал:

эти прошивки переносить на другие микросхемы. Надеюсь с переносом прошивок уже проблем не возникнет.

Не надейтесь.:)

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

@bulat943 Ну вроде бы с приёмником разобрался. Единственное сейчас нужно как то вписать в переменную полученный пакет данных. То есть когда получаем с пульта команду её нужно записать в переменную в том же формате как и отправляется с пульта. Это нужно чтобы в дальнейшем считывать с этой переменной какую команду мы получили и выполнить действие которое соответствует данной команде. У меня получается собрать пришедшую кодировку, но только по разным переменным.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

13 часов назад, Piotr__1 сказал:

два  специалиста нашли свою волну и творят, не надо им мешать

А как бы вы сделали? Я предложил лишь вариант,которых море!

Еще один писиалист... 

Изменено пользователем bulat943
Ссылка на комментарий
Поделиться на другие сайты

@bulat943 Ну так всё же по делу каким образом то записать код посылки принятый с пульта в одну переменную. Так удобней и правильней будет считывать и определять то что мы получили и выполнять нужное действие. Получить данные не проблема. Сложней записать каждую циферку в одну переменную чтоб собрать весь пакет посылки от пульта. Ведь только так можно будет без проблем узнать какая кнопка была нажата.

Изменено пользователем tifaso
Ссылка на комментарий
Поделиться на другие сайты

В 09.03.2024 в 18:13, tifaso сказал:

Но мне нужно понять как отсчитывать сами такты для передачи и приёма данных?

Железо подключать влом, на Протеусе 15 режим ШИМ не хочет работать, поэтому на 14 режиме, шапку набросал, в Протеусе работает, в железе не факт - проверять нужно. Слип и кнопки сделаешь. Если конечно это вообще нужно.

Спойлер
#include <xc.h>
//
#define on		144
#define off		216
#define FCPU	8000000
//
uint8_t pinB, pinC, pinD;	// код считанный с порта
uint8_t k;
uint8_t count;				// количество бит на передачу
uint8_t stop;
uint8_t key;				// код клавиши на передачу
uint8_t busy;				// занят передачей
//
int main(void)
{
	DDRB = 0b00000010;
	PORTB = 0b1111101;
	//
//	DDRD = 0b00000000;
//	PORTD = 0x7F;
	//

	//DDRA = 2;
	//PORTA = 1;
	//
	//GIMSK = 0b00111000;		// включить прерывание PCINT
	//PCMSK2 = 0b01111111;	// включить прерывание PCINT
	//PCMSK1 = 0b00000001;	// включить прерывание PCINT
	//PCMSK = 0b11111111;		// включить прерывание PCINT
	//MCUCR = 0b00110000;		// включить спящий режим и установить режим отключения питания
	//ACSR = 0b10000000;		// выключает аналог. компаратор - никогда не использовался (экономия энергии)
	//PRR = 0b00000111;		// ;отключает другие вещи: цитаты, USI, USART (экономия энергии)
	//
	ei();
	//
	busy = 0;	
	OCR1A = on;				// 144 - высокий уровень ШИМ
	ICR1 = off;				// 216 - частота ШИМ - 8МГц/216=37037Гц
	TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11) | (0 << WGM10);
	TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) |(1 << CS10); // включить таймер без делителя
	//	
	while(1)
	{
		// проверить, что нажата хотя бы одна кнопка
		// ...
		// проверить, что нажата только одна кнопка
/*		
		if (((pinB + pinC) > pinB) | (((pinC + pinD) > pinC)))
		{

		}
		else
		{

		}
*/		
		// ...
		// если есть данные на передачу и предыдущая передача завершена, то передать вычисленный код кнопки
		if (!busy)
		{	// передача закончена
			busy = 1;					// занят передачей
			key = 0x10 | 14;			// код на передачу, 0х10-спецкод, 14-код кнопки
			k = 1;
			count = 8;					// количество бит на передачу
			OCR1A = on;					// разрешить несущую
			TIFR1 = (1 << TOV1);		// сбросить флаг прерывания		
			TIMSK1 |= (1 << TOV1);		// включить прерывание
		}
		
	}
}
//
void __interrupt(TIMER1_OVF_vect_num) TIMER1_OVF_vect(void)
{
	k++;
	//	 
	if (k == 16)
	{
		OCR1A = off;		// выключить несущую
		if (key & 0x80)		// какой бит на передачу
			stop = 80;		// бит равен 1
		else
			stop = 32;		// бит равен 0
		if (count == 0)
			stop = 255;		// пауза между передачами
		key <<= 1;			// на следующий бит
	}
	else
	{
		if (k == stop)		
		{	// завершена передача бита
			if (count)
			{	// есть еще биты на передачу
				OCR1A = on;	// включить несущую
				count--;	// уменьшить количество бит
				k = 0;
			}
			else
			{
				TIMSK1 &= (~(1 << TOV1));	// выключить прерывание
				busy = 0;					// передача окончена
			}	
		}
	}
}
	
//
void __interrupt(PCINT0_vect_num) PCINT0_vect(void)
{
	pinB = PINB;	// считать код
}
//

void __interrupt(PCINT1_vect_num) PCINT1_vect(void)
{
	pinC = PINC;	// считать код
}
//
void __interrupt(PCINT2_vect_num) PCINT2_vect(void)
{
	pinD = PIND;	// считать код
}
//

 

 

Безымянный1.png

Pult328.7z

Ссылка на комментарий
Поделиться на другие сайты

 

@donec С данным кодом пока так и не разобрался.

А вот в общем то что я переписывал прошивки для пульта и приёмника.

Спойлер
// Передатчик ДУ, 16 каналов
// CPU 1 МГц
// f 37000 Гц
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

void KRATKA_0(void);
void KRATKA_1(void);
void DLOUHA_0(void);
void DLOUHA_1(void);

volatile uint8_t K0=0;
volatile uint8_t KA0=0;
volatile uint8_t KB0=0;
volatile uint8_t K1=0;
volatile uint8_t KA1=0;
volatile uint8_t KB1=0;
volatile uint8_t D0=0;
volatile uint8_t DA0=0;
volatile uint8_t DB0=0;
volatile uint8_t D1=0;
volatile uint8_t DA1=0;
volatile uint8_t DB1=0;

volatile uint8_t KRATKA_K0=0;
volatile uint8_t KRATKA_K1=0;
volatile uint8_t DLOUHA_D0=0;
volatile uint8_t DLOUHA_D1=0;

int main(void)
{
    DDRB  = 0b00000000; // управление направлением порты на вход
    PORTB = 0b11111111; // установить порт B
    DDRD  = 0b00000000; // управление направлением порты на вход
    PORTD = 0b01111111; // установить порт D
    DDRA  = 0b00000010; // управление направлением порты на вход и выход
    PORTA = 0b00000001; // установить порт A
    
    GIMSK  = 0b00111000; // включить прерывание PCINT
    PCMSK2 = 0b01111111; // включить прерывание PCINT
    PCMSK1 = 0b00000001; // включить прерывание PCINT
    PCMSK  = 0b11111111; // включить прерывание PCINT
    
    MCUCR = 0b00110000; // включить спящий режим и установить режим отключения питания
    ACSR  = 0b10000000; // выключает аналог. компаратор - никогда не использовался (экономия энергии) 
    PRR   = 0b00001111; // отключает другие вещи: цитаты, USI, USART (экономия энергии)
    
    TIMSK |= (1<<1);     // включить TIMER0
    TCCR0A = 0b00000001; // включить TIMER0
    TCNT0 = 0;           // включить TIMER0
    
    sei (); // разрешить глобальное прерывание
    
    SLEEP_MODE_PWR_DOWN;
    
    while(1)
    {
        
    }
}
ISR(TIMER0_OVF_vect)
{
    if (KRATKA_K0==1)
    {
        KA0 + 1;
        if (KA0==216)
        {
            KB0 + 216;
            KA0=0;
            if (KB0==432)
            {
                K0=432;
                KRATKA_K0=0;
                PORTA |= (1<<1);
            }
        }
    }
    
    if (KRATKA_K1==1)
    {
        KA1 + 1;
        if (KA1==216)
        {
            KB1 + 216;
            KA1=0;
            if (KB1==432)
            {
                K1=432;
                KRATKA_K1=0;
                PORTA &= ~(1<<1);
            }
        }
    }
    
    if (DLOUHA_D0==1)
    {
        DA0 + 1;
        
        if (DA0==216)
        {
            DB0 + 216;
            DA0=0;
            if (DB0==1728)
            {
                D0=1728;
                DLOUHA_D0=0;
                PORTA |= (1<<1);
            }
        }
    }    

    if (DLOUHA_D1==1)
    {
        DA1 + 1;
    
        if (DA1==216)
        {
            DB1 + 216;
            DA1=0;
            if (DB1==6912)
            {
                D1=6912;
                DLOUHA_D1=0;
                PORTA |= (1<<1);
            }
        }
    }
    
}
ISR(PCINT0_vect)
{
    //Кнопки 0-7
    
    //Кнопка 0
    if (~PINB & (1<<0))
    {
        //00001111
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 1
    if (~PINB & (1<<1))
    {
        //00011110
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 2
    if (~PINB & (1<<2))
    {
        //00101101
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 3
    if (~PINB & (1<<3))
    {
        //00111100
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 4
    if (~PINB & (1<<4))
    {
        //01001011
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 5
    if (~PINB & (1<<5))
    {
        //01011010
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 6
    if (~PINB & (1<<6))
    {
        //01101001
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 7
    if (~PINB & (1<<7))
    {
        //01111000
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
}
ISR(PCINT1_vect)
{
    //Кнопки 8-14
    
    //Кнопка 8
    if (~PIND & (1<<0))
    {
        //10000111
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 9
    if (~PIND & (1<<1))
    {
        //10010110
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 10
    if (~PIND & (1<<2))
    {
        //10100101
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 11
    if (~PIND & (1<<3))
    {
        //10110100
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 12
    if (~PIND & (1<<4))
    {
        //11000011
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
    
    //Кнопка 13
    if (~PIND & (1<<5))
    {
        //11010010
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
    
    //Кнопка 14
    if (~PIND & (1<<6))
    {
        //11100001
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
    }
}
ISR(PCINT2_vect)
{
    //Кнопка 15
    if (~PINA & (1<<0))
    {
        //11110000
        //Кодируется и передаётся пакет данных
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        DLOUHA_1();//сверхдлинный цикл
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        DLOUHA_0();//1
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
        KRATKA_0();//0
        KRATKA_1();
    }
}

void KRATKA_0(void)//0 432 такта
{
    PORTA &= ~(1<<1);
    KRATKA_K0=1;
    if (KRATKA_K0==0)
    {
        PORTA |= (1<<1);
    }
}
void KRATKA_1(void)//1 432 такта
{
    PORTA |= (1<<1);
    KRATKA_K1=1;
    if (KRATKA_K1==0)
    {
        PORTA &= ~(1<<1);
    }
}
void DLOUHA_0(void)//0 1728 тактов
{
    PORTA &= ~(1<<1);
    DLOUHA_D0=1;
    if (DLOUHA_D0==0)
    {
        PORTA |= (1<<1);
    }
}
void DLOUHA_1(void)//0 6912 тактов
{
    PORTA &= ~(1<<1);
    DLOUHA_D1=1;
    if (DLOUHA_D1==0)
    {
        PORTA |= (1<<1);
    }
}
Спойлер
// 16-канальный приемник ДУ
// кодируется длиной промежутка.
// 1 МГц ATTiny2313A
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

volatile uint8_t startC=0;
volatile uint8_t firstT=0;
volatile uint8_t newC=0;
volatile uint8_t Command;
volatile uint8_t Command1;
volatile uint8_t i;

int main(void)
{
	DDRB  = 0b11111111; // управление направлением порты на вход
	PORTB = 0b00000000; // установить порт B
	DDRD  = 0b01111111; // управление направлением порты на вход
	PORTD = 0b00000000; // установить порт D
	DDRA  = 0b00000001; // управление направлением порты на вход и выход
	PORTA = 0b00000010; // установить порт A
	
	//НАСТРОЙКИ ТАЙМЕРА
	#define StopT0	TIMSK &= ~(1 << TOIE0); //макрос для старта таймера
	#define StartT0	TIMSK |= (1 << TOIE0);	//макрос стоп таймера
	
	sei (); // разрешить глобальное прерывание
	PCMSK1 = 0b00000010; //разрешить прерывание PCINT на PA1 (PCINT9)
	MCUCR = 0b00110000;  //включить спящий режим и установить режим отключения питания
	TCCR0A = 0b00000001; // включить TIMER0
	TCCR0B = 0b00000011; //делитель 64
	
	//TIMSK = 0b00000001;  //разрешить прерывание OCIE0A
	
	GIMSK = 0b00001000;  //разрешить прерывание PCINT1
	
	ACSR = 0b10000000;   //выключает аналог. компаратор - никогда не использовался (экономия энергии)
	
	sei (); // разрешить глобальное прерывание
	
	SLEEP_MODE_PWR_DOWN;
	
    while(1)
    {
        if (newC) 
		{
			//есть команда?
	        newC = 0;	//теперь нет
	        if (Command == Command1) //равны ли прямая и инверсная?
			    {
		            if (Command1==0000)
		            {
						//Команда 0
						PORTB |= (1<<0);
		            }
					if (Command1==0001)
					{
						//Команда 1
						PORTB |= (1<<1);
					}
					if (Command1==0010)
					{
						//Команда 2
						PORTB |= (1<<2);
					}
					if (Command1==0011)
					{
						//Команда 3
						PORTB |= (1<<3);
					}
					if (Command1==0100)
					{
						//Команда 4
						PORTB |= (1<<4);
					}
					if (Command1==0101)
					{
						//Команда 5
						PORTB |= (1<<5);
					}
					if (Command1==0110)
					{
						//Команда 6
						PORTB |= (1<<6);
					}
					if (Command1==0111)
					{
						//Команда 7
						PORTB |= (1<<7);
					}
					if (Command1==1000)
					{
						//Команда 8
						PORTD |= (1<<0);
					}
					if (Command1==1001)
					{
						//Команда 9
						PORTD |= (1<<1);
					}
					if (Command1==1010)
					{
						//Команда 10
						PORTD |= (1<<2);
					}
					if (Command1==1011)
					{
						//Команда 11
						PORTD |= (1<<3);
					}
					if (Command1==1100)
					{
						//Команда 12
						PORTD |= (1<<4);
					}
					if (Command1==1101)
					{
						//Команда 13
						PORTD |= (1<<5);
					}
					if (Command1==1110)
					{
						//Команда 14
						PORTD |= (1<<6);
					}
					if (Command1==1111)
					{
						//Команда 15
						PORTA |= (1<<0);
					}
	            }
        }
    }
}
ISR(TIMER0_OVF_vect)
{
    //переполнение Т0 16мс, что больше любого из кусков пакета
	if (firstT ==0)
	{
		firstT = 1;
	}
	/* Первое прерывание возникает при его запуске, оно нам не надо.
	Даже если не возникает, временной интервал просто увеличится до 32мс. */
	else
	{
		startC = 0; //ждем новой команды
		firstT = 0; //для следующего "первого" запуска
		StopT0; //стоп таймер
	}
}
ISR(PCINT1_vect)
{
	if (startC == 0)
	 {
		//первое прерывание
		newC = 0; //флаг новой команды
		startC = 1; //начали принимать
		StartT0; //старт Т0
	 } 
	else
	 {  	
        i = 8; //количество бит ожидаемой посылки
		
		if(TCNT0>427 & TCNT0<437)
		 {
			//432мс НОЛЬ (диапазон 427 ... 437 мс)
			if ((i>0) & (i<5)) Command1 &= ~(1<<(i-1)); //запись бита в прямую
			if ((i>4) & (i<9)) Command |= (1<<(i-9)); //и инверсную команды		
			i--;
		 }
		if(TCNT0>1718 & TCNT0<1738)
		 {
			//1,728мс ЕДИНИЦА (диапазон 1,718 ... 1,738 мс)
			if ((i>0) & (i<5)) Command1 |= (1<<(i-1)); //запись бита в прямую
			if ((i>4) & (i<9)) Command &= ~(1<<(i-9)); //и инверсную команды
			i--;
		 }

		if(TCNT0>6902 & TCNT0<6922)
		 {
			//6,912мс повтор команды (диапазон 6,902 ... 6,922 мс)
			newC = 1; //повтор команды
		 }
		if (i==0)
		 {
			//все биты приняты
			StopT0; //стоп таймер
			newC = 1; //это новая команда
			startC = 0; //ждем новой команды
			firstT = 0;	//для следующего "первого" запуска таймера
		 }
	}
	TCNT0 = 0; //обнуляем счетчик
}

Ну как с умел так и записал однако оно вообще не заработало как пульт так и приёмник. Для проверки на чьей стороне не работает подсовывались оригинальные прошивки перекрёстно проверяя сперва пульт, а потом и приёмник, но увы ничего не работает.

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, tifaso сказал:

каким образом то записать код посылки принятый с пульта в одну переменную

а он в сколько переменных записан? побитное в байт перевести нужно?

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, tifaso сказал:

но увы ничего не работает

Вот об этом я и говорил. Нужно было взять оригинальные прошивки, проверить их, и если они работают, то ничего не трогать в программе. 

С уважением, Владимир

Ссылка на комментарий
Поделиться на другие сайты

Вот тебе код передатчика для этой схемы, со спящим режимом не хочу разбираться, сам разберешься.

Спойлер
#include <xc.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
//
#define FCPU	8000000		// частота CPU
#define Ftsop	36000		// частота приемника, в зависимости от того какой приемник стоит
#define off		FCPU/Ftsop	// частота ШИМ - 8МГц/36000=222
#define on		off*2/3		// 148 - высокий уровень ШИМ
//
uint16_t keyDown, n;		// какие клавиши нажаты
uint8_t k, i;
uint8_t count;				// количество бит на передачу
uint8_t stop;
uint8_t key, keyout;		// код клавиши
uint8_t busy, mybusy;		// занят передачей
//
EMPTY_INTERRUPT(PCINT0_vect);
EMPTY_INTERRUPT(PCINT1_vect);
EMPTY_INTERRUPT(PCINT2_vect);
//
int main(void)
{
	DDRB = 0b00000010;
	PORTB = 0b11110000;
	//
	DDRD = 0b00000000;
	PORTD = 0b11111111;
	//
	DDRC = 0b00000000;
	PORTC = 0b00001111;
	//
	PCMSK2 = 0b11111111;	// включить прерывание PCINT
	PCMSK1 = 0b00001111;	// включить прерывание PCINT
	PCMSK0 = 0b11110000;	// включить прерывание PCINT
	PCICR = 0b00000111;
	ACSR = 0b10000000;		// выключает аналог. компаратор - никогда не использовать (экономия энергии)
	// настроить спячку
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	//
	i = 0;
	busy = 0;
	OCR1A = off;
	ICR1 = off;
	TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11) | (0 << WGM10);
	TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) |(1 << CS10); // включить таймер без делителя
	//
	while(1)
	{
		di();
		mybusy = busy;
		ei();
		//
		if (!i)
		{
			i = 1;
			for(keyDown = 0; keyDown < 10000; keyDown++);
		}
		keyDown = ~((PIND << 8) | (PINB & 0xF0) | (PINC & 0x0F));
		if (keyDown)
		{	// нажата хотя бы одна кнопка
			n = keyDown;
			for (key = 0; n; n &= (n - 1), key++);	// сколько кнопок нажато
			if (key == 1)
			{	// нажата только одна кнопка
				for(key = 0; keyDown; keyDown >>= 1, key++ );	// вычислить код клавиши
				if (!mybusy)
				{	// передача закончена
					busy = 1;								// занят передачей
					keyout = (key << 4) | (~key & 0x0F);	// код на передачу
					k = 1;
					count = 8;					// количество бит на передачу
					OCR1A = on;					// разрешить несущую
					TIFR1 = (1 << TOV1);		// сбросить флаг прерывания
					TIMSK1 |= (1 << TOV1);		// включить прерывание
				}
			}
		}
		else
		{
			if (!mybusy)
			{
				i = 0;
				cli();
				sleep_enable();		// разрешить сон
				sei();
				sleep_cpu();		// спать
				sleep_disable();	// запретить сон
			}
		}
	}
}
//
void __interrupt(TIMER1_OVF_vect_num) TIMER1_OVF_vect(void)
{
	k++;
	//
	if (k == 16)
	{	// передали несущую
		OCR1A = off;		// выключить несущую
		if (keyout & 0x80)	// какой бит на передачу
		stop = 80;		// бит равен 1
		else
		stop = 32;		// бит равен 0
		if (!count)
		stop = 255;		// пауза между передачами
		keyout <<= 1;		// на следующий бит
	}
	else
	{
		if (k == stop)
		{	// завершена передача бита
			if (count)
			{	// есть еще биты на передачу
				OCR1A = on;	// включить несущую
				count--;	// уменьшить количество бит
				k = 0;
			}
			else
			{	// все биты переданы
				TIMSK1 &= (~(1 << TOV1));	// выключить прерывание
				busy = 0;					// передача окончена
			}
		}
	}
}
//

 

 

Безымянный5.png

Ссылка на комментарий
Поделиться на другие сайты

11 минут назад, donec сказал:

Нажал кнопку, вычислил код и отдал на исполнение таймером

Так я о том и говорю в нажатии на кнопку имеем пакет данных которые нам и нужно отправить. Так вот как я тут буду их пересылать чтоб отправить в таймере задаются интервалы пакета данных, а как туда отправлять сами значения то? Не совсем понимаю механизм передачи данных.

Изменено пользователем tifaso
Ссылка на комментарий
Поделиться на другие сайты

Никуда их не нужно пересылать, это законченная программа которая все отправляет, в программе не хватает пару тройку строк спящего режима, а все остальное уже работает

Чтоб понимать что и как изучи FastPWM 14 режим счетчика 1.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, tifaso сказал:
if(TCNT0>427 & TCNT0<437)
...
if(TCNT0>1718 & TCNT0<1738)
...
if(TCNT0>6902 & TCNT0<6922)

 

TCNT0 только 0...255,он 8-ми битный,к тому же включен предделитель на 64

К тому же нет проверки какой сигнал пришел-0 или 1,PCINT срабатывает по любому изменению на входе

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, donec сказал:

Никуда их не нужно пересылать, это законченная программа которая все отправляет

При нажатии на кнопку мы имеем пакет данных его нужно отправить в таймер для дальнейшей отправки на ИК светодиод, а по другому я вижу как тут делать? Каким образом пересылать данные. Так что тут не полный цикл передачи данных.

23 минуты назад, bulat943 сказал:

TCNT0 только 0...255,он 8-ми битный

Ну это думаю не проблема значения можно и уменьшить.

25 минут назад, bulat943 сказал:

включен предделитель на 64

Делителем устанавливается частота. Это объяснялось как в той системе ду что у меня была до этого. Так и в том коде который я брал за основу приёмника.

31 минуту назад, bulat943 сказал:

К тому же нет проверки какой сигнал пришел-0 или 1,PCINT срабатывает по любому изменению на входе

Какой бит пришёл проверяется по интервалу времени как раз таки в TCNT0.

Ссылка на комментарий
Поделиться на другие сайты

Причем тут бит? с фотоприемника приходит лог 1 либо лог 0,когда сигнал переключается из 0 в 1 либо из 1 в 0 происходит прерывание PCINT,а у вас это не отслеживается ,а у автора отслеживается

SIGNAL:
IN STAV,PINY3
COM STAV	;инвертирует входной сигнал (приемник в состоянии покоя log1)

;Низкий уровень
SBRC STAV,1
RJMP NE_10

LDI REG,0
OUT TCNT0,REG

NE_10:

;Верхний уровень
SBRS STAV,1
RJMP NE_01

IN REG,TCNT0
....

Понятно,что устанавливается предделитель таймера0,от этой частоты и работает таймер,и если как у вас установить предделитель на 64 то таймер0 будет тикать каждые 64 мксек

В авторской прошивке установлен режим стс

Изменено пользователем bulat943
Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, tifaso сказал:

При нажатии на кнопку мы имеем пакет данных его нужно отправить в таймер для дальнейшей отправки на ИК светодиод, а по другому я вижу как тут делать? Каким образом пересылать данные. Так что тут не полный цикл передачи данных.

То есть Я должен доказать, что это законченная программа, и твоего дополнительного кода по отправке не нужно?

Знаешь, начал было расписывать, что и как, но теперь вижу, что не нужно этого делать.

Ссылка на комментарий
Поделиться на другие сайты

32 минуты назад, donec сказал:

То есть Я должен доказать, что это законченная программа

А тут и доказывать не нужно она не полная. Пакет данных из кнопки не переправить. Вот эту цепь действий я так и не понял как тут делается. Давай на примере хотя бы пару кнопок чтоб понять суть дела. К примеру нужно передать из пульта следующую посылку 01011010. При нажатии на кнопку нужно отправить эти данные в таймер чтобы он отсчитав все интервалы передал эту посылку уже к светодиоду.

Вот в прерываниях PCINT нужно проверять нажатия кнопок.

Только вот не совсем понятно для чего там чтение порта PORTB. Но догадываюсь что это для передачи данных в таймер. Верно мысль веду?

void __interrupt(PCINT0_vect_num) PCINT0_vect(void)
{
    pinB = PINB;    // считать код
}

 

34 минуты назад, bulat943 сказал:

Понятно,что устанавливается предделитель таймера0,от этой частоты и работает таймер,и если как у вас установить предделитель на 64 то таймер0 будет тикать каждые 64 мксек

В авторской прошивке установлен режим стс

В этой авторской прошивке я до конца так и не смог отследить всю цепь действий как раз таки из того что ассемблер постоянно перескакивает с одного места на другое (переадресации). В итоге я так и не смог его полностью переписать

Я за основу приёмника брал вот этот код тут практически полная программа приёмника.

https://habr.com/ru/articles/257041/

Изменено пользователем tifaso
Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, tifaso сказал:

она не полная

Товарищ, который так и не смог разобраться со сдвиговыми регистрами, пытается что-то доказывать в программировании не соображая при этом ни в нем ни в микроконтроллерах, как и в прочей радиоэлектронике? Кажется вечер перестает быть томным ...

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, tifaso сказал:

Я за основу приёмника брал вот этот код тут практически полная программа приёмника

Вас не смущает,что там приемник подключен к INT0,настроенный на прерывание по ниспадающему фронту,а у вас PCINT срабатывает в обоих случаях-в третий раз пишу

Если хотите сделать как в вашей ссылке,подключите фотоприемник к PORTD.2 или PORTD.3

 

Ссылка на комментарий
Поделиться на другие сайты

31 минуту назад, tifaso сказал:

А тут и доказывать не нужно она не полная.

Посмотрел,программа полная,должна работать

32 минуты назад, tifaso сказал:

При нажатии на кнопку нужно отправить эти данные в таймер

Там же есть запуск таймера,запуск ШИМ,через промежуток времени остановка ШИМ,снова промежуток (для 0 , 1  и паузы между посылками разный),стоп таймера

38 минут назад, tifaso сказал:

Только вот не совсем понятно для чего там чтение порта PORTB

Так там 4 кнопки на этом порту

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, tifaso сказал:

Для проверки на чьей стороне не работает подсовывались оригинальные прошивки перекрёстно проверяя сперва пульт, а потом и приёмник, но увы ничего не работает.

Если посмотреть код передатчика, то ощущение, что там специально ошибку сделали, чтобы не работало.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...