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

Алгоритм Декодирования На Базе Rr10 & Mega8


artos5

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

Добрый вечер уважаемые форумчане! Подскажите пожалуйста как отсеять шумы на выходе приемника ?

Задача: сделать универсальный декодер команд ду на базе радио.

На ИК лучах система пашет отлично, а вот на радио - не программируется , так как шумы влияют на систему.

Тактовая частота МК равна 4мГц

Код сейчас такой:

// сам захват поступающих импульсов

void decode_ir_data()
{
tim_system_rc=0x06;

if(start) // если установлен старт бит - начинаем измерять импульсы
{

if(a<=111)data_ir[a] = timer_ir;
if(a<112)a++;
 timer_ir=0;	 // обнуляем счетчик

if(a>110)
{
 a=112;			 // сбрасываем счетчик данных массива
 tim_stop=1;
 z=0;
}
}

if(start==0) // старт бит установлен? нет!
{
 if(IR && timer_ir>100) start=0x01; // да!
 else timer_stop();
}

if(a==112) { start=0;}
}

void timer_stop()
{
tim_system_rc=0;
if(start) { tim_stop=1;}
start=0;
a=0;
 timer_ir=0;
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
LED=1;
if(flags_prog && WR_EN)
{
 timer_stop();
}
else
{
decode_ir_data();
}
}

// обучение командам ДУ

case 0:
		 if (cmd_rc==0) // команда не поступила
			 {
				 if(tim_stop==1)
				 {
				 #asm("cli")

				 if(flags_prog && WR_EN==0)
				 {
				 for(d=0; d<111; d++) // delete data
						 {
						 com1[d]=0;
						 }

				 for(d=0; d<111; d++)
						 {
						 com1[d]= data_ir[d];
						 }
				 }

				 for(d=0;d<111;d++) // алгоритм определения поступившей команды
				 {
					 if (com1[d]>0 && com1[d]<0xFF )
					 {
						 cmd_rc=1;
						 d=111; // выходим из цикла
						 timer_led_shou=0;
					 }
					 else
					 {
						 cmd_rc=0;
					 }
				 }

				 }

			 }
			 else			 // команда поступила
			 {			
				 if(++timer_led_shou > 20) {timer_led_shou=0; cmd_rc=0; } // выходим в захват команды
			 timer_led=20;	
				 flags_interrupt=1;
			 }

			 if(++timer_led_ch>15) timer_led_ch=21;
			 else CMD1=1;
			 if(timer_led_ch>10 && timer_led_ch<15)CMD1=0;
 break;

// распознавание "своей" команды.

 if (tim_stop==1)
						 {
							 #asm("cli")
							cmd.cmd_0=1;

							cmd.cmd_1=cmd.cmd_2=cmd.cmd_3=1;

							cmd.flags_0=cmd.flags_1=cmd.flags_2=cmd.flags_3=0;

							for(d=0; d<111; d++)
							 {
								 com_buff[d] = com1[d];

								 if (com_buff[d]<4)cmd.flags_0=1;

								 if(cmd.flags_0==0)
								 {
								 if (((com_buff[d]+3) < data_ir[d]) || ((com_buff[d]-3) > data_ir[d])) // команда 1
									 cmd.cmd_0=0;
								 }				

								com_buff[d] = com2[d];

								 if (com_buff[d]<4)cmd.flags_1=1;

								 if(cmd.flags_1==0)
								 {																		
									if (((com_buff[d]+3) < data_ir[d]) || ((com_buff[d]-3) > data_ir[d])) // команда 2
									cmd.cmd_1=0;
								 }

								com_buff[d] = com3[d];

								if (com_buff[d]<4)cmd.flags_2=1;

								 if(cmd.flags_2==0)
								 {								

								 if (((com_buff[d]+3) < data_ir[d]) || ((com_buff[d]-3) > data_ir[d])) // команда 3
									cmd.cmd_2=0;
								 }

								com_buff[d] = com4[d];

								if (com_buff[d]<4)cmd.flags_3=1;

								 if(cmd.flags_3==0)
								 {									
								 if (((com_buff[d]+3) < data_ir[d]) || ((com_buff[d]-3) > data_ir[d])) // команда 4
									cmd.cmd_3=0;
								 }


							 data_ir[d]=0; // стираем буфер
							 }

							 tim_stop=0;
							if(flags_prog) delay_ms(100);
							 #asm("sei")
						 }

