Attiny13a и ИК управление

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Attiny13a и ИК управление

Сообщение micle7 »

Подскажите, как сделать чтобы при нажатии на кнопку пульта, правильно подавался низкий/высокий сигнал на ножку.
Взял за основу этот код, снял команды пульта, в RCExplorer код одной кнопки add=FF00 и cmd=71

Код: Выделить всё

/*
 * IR Receiver.cpp
 *
 * Created: 12/1/2017 11:10:41 AM
 * Author : Dz Inventors
 */

#define F_CPU 9600000 // Must stay at this speed

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define IR_Input_Pin PORTB1

bool IR_Code(uint32_t data); // Check the IR Code
void IR_Scan(); // Scan IR data
void IR_Setup(); // Setup mode

uint32_t IR_data_out = 0; // IR data store

int main(void) {
		IR_Setup();

		DDRB |= 1 << PORTB4;
		DDRB &= ~(1 << IR_Input_Pin);
		PORTB = 0x00;

		while (1) {

				if (IR_Code(0xFF00718E)) {
					PORTB &= ~(1 << PORTB4);
				}
		}
}
void IR_Setup() {
		GIMSK |= 1 << INT0; // Enable the interrupt pin ( at PB1)
		MCUCR = (1 << ISC00); // Set interrupt configuration in PB1 (see page 46 for any change mode)
		sei();
		TCCR0B |= 1 << CS00 | 1 << CS02; //set timer 0 with max scaler (F_CPU/1024)
}
bool IR_Code(uint32_t data) {
		// Prettified IR data output code
		uint8_t IR_data_byte[4];
		IR_data_byte[0] = (IR_data_out >> 24);
		IR_data_byte[1] = (IR_data_out >> 16);
		IR_data_byte[2] = (IR_data_out >> 8);
		IR_data_byte[3] = (IR_data_out);
		// Prettified IR data input code
		uint8_t data_byte[4];
		data_byte[0] = (data >> 24);
		data_byte[1] = (data >> 16);
		data_byte[2] = (data >> 8);
		data_byte[3] = (data);
		if (IR_data_byte[0] == data_byte[0] || IR_data_byte[1] == data_byte[1]) { // If address data is =
				if (IR_data_byte[2] == data_byte[2] || IR_data_byte[3] == data_byte[3]) { // If command data is =
						IR_data_out = 0; // Clear IR data Output
						return true;
				}
		}
		return false;
}
ISR(INT0_vect) {
		IR_Scan();
}

uint8_t time_high = 0;
uint8_t time_low = 0;

bool interrupter1 = false;
bool interrupter2 = false;
bool one_time = false;

int conter = -1;

uint8_t TCNT0_buffer = 0;
uint8_t time_span = 0;

void IR_Scan() {
		// Timer unit = 106.666 µs
		if (TCNT0 >= TCNT0_buffer) // If timer doesn't overflow
				time_span = TCNT0 - TCNT0_buffer; // Get span time
		else //if timer overflow
				time_span = (256 - TCNT0_buffer) + TCNT0; // Get span time
		if (time_span <= 2) // Delete any noise < or = then 213 µs
				return void();

		if ((PINB & (1 << IR_Input_Pin)) == 0)
				time_high = time_span; // Get the time low
		else
				time_low = time_span; // Get the time high

		if ((time_low >= 78) && (time_low <= 91)) // Low for 9ms
				interrupter1 = true; // Enable the first interrupter

		if ((time_high >= 36 && time_high <= 49) && (interrupter1 == true)) { // High time 4.5ms
				IR_data_out = 0; // Clear data
				conter = -1; // Restart counter variable
				interrupter2 = true; // Enable the second interrupter (start condition is true)
		}
		if (conter == 32) { // Check if data send is over
				interrupter1 = interrupter2 = false; // Restart interrupters
				conter = -1; // Restart conter variable
		}

		if (interrupter2 == true) { // See if start condition is true

				if (one_time == true) { // Enter one time in two loops
						if (conter != -1) { // Over enter in the first time
								if (time_high > time_low * 2) // Means we read logic 1
										IR_data_out |= 0x80000000 >> conter; // Put the logic 1 in high significant bit and shift it to the right every loop
						}
						// else
						// IR_data_out=0; // Clear data
						conter++; // Up counter
				}
				one_time = !one_time; // Reverse state
		}
		TCNT0_buffer = TCNT0; // Scan timer
}