Буду всем крайне признателен за любую помощь в этом направлении! ;)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Вот как я декодировал команды радио брелка... вдруг пригодится...

http://asis-kbr.ru/f....php?f=11&t=122

А вот декодирование IR NEC протокола... думаю по радио тоже должен заработать...

http://asis-kbr.ru/f....php?f=13&t=151

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

Я разработал универсальный декодер ИК ДУ. С пультами прекрасно работает! Работает с любым пультом , который имеет статический код.

А вот из радио имеются определенные трудности... все из за шума на выходе приемника.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

У многих пультов практически одинаковые временные интервалы импульсов. Перед вызовом функции приема проверяйте длительность пришедшего импульса, если он входит в рамки "нормального" импульса по длительности, тогда вызываете функцию приема. Во время приема посылки из эфира, шума на выходе приемника нет. Вам необходимо только понять что приемник начал принимать код. Чаще всего в китайских пультах используеться кейлок и по преамбуле легко отследить начало приема кода.

http://steelrats.org/articles.php?article_id=194

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Вот как я декодировал команды радио брелка... вдруг пригодится...http://asis-kbr.ru/f....php?f=11&t=122А вот декодирование IR NEC протокола... думаю по радио тоже должен заработать...http://asis-kbr.ru/f....php?f=13&t=151
Пытаюсь Ваш код перенести в CVAVR - нихр*на не получается.. Да и я половину "матюков" в коде не догоню....вот к примеру в этом месте:
unsigned char EEData[EEDataLen] EEMEM; //массив данных в EEPROMunsigned char EEPnt EEMEM; //указатель на байт массива в EEPROM (0-59)

потом тут:

 eeprom_write_byte (&EEPnt,(EEPntTmp +3)); eeprom_write_byte (&EEData[EEPntTmp +0], (unsigned char) (ReceiveData >> 0)); eeprom_write_byte (&EEData[EEPntTmp +1], (unsigned char) (ReceiveData >> 8)); eeprom_write_byte (&EEData[EEPntTmp +2], (unsigned char) (ReceiveData >> 16UL));

и т.д. .... как адаптировать для этой среды?

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 07.08.2014
Author : Artos
Company :
Comments:

Chip type : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
#include
#include
//дефайны
#define BtnPort PINB /*порт подключения кнопки*/
#define BtnPin (1<<1) /*пин подключения кнопки*/
#define ReceivePort PINB /*порт подключения выхода приемника 433*/
#define ReceivePin (1<<3) /*пин подключения выхода приемника 433*/
#define LedPort PORTB /*порт подключения светодиода*/
#define LedPin (1<<2) /*пин подключения светодиода*/
#define RelayPort PORTB /*порт подключения реле*/
#define RelayPin (1<<4) /*пин подключения реле*/
//прототипы функций
void Receive (void); //ф-ция обработки данных радиоканала в прерывании с частотой 20000Гц
void Int100Hz (void); //обработка медленных функций с частотой 100Гц
//глобальные переменные
unsigned long ReceiveData; //4 байта для чтения кода с радиоканала
unsigned char RelayOnCoun=0; //счетчик времени включения реле
unsigned char LedCoun; //счетчик для мигания светика с частотой 1Гц
#define EEDataLen 60 /*длина буфера данных в EEPROM*/
unsigned char EEData[EEDataLen]; // EEMEM; //массив данных в EEPROM
unsigned char EEPnt ; //EMEM; //указатель на байт массива в EEPROM (0-59)
eeprom unsigned char ee_data[60];

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xC3;
Receive (); //функция обработки данных линии радиоканала
static unsigned char Div100=0; //счетчик, для деления частоты прохода с 20000 Гц до 100 Гц
if (++ Div100 >= 200)
{
Div100 =0;
Int100Hz (); //функции с частотой вызова 100Гц
}
}
//-----------------------------------------------------------------------------------------------------------------------
//часть функций с частотой вызова 100Гц
void Int100Hz (void)
{

if (BtnPort & BtnPin)
{ //если кнопка отпущена - мигать в режиме StBy
if (++ LedCoun >= 100)
LedCoun=0;
if (LedCoun >= 50)
LedPort &= (~LedPin);
else
LedPort |= LedPin;
}
else //если кнопка нажата - погасить (ожидаем сигнала с брелка, для занесения в память)
LedPort &= (~LedPin);

if (RelayOnCoun) //обработка включения реле
{
RelayOnCoun --;
RelayPort |= RelayPin; //включить реле
}
else
RelayPort &= ~RelayPin; //выключить реле
}
void eeprom_write_byte(unsigned char adress,unsigned char byte)
{
ee_data[adress]=byte;
}
//-----------------------------------------------------------------------------------------------------------------------
//ф-ция приема данных радиоканала
void Receive (void)
{
static unsigned char
Step=0, //переменная шагов алгоритма
BitHiPartCoun=0, //счетчик времени приема высокой части полу бита
BitLoPartCoun=0, //счетчик времени приема низкой части полу бита
BitCounter=0; //счетчик принятых бит
unsigned char EEPntTmp =0;
//Step==0 инициализация приема серии
if (Step==0)
BitCounter=0;
//Step==1 начало основного цикла приема бита
if (Step<2)
{
BitHiPartCoun=0;
BitLoPartCoun=0;
}
//Step==2 обработка высокого уровня полубита
if (Step<3)
{
if (ReceivePort & ReceivePin)
{
Step=2;
if (BitHiPartCoun < 50) //Подсчитываем длительность высокого уровня сигнала в линии
BitHiPartCoun ++;
return;
}
}
//Step==3 обработка низкого уровня полубита
if (ReceivePort & ReceivePin)
{
unsigned char temp=0;
//завершено чтение бита, анализ временных параметров
Step=0;
temp = (BitLoPartCoun + BitHiPartCoun);
if ((temp < 8)||(temp >= 15))
return; //временные параметры бита не соответствуют, инициализация
Step=1;
ReceiveData <<= 1UL; //сдвиг буфера и запись в младший разряд принятого бита
if (BitLoPartCoun < BitHiPartCoun)
ReceiveData |=1;
if (BitCounter < 24) //считаем скока бит приняли
BitCounter ++;
return;
}
else
{
Step =3;
if (++ BitLoPartCoun < 50) //если длительность низкого уровня сигнала в линии больше 50мс - значит серия принята
return;
Step=0;
if (BitCounter<24) //Если принято менее 24 бит - ошибка, начать прием заново
return;
ReceiveData &= 0x00ffffff; //очистить лишние старшие 8 бит
//идентификация принятых данных
EEPntTmp = eeprom_read_byte(&EEPnt);
if (!(BtnPort & BtnPin))
{ //кнопка нажата - запомнить принятый код
if (EEPntTmp >= EEDataLen)
return; //память заполнена, выход
eeprom_write_byte (&EEPnt,(EEPntTmp +3));
eeprom_write_byte (&EEData[EEPntTmp +0], (unsigned char) (ReceiveData >> 0));
eeprom_write_byte (&EEData[EEPntTmp +1], (unsigned char) (ReceiveData >> 8));
eeprom_write_byte (&EEData[EEPntTmp +2], (unsigned char) (ReceiveData >> 16UL));
LedPort |= LedPin; //индикация выполненного программирования (включ LED на 2 сек)
_delay_ms(2000);
return;
}
else
{ //кнопка не нажата - проверить на соответствие кодам в памяти
while (EEPntTmp >= 3) //есть ли данные для сравнения
{
EEPntTmp -= 3;
if ((eeprom_read_byte (&EEData[EEPntTmp +0]) == (unsigned char) (ReceiveData >>0))
&&(eeprom_read_byte (&EEData[EEPntTmp +1]) == (unsigned char) (ReceiveData >> 8))
&&(eeprom_read_byte (&EEData[EEPntTmp +2]) == (unsigned char) (ReceiveData >> 16UL)))
{
RelayOnCoun=50; //включить реле на 500мс.
return;
}
}
}
}
}
//#######################################################################################################################
//#######################################################################################################################
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1200,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x02;
TCNT0=0xC3;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
delay_ms(200);
if (!(BtnPort & BtnPin)) //если кнопка нажата при старте - стереть EEPROM
{
for (unsigned char i=0; i eeprom_write_byte(&EEData [i], 0);
eeprom_write_byte(&EEPnt, 0); //сброс указателя

for (unsigned char i=0; i<30; i++)
{ //индикация стирания (частое мигание в течение 3 сек)
LedPort |= LedPin; //мигаем с периодом 100мс
_delay_ms(50);
LedPort &= ~LedPin;
_delay_ms(50);
}
}
// Global enable interrupts
#asm("sei") //разрешаем глобально прерывания
while(1) //бесконечный цикл
{
}
}