Прошиваю с фьюзами FF;7A
К attiny13a припаял на pb1 выход с приемника (TSOP1736 но точно не уверен, распиновку проверил тестером, + , земля, выход), подаю 5 вольт, замеряю тестером с ножки pb4, и получаю что реагирует на любые кнопки любого пульта, т.е. от попадания ик излучения на приемник напряжение то 5 вольт, то пропадает, то 2,5... Почему?
Протокол NEC.

Есть какая-то простейшая программа для ик управления под attiny13 для образца?
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

Почти все пульты при удержании кнопки коды повторяют непрерывно. Приведенный выше код поэтому и будет дергать PB4 туда-сюда постоянно, от этого на выходе и прет меандр, который показывается как 2.5В.
А вот почему реагирует на любую кнопку - это надо поглядеть код. Откуда приведенный код был взят?
Последний раз редактировалось NStorm Пн окт 14, 2019 11:04:19, всего редактировалось 1 раз.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Attiny13a и ИК управление

Сообщение ARV »

NStorm писал(а):Почти все пульты при удержании кнопки коды повторяют непрерывно.
далеко не все, скорее наоборот, очень немногие. большинство пультов для повтора отправляет спец-код "повтор", короткий и единый на все команды. по-моему, только стандарт RC5 повторяет код полностью, да и то с "плавающим" битом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

Да, и правда, NEC спец-последовательностью повтор отправляет.

Добавлено after 16 minutes 12 seconds:
в RCExplorer код одной кнопки add=FF00 и cmd=71
Это наверное не NEC, а Extended NEC. Тогда должно быть так в IR_Code():

Код: Выделить всё

      if (IR_data_byte[0] == data_byte[0] && IR_data_byte[1] == data_byte[1]) { // If address data is =
            if (IR_data_byte[2] == data_byte[2] && IR_data_byte[3] == data_byte[3]) { // If command data is =
Всё равно это не объясняет, почему от любого кода включалось.
Лог. анализатора нет? Чтобы посмотреть что реально там передается. Ну или ардуинку со скетчем для распознания кода
Реклама
Эиком - электронные компоненты и радиодетали
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Re: Attiny13a и ИК управление

Сообщение micle7 »

Код взял отсюда
В приложении коды с двух китайских пультов в RCExplorer и в irscrutinizer, некоторые кнопки совпадают.
И поведение странное, т.е. раз нажмешь - 5 вольт включится, еще раз 2,5 вольта, еще раз ноль, и так может хаотично быть. Но проверял и другим пультом (кроме этих китайских под которые пытаюсь сделать управление), тоже самое, попадает излучение на приемник - ножка хаотично реагирует.
Компилирую в atmel studio, ардуино нет под рукой, и лог анализатора тоже (нужно все заказать).
Вечером попробую изменить

Код: Выделить всё

 if (IR_data_byte[0] == data_byte[0] && IR_data_byte[1] == data_byte[1]) { // If address data is =
            if (IR_data_byte[2] == data_byte[2] && IR_data_byte[3] == data_byte[3]) { // If command data is =
и отпишусь.
Вложения
Screenshot_20191007_180408.png
(80.79 КБ) 321 скачивание
Screenshot_20190925_210942.png
(103.21 КБ) 312 скачиваний
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

Я там на картинке не 0x13 вижу, а 0xC8...

Добавлено after 17 minutes 1 second:
Да и слона-то я не приметил:

Код: Выделить всё

            if (IR_Code(0xFF00718E)) {
               PORTB &= ~(1 << PORTB4);
            }
Как это должно работать? Вы всегда пин в 0 устанавливаете. Откуда там у вас высокий уровень берется? Сдается мне тестером вы к пину выхода ИК-приемника подключились, а не к выходу PB4. Код поменяйте вот так:

Код: Выделить всё

[code]
            if (IR_Code(0xFF00718E)) {
               PORTB ^= (1 << PORTB4);
            }
И светик через резистор на него повесьте и смотрите.
Реклама
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Re: Attiny13a и ИК управление

Сообщение micle7 »

Все тоже самое, светодиод то включится, то наполовину светит, то выключится через несколько раз, и так с любой кнопкой происходит. 0x13 это с другого пульта аналогичного протокола, а так программирую кнопку "OFF" с кодом add=FF00 и cmd=71
Снял Видео
последний код

Код: Выделить всё

/*
 * IR Receiver.cpp
 *
 * Created: 12/1/2017 11:10:41 AM
 * Author : Dz Inventors
 */

#define F_CPU 9600000 // Must stay at this speed

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define IR_Input_Pin PORTB1

bool IR_Code(uint32_t data); // Check the IR Code
void IR_Scan(); // Scan IR data
void IR_Setup(); // Setup mode

uint32_t IR_data_out = 0; // IR data store

int main(void) {
		IR_Setup();

		DDRB |= 1 << PORTB4;
		DDRB &= ~(1 << IR_Input_Pin);
		PORTB = 0x00;

		while (1) {
				if (IR_Code(0xFF00718E)) {
					PORTB ^= (1 << PORTB4);
				}
		}
}
void IR_Setup() {
		GIMSK |= 1 << INT0; // Enable the interrupt pin ( at PB1)
		MCUCR = (1 << ISC00); // Set interrupt configuration in PB1 (see page 46 for any change mode)
		sei();
		TCCR0B |= 1 << CS00 | 1 << CS02; //set timer 0 with max scaler (F_CPU/1024)
}
bool IR_Code(uint32_t data) {
		// Prettified IR data output code
		uint8_t IR_data_byte[4];
		IR_data_byte[0] = (IR_data_out >> 24);
		IR_data_byte[1] = (IR_data_out >> 16);
		IR_data_byte[2] = (IR_data_out >> 8);
		IR_data_byte[3] = (IR_data_out);
		// Prettified IR data input code
		uint8_t data_byte[4];
		data_byte[0] = (data >> 24);
		data_byte[1] = (data >> 16);
		data_byte[2] = (data >> 8);
		data_byte[3] = (data);
		if (IR_data_byte[0] == data_byte[0] && IR_data_byte[1] == data_byte[1]) { // If address data is =
			if (IR_data_byte[2] == data_byte[2] && IR_data_byte[3] == data_byte[3]) { // If command data is =
		
						IR_data_out = 0; // Clear IR data Output
						return true;
				}
		}
		return false;
}
ISR(INT0_vect) {
		IR_Scan();
}

uint8_t time_high = 0;
uint8_t time_low = 0;

bool interrupter1 = false;
bool interrupter2 = false;
bool one_time = false;

int conter = -1;

uint8_t TCNT0_buffer = 0;
uint8_t time_span = 0;

void IR_Scan() {
		// Timer unit = 106.666 µs
		if (TCNT0 >= TCNT0_buffer) // If timer doesn't overflow
				time_span = TCNT0 - TCNT0_buffer; // Get span time
		else //if timer overflow
				time_span = (256 - TCNT0_buffer) + TCNT0; // Get span time
		if (time_span <= 2) // Delete any noise < or = then 213 µs
				return void();

		if ((PINB & (1 << IR_Input_Pin)) == 0)
				time_high = time_span; // Get the time low
		else
				time_low = time_span; // Get the time high

		if ((time_low >= 78) && (time_low <= 91)) // Low for 9ms
				interrupter1 = true; // Enable the first interrupter

		if ((time_high >= 36 && time_high <= 49) && (interrupter1 == true)) { // High time 4.5ms
				IR_data_out = 0; // Clear data
				conter = -1; // Restart counter variable
				interrupter2 = true; // Enable the second interrupter (start condition is true)
		}
		if (conter == 32) { // Check if data send is over
				interrupter1 = interrupter2 = false; // Restart interrupters
				conter = -1; // Restart conter variable
		}

		if (interrupter2 == true) { // See if start condition is true

				if (one_time == true) { // Enter one time in two loops
						if (conter != -1) { // Over enter in the first time
								if (time_high > time_low * 2) // Means we read logic 1
										IR_data_out |= 0x80000000 >> conter; // Put the logic 1 in high significant bit and shift it to the right every loop
						}
						// else
						// IR_data_out=0; // Clear data
						conter++; // Up counter
				}
				one_time = !one_time; // Reverse state
		}
		TCNT0_buffer = TCNT0; // Scan timer
}

NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

Чудеса какие-то. Не может этот код так работать.
Как и чем прошиваете?
Проверьте также схему соединения.
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Re: Attiny13a и ИК управление

Сообщение micle7 »

Видео как прошиваю.
Так чего-то не осилю никак это дело... :)
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

Нет, чуда не случилось )
У вас в окне редактора кода в студии открыт файл из проекта GccApplication5, а проект компилируете и прошиваете вы GccApplication8. Меняете один исходник, а компилируете и прошиваете совсем другой )
И да, в студии можно держать открытым исходник, который вообще к проекту текущему отношения не имеет )
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Re: Attiny13a и ИК управление