Вот такой мешок ошибок вываливается:

Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(46): ';' expected
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(164): undefined symbol 'eeprom_read_byte'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(169): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(170): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(171): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(172): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(182): undefined symbol 'eeprom_read_byte'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(256): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'
Error: D:\ìîè äîêóìåíòû\Ïðîåêòû\Ìîè ðàçðàáîòêè óíèâåðñàëüíûé äåêîäåð ðàäèî áðåëêîâ\decoder radio tiny13\t13.c(257): function argument #1 of type 'unsigned char *' is incompatible with required parameter of type 'unsigned char'

:)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Код очень необычный... И инициализация переменных сделана как в си шарпе (так разве можно на Си?). Я не сильный спец в Си ... но в среде CVAVR & Coocox выдаёт ошибку если переменную объявлять не в самом начале функции... И в кейле по моему тоже так.

Это я писал в AVRSTUDIO4.18

вот это:

16UL

тоже что за хрень? :)

и это: EEPntTmp = eeprom_read_byte(&EEPnt);

а именно:

&EEPnt

это:

ReceiveData &= 0x00ffffff;			 //очистить лишние старшие 8 бит
 //идентификация принятых данных
 EEPntTmp = eeprom_read_byte(&EEPnt);
 if (!(BtnPort & BtnPin))			
 {									 //кнопка нажата - запомнить принятый код
	 if (EEPntTmp >= EEDataLen)
		 return;						 //память заполнена, выход
	 eeprom_write_byte (&EEPnt,(EEPntTmp +3));
	 eeprom_write_byte (&EEData[EEPntTmp +0], (unsigned char) (ReceiveData >> 0));
	 eeprom_write_byte (&EEData[EEPntTmp +1], (unsigned char) (ReceiveData >> 8));
eeprom_write_byte (&EEData[EEPntTmp +2], (unsigned char) (ReceiveData >> 16UL));
LedPort |= LedPin;	 //индикация выполненного программирования (включ LED на 2 сек)
delay_ms(2000);
return;
}
else
{		 //кнопка не нажата - проверить на соответствие кодам в памяти
while (EEPntTmp >= 3) //есть ли данные для сравнения
{
EEPntTmp -= 3;
if ((eeprom_read_byte (&EEData[EEPntTmp +0]) == (unsigned char) (ReceiveData >>0))
&&(eeprom_read_byte (&EEData[EEPntTmp +1]) == (unsigned char) (ReceiveData >> 8))
&&(eeprom_read_byte (&EEData[EEPntTmp +2]) == (unsigned char) (ReceiveData >> 16UL)))
{
 RelayOnCoun=50; //включить реле на 500мс.
 return;
}
}
}

я так понимаю могу записать как то так:


eeprom unsigned long int[2];
...........
...........


ReceiveData &= 0x00ffffff;			 //очистить лишние старшие 8 бит

 if (!(BtnPort & BtnPin))			
 {									 //кнопка нажата - запомнить принятый код
eeprom1[0] = ReceiveData;

LedPort |= LedPin;	 //индикация выполненного программирования (включ LED на 2 сек)
delay_ms(2000);
return;
}
else
{		 //кнопка не нажата - проверить на соответствие кодам в памяти

if (eeprom1[0] == ReceiveData)
 RelayOnCoun=50; //включить реле на 500мс.
 return;
}
}
}

Верно?

Что то я в край запутался ... как производится запись? как переменная

ReceiveData 

заносит данные сразу в 60 байт массива еепром?

где происходит инкремент

EEPntTmp 

?