Сообщение micle7 »

Спасибо, кто бы мог подумать о таком недоразумении :) Однако, при всем старании, желаемый результат так все и не достигнут :)
Нашел еще ошибку, в RCExplorer и irscrutinizer разные коды кнопок, прилагаю скрин из RCExplorer и последний код с кнопкой off.
В данный момент никакой реакции на пульт, на выходе PB4 - 2,1 вольта, светодиод не загорается. На выходе ик приемника при нажатии на пульт напряжение проседает до 4,35 (значит контакты правильно определены).

Код: Выделить всё

/*
 * IR Receiver.cpp
 *
 * Created: 12/1/2017 11:10:41 AM
 * Author : Dz Inventors
 */

#define F_CPU 9600000 // Must stay at this speed

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define IR_Input_Pin PORTB1

bool IR_Code(uint32_t data); // Check the IR Code
void IR_Scan(); // Scan IR data
void IR_Setup(); // Setup mode

uint32_t IR_data_out = 0; // IR data store

int main(void) {
      IR_Setup();

      DDRB |= 1 << PORTB4;
      DDRB &= ~(1 << IR_Input_Pin);
      PORTB = 0x00;

      while (1) {
            if (IR_Code(0xFF0047B8)) {
               PORTB ^= (1 << PORTB4);
            }
      }
}
void IR_Setup() {
      GIMSK |= 1 << INT0; // Enable the interrupt pin ( at PB1)
      MCUCR = (1 << ISC00); // Set interrupt configuration in PB1 (see page 46 for any change mode)
      sei();
      TCCR0B |= 1 << CS00 | 1 << CS02; //set timer 0 with max scaler (F_CPU/1024)
}
bool IR_Code(uint32_t data) {
      // Prettified IR data output code
      uint8_t IR_data_byte[4];
      IR_data_byte[0] = (IR_data_out >> 24);
      IR_data_byte[1] = (IR_data_out >> 16);
      IR_data_byte[2] = (IR_data_out >> 8);
      IR_data_byte[3] = (IR_data_out);
      // Prettified IR data input code
      uint8_t data_byte[4];
      data_byte[0] = (data >> 24);
      data_byte[1] = (data >> 16);
      data_byte[2] = (data >> 8);
      data_byte[3] = (data);
      if (IR_data_byte[0] == data_byte[0] && IR_data_byte[1] == data_byte[1]) { // If address data is =
	      if (IR_data_byte[2] == data_byte[2] && IR_data_byte[3] == data_byte[3]) { // If command data is =
      
                  IR_data_out = 0; // Clear IR data Output
                  return true;
            }
      }
      return false;
}
ISR(INT0_vect) {
      IR_Scan();
}

uint8_t time_high = 0;
uint8_t time_low = 0;

bool interrupter1 = false;
bool interrupter2 = false;
bool one_time = false;

int conter = -1;

uint8_t TCNT0_buffer = 0;
uint8_t time_span = 0;

void IR_Scan() {
      // Timer unit = 106.666 µs
      if (TCNT0 >= TCNT0_buffer) // If timer doesn't overflow
            time_span = TCNT0 - TCNT0_buffer; // Get span time
      else //if timer overflow
            time_span = (256 - TCNT0_buffer) + TCNT0; // Get span time
      if (time_span <= 2) // Delete any noise < or = then 213 µs
            return void();

      if ((PINB & (1 << IR_Input_Pin)) == 0)
            time_high = time_span; // Get the time low
      else
            time_low = time_span; // Get the time high

      if ((time_low >= 78) && (time_low <= 91)) // Low for 9ms
            interrupter1 = true; // Enable the first interrupter

      if ((time_high >= 36 && time_high <= 49) && (interrupter1 == true)) { // High time 4.5ms
            IR_data_out = 0; // Clear data
            conter = -1; // Restart counter variable
            interrupter2 = true; // Enable the second interrupter (start condition is true)
      }
      if (conter == 32) { // Check if data send is over
            interrupter1 = interrupter2 = false; // Restart interrupters
            conter = -1; // Restart conter variable
      }

      if (interrupter2 == true) { // See if start condition is true

            if (one_time == true) { // Enter one time in two loops
                  if (conter != -1) { // Over enter in the first time
                        if (time_high > time_low * 2) // Means we read logic 1
                              IR_data_out |= 0x80000000 >> conter; // Put the logic 1 in high significant bit and shift it to the right every loop
                  }
                  // else
                  // IR_data_out=0; // Clear data
                  conter++; // Up counter
            }
            one_time = !one_time; // Reverse state
      }
      TCNT0_buffer = TCNT0; // Scan timer
}

Вложения
123.png
(4.07 КБ) 303 скачивания
Screenshot_20191017_215551.png
(102.09 КБ) 317 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Attiny13a и ИК управление

Сообщение ARV »

сколько геморрою из-за какой-то фигни... а ведь можно было в 100500 раз проще сделать... и я 100500 раз писал, как: http://arv.radioliga.com/content/view/219/43/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Attiny13a и ИК управление

Сообщение NStorm »

В данный момент никакой реакции на пульт, на выходе PB4 - 2,1 вольта, светодиод не загорается.
Не должно быть там такого. Максимум 0.8В по ДШ.
Если вообще кусок

Код: Выделить всё

      while (1) {
            if (IR_Code(0xFF0047B8)) {
//               PORTB ^= (1 << PORTB4);
            }
      }
временно вот так закомментировать, тоже 2.1В будет?
micle7
Родился
Сообщения: 6
Зарегистрирован: Вс окт 13, 2019 23:45:31

Re: Attiny13a и ИК управление

Сообщение micle7 »

В общем взял другую тиньку, создал новый проект, исключил все технические ошибки, но так и не удалось сдружить пульт с тинькой. На выходе теперь ноль, код компилится нужный, проверял блинком. Пробовал предыдущие варианты кода, и кнопку по разному вбивал (0xFF0047B8, 0x00FF47B8, 0x47B8), на пульт не реагирует.
Похоже придется сделать вывод о том, что код не рабочий :)
Где бы достать минимальный код под тиньку (нажал - загорелось, нажал - потухло) любого протокола любого распространенного пульта, знать бы только маркировку самого пульта, и от какой кнопки код. Потом этот пульт можно под андройдом клонировать и тестировать.

А вот и первые хорошие новости
Залил эту прошивку, подключил диод на PB4, рекомендуемую схему соответственно не собирал, но оно и так работает, кнопки программируются.
Самсусамыч

Re: Attiny13a и ИК управление

Сообщение Самсусамыч »

[uquote="micle7",url="/forum/viewtopic.php?p=3717890#p3717890"]Есть какая-то простейшая программа для ик управления под attiny13 для образца?[/uquote]
http://www.getchip.net/posts/076-upravl ... -attiny13/
Ответить

Вернуться в «Разные вопросы по МК»