Выходит что код сильно привязан к среде разработки, и портирование выльется обильным геморроем! Что то меня АтмелЬ с каждым днем убивает своими приколами :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Код очень необычный... И инициализация переменных сделана как в си шарпе (так разве можно на Си?). Я не сильный спец в Си ... но в среде CVAVR & Coocox выдаёт ошибку если переменную объявлять не в самом начале функции... И в кейле по моему тоже так.

Не знаю как в других, а в AVRSTUDIO - нормально... помоему это одно из изменений в последних редакциях стандарта Си...
вот это:
16UL

тоже что за хрень? :)

На счет этого чуть позже ссылочку тебе кину...

И вообще, советую поставить также AVRST4.19, (не помешает точно) потом совсем переберешся с CVAVR на AVRST... т.к. как раз CVAVR работает не по стандартам Си...

Поставь студию, тогда подробнее объясню что есть что... Только не ставь 6-ю, она очень тяжелая...

Стави или 4.18 с сервис паком, или 4.19 (ее правда я еще не пробовал ставить)

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

вот это:

16UL

тоже что за хрень? :)

Если не углубляться, то это Unsigned Long (стандарт языка чуть ли не с самого рождения)

и это: EEPntTmp = eeprom_read_byte(&EEPnt);

а именно:

&EEPnt

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

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

Спасибо за совет! Уже качаю, вот отсюда: http://rutracker.org/forum/viewtopic.php?t=3770550

это если кто тоже захочет скачать. Только не посчитайте пожалуйста за рекламу.

А когда эта последняя редакция произошла?

И что в CVAVR есть не по стандарту? Вроде всё гуд :)

Я не знаю , есть ли смысл перепрыгивать на студию... я просто начал переползать на STM32 по тихоньку. АВР-ки использую для простых задач .

И еще вот на эту ухйню ругается:

[size=4]unsigned char EEData[EEDataLen] EEMEM;[/size][size=4] [/size][size=4]//массив данных в EEPROM[/size]

зачем эта шняга добавлена ? :)

EEMEM

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

я это знаю...

мне не понятно как происходит запись данных в 60 байт ..... если по коду видно что пишется только 3 байта

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

А когда эта последняя редакция произошла?

Стандарт же эволюционирует... не стоит на месте...

И что в CVAVR есть не по стандарту? Вроде всё гуд :)

Например while (PINB.0) или что-то в этом роде...

Я не знаю , есть ли смысл перепрыгивать на студию...

Есть... не пожалееш...

я просто начал переползать на STM32 по тихоньку. АВР-ки использую для простых задач .

Ух ты... я тоже вот разбираюсь с KEIL, хочу наконец освоить STM32F100C8... год уже валяются 10шт, все никак не возьмусь...

И еще вот на эту ухйню ругается:
[size=4]unsigned char EEData[EEDataLen] EEMEM;[/size][size=4] [/size][size=4]//массив данных в EEPROM[/size]

зачем эта шняга добавлена ? :)

EEMEM

http://avr-libc.narod.ru/group__avr__eeprom.html

http://radioparty.ru/index.php/2010-12-03-15-00-02/322-lesson-eeprom

http://samou4ka.net/page/chtenie-i-zapis-eeprom-v-winavr

мне не понятно как происходит запись данных в 60 байт ..... если по коду видно что пишется только 3 байта

Завтра уже объясню :)...
Ссылка на комментарий
Поделиться на другие сайты

Спасибо за уделенное внимание! Было бы неплохо если бы вы завтра разъяснили ламеру по поводу работы кода :)

Еще вопросик: долго составляли алгоритм и писали/отлаживали код?

Я под ИК ДУ писал и тестировал пару недель (первая версия) работало около 5 протоколов ДУ. Потом спустя год потратил еще неделю , допилил код, и получил на выходе еще лучший декодер.

Но он совсем не работоспособный в условиях помех... так как идея заключается: захватить весь пакет > записать в буфер - если надо обучить пульт. И захватить весь пакет > сравнить и выполнить действия.

А в радио надо что то по типу "реал тайма" сравнивать в потоке каждый пришедший бит. Это я уже сегодня понял когда про сидел день за исходником, отладочной платой и программатором :)

Но я его добью до конца! Будет у меня отличный декодер!

Еще назрел вопрос:

Пульты же не все подойдут к вашей разработке? Ведь у пультов может быть абсолютно разная длительность импульсов. Верно?

Какие вообще длительности импульсов у вашего пульта?

В моего удалось замерить паузу между сериями , и она лежит в пределах 16-18мс. А сами импульсы в 16-25 раз меньше по длительности. Микросхема в пульте стоит РТ2260

Например while (PINB.0) или что-то в этом роде...

Ну PINB.0 - по умолчанию такого в авр не существует :) сделали они для удобства.

А разве нельзя поместить в условие цикла ножку порта? (не уверен в этом, не пробовал) Но даже если нельзя - то можно поместить значение ножки в переменную , и ее потом запихнуть в условие ;)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Еще вопросик: долго составляли алгоритм и писали/отлаживали код?

Не... у меня как то быстро все получалось... главное в голове хорошо представлять весь процесс... тогда в редакторе текст припеваючи ложиться :).....

Кстати... именно этот декодер - это мое первое творение на Си... раньше писал на асме...

http://radiokot.ru/f...376433#p1376433

Пульты же не все подойдут к вашей разработке? Ведь у пультов может быть абсолютно разная длительность импульсов. Верно?

Какие вообще длительности импульсов у вашего пульта?

Ща не вспомню... завтра пороюсь в бумажках...

А вообще то можно под любой пульт подогнать программу... я даже с кейлоком пульты программировал... там половина кода статическая, вот с ней и работаем...

А разве нельзя поместить в условие цикла ножку порта? (не уверен в этом, не пробовал) Но даже если нельзя - то можно поместить значение ножки в переменную , и ее потом запихнуть в условие ;)
В студии это делается так while (PINB & (1<<0))

А вот кстати нашел... где меня насчет UL поучали :)...

http://radiokot.ru/forum/viewtopic.php?p=1363216#p1363216

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

Цитата из форума по вашей ссылке:

Подскажите плз кто как с битовыми флагами работает?

Я пока вот как то так сообразил (я так в ассемблере делаю).

Код:

unsigned char Flags1=0; //регистр флагов

#define b1BtnLock (1<<0) /*бит защелки опроса кнопки*/

#define b1BtnShrt (1<<1) /*бит короткого нажатия кнопки*/

#define b1BtnLong (1<<2) /*бит длинного нажатия кнопки*/

if (Flags1 & b1BtnLock) //проверка бита защелки

Flags1 |= b1BtnLock; //установка бита защелки

Flags1 &= (~b1BtnLock) //сброс бита защелки

В принципе устраивает. Если флагов больше чем 8, то следующий регистр будет называться Flags2, и все биты в нем начинаются с b2...... Так что не запутаешся какой бит в каком регистре хранится. Если работаеш с битом в первом регистре, то Flags1 / b1....., если со вторым то Flags2 / b2..... и т.д.

А на С как правильно с битовыми полями работать? Возможно ли не привязываться к отдельным байтам, а работать чисто с именами битов?

лучше так дополнить:

Код:
unsigned char Flags1=0;			 //регистр флагов
#define b1BtnLock (1<<0)		 /*бит защелки опроса кнопки*/
#define b1BtnShrt (1<<1)		 /*бит короткого нажатия кнопки*/
#define b1BtnLong (1<<2)		 /*бит длинного нажатия кнопки*/

#define bit1_read (Flags1 & b1BtnLock)		 //проверка бита защелки
#define bit1_set {Flags1 |= b1BtnLock; } //установка бита защелки
#define bit1_clr {Flags1 &=(~b1BtnLock);}//установка бита защелки

bit1_set; // set bit
bit1_clr; // clear bit

if(bit1_read==1)
{
// выполнить что то.....
}

По теме:

забил я пока что на радиопульт... нету к сожалению больше времени. Поставил ИК ДУ.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

  • 5 лет спустя...

Понадобилось недавно управление по радиоканалу .

Запилил код под стм32ф030 за пару вечеров , работает ! :)

К сожалению видео не прикрепляется ..

IMG_20191120_164342.jpg

IMG_20191120_164410_1.jpg

IMG_20191120_164621.jpg

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

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

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

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

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

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

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

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

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