Jump to content
artos5

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

Recommended Posts

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

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

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

Тактовая частота МК равна 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")
						 }

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


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

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by shads

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

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


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

Share this post


Link to post
Share on other sites

Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Подробнее

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

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

Share this post


Link to post
Share on other sites

Гибридные IGBT - сила Si и SiC в одном корпусе!

Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение.

Подробнее

Вот как я декодировал команды радио брелка... вдруг пригодится...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'

:)


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

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

К шожалению в CV не работаю... помочь не могу...

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

Share this post


Link to post
Share on other sites

Код очень необычный... И инициализация переменных сделана как в си шарпе (так разве можно на Си?). Я не сильный спец в Си ... но в среде 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 

?

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


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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Edited by shads

Share this post


Link to post
Share on other sites

вот это:

16UL

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

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

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

а именно:

&EEPnt

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

Edited by Syltetooy

Share this post


Link to post
Share on other sites

Спасибо за совет! Уже качаю, вот отсюда: 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 байта


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

Share this post


Link to post
Share on other sites
А когда эта последняя редакция произошла?

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

И что в 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 байта

Завтра уже объясню :)...

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Share this post


Link to post
Share on other sites
Еще вопросик: долго составляли алгоритм и писали/отлаживали код?

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

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

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

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

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

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

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

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

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

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

Edited by shads

Share this post


Link to post
Share on other sites

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

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

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

Код:

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)
{
// выполнить что то.....
}

По теме:

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


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

Share this post


Link to post
Share on other sites

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

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

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

IMG_20191120_164342.jpg

IMG_20191120_164410_1.jpg

IMG_20191120_164621.jpg


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Продолжаю проектировать БП для питания электродвигателя. После проведения ФСА (функционально-стоимостного анализа) пришел к следующему Т.З.: 1) Питание непосредственно от сети 230 В. 2) Гальваническая развязка электромотора от сети изоляция - "масло масляное". Работают миллионы кофемолок, миксеров, электромясорубок и т.п. без гальванической развязки - и ничего с пользователями не происходит. 3) Размеры минимальные, желательно, чтобы вся "лепестроника" уместилась в ручке инструмента. 4) Широкий диапазон регулировки частоты вращения. Исходя из приведенных выше соображений посчитал топологию типа "Тащибры", обратнохода и т.п. избыточной. Не нужна электромотору стабилизация питающего напряжения в принципе, а также гальваническая изоляция, тем более, учитывая достаточно большие габариты транселя для её реализации (п. 3). Вполне достаточно ШИМ-ирования или даже ЧИМ-ирования (Частотно-Импульсной Модуляции), но на достаточно высокой частоте, дабы избежать рывков ротора. В итоге пришел к концепции чоппера (гальванически неизолированного понижающего импульсного преобразователя), вообще не содержащего габаритных индуктивностей.  Варианты ШИМ-контроллера еще прорабатываются, поэтому на его месте всего лишь прямоугольник.  Вопрос же у меня возник по поводу параметров интегрирующей RC-цепочки R1C1 (в красном овале). При пуске, пока С1 разряжен, ООС действовать не будет и контроллер выдаст максимальную длительность импульса, поступающего на электромотор. Предвидится рывок ротора при старте. Вполне возможно, что за счет инерционности ротора и достаточно высокой частоте ШИМ/ЧИМ он будет неощутим.  Возможно, у читателей данной темы появятся рекомендации по способам ускорения выведения интегрирующей цепочки на режим стабилизации ООС - приму советы с благодарностью. Вот только не надо советовать применить другие топологии! До озвученной выше я пришел, проанализировав и отбросив порядка полдюжины вариантов.  А возможно, я излишне перестраховываюсь - рывков не будет. "Железо" покажет, но пока что я прорабатываю схему контроллера. Есть несколько вариантов реализации на микросхемах - выбираю оптимальный.
    • Собрал сплиттер, всё работает, кому надо - печатка во вложении, свитчи проводами соединял Splitter.lay
    • одно время на участках была хорошая доходность - я с дуру купил два  думал пару лет в два раза пушу - вот ток  обьявили что дача это совковое понятие и подняли налоги за землю - народ испугался - терь продай )) даже дешевле чую придется отдавать - сосед продал дачный домик - даже свое не вернул - три года продавал - жесть.
    • Посмотрел, КС 170А - мин. V стабилизации 6,4V. У автора: Похоже, стабилитрон не исправен. Пробовать надо заменить. Либо R9, R10 не того номинала.
    • Всем привет! Помогите с опознанием динамиков из данного на фото набора. Известно что это EDIFIER, но гугл мне не помог. Спасибо   
    • Получил фейковые LM2663 от того же продавца, что прислал раньше фейковые LM35, которые оказались транзисторами. На этот раз он пошёл дальше - прислал пустышки без кристалла вообще!   Вот его магазин  shenzhenYida Store - не ведитесь, Али его поддерживает и деньги не возвращает!

  • GSM-модуль на основе чипа SIM800L

  • Similar Content

    • By O5-14
      https://cxem.net/pitanie/5-176.php Эта конструкция. Раздобыл экран Siemens, удачно) Бесхозный трансформатор небольших размеров тоже где-то точно у меня есть, по идее.  Также досталось дохлое ЗУ, корпус которого как раз вместит в себя новую начинку.
      Как я понял, контроллер можно спокойно ставить ATmega8A-AU, вместо ATMega8L-8SU. L - версия всего лишь кушает поменьше). И в настройках программатора всего лишь выбрать мой "A" контроллер, а остальное то же самое, но... не нашел ISP режима для него( Фьюзы, как понял из написанного. При чем тут еще Lock Bit ?
      Надо будет посмотреть, все ли используемые ножки мк совпадают в DIP и SMD версиях, чтобы переразвести плату управления. Надеюсь, в эти 2 дня выкрою время на это дело.  
      Кто-нибудь повторял эту схему, каковы впечатления ? Есть некоторые вопросы по прошивкам
       
       
       




    • By Артур Измаилов
      1.Создать схему в которой два светодиоды загораются в следующей последовательности:  1 и 2, 2 и 3, 3 и 4, …, 15 и 16, 1 и 2 и т.д. (т.е. создается эффект движения двух светодиодов).
      Дано условие выше. Решение задачи нужно представить в Proteus. Код для программирования пишу в AtmelStudio 7. Схему собрал в Proteus. Вывел 16 светодиодов через 2 порта (Порт B и Порт D). МК использовал ATMEGA 8 вариации в корпусе DIP с 28 ножками (SPDIL28). 
      До этого смог написать схему, чтобы работали светодиоды в последовательности 1.2.3.4.5....16.1.2.3.4 и тд. Делал через оператор FOR. Однако с этим кодом начались проблемы. Помогите пожалуйста. 
      Нижу представил изображение кода. 
      Заранее спасибо!
       

    • By Павел Бачурин
      Всем привет. Возникла такая проблема с собакой, не пойму что не так...
      Atmel Studio 7
      Atmega8a, тактирование от внутренних 8МГц, подключаю библиотеки
       
      #define F_CPU 8000000L
      #include <avr/io.h>
      #include <avr/wdt.h>
      #include <avr/interrupt.h>
      #include <util/delay.h>
      далее 
      int main(void)
      {
          ADC_Init(0);
          TIMER0_init();
          TIMER1_init();
          wdt_enable(WDTO_8S);
      и т.д.
       
      при компиляции ошибка  'WDTO_8S' undeclared (first use in this function)
      Не хочет собака работать... при этом WDTO_8S выделено цветом, студия понимает что есть #define WDTO_8S
      И даже если игнорировать ошибку и прошить контроллер он уходит в постоянную перезагрузку.
      эксперименты показали, что до WDTO_2S все нормально компилируется, 4 и 8 секунд ОШИБКА
      Подскажите кто знает, что не так? 
       
       
    • By Evgeniy90
      Здравствуйте. Проблема такая:после прошивки USBASP ноутбук перестал его определять. Ошибка в диспетчере устройств:сбой запроса дескриптора USB устройства.
      Прошивал через Arduino UNO и avrdude. Прошивку скачать с офф сайта(последнюю на сайте https://www.fischl.de/usbasp/). Все прошло успешно. Почти))
      Подскажите что можно сделать? 
    • By Evgeniy90
      Здравствуйте! Столкнулся со следующей проблемой: при сборке МД "Шанс" дошел до этапа прошивки МК, в итоге запорол 3 атмеги. Прошивал 3 способами:
      1. Через Arduino UNO(As ISP) просто МК
      2. Через Arduino UNO(As ISP) МК внутрисхемно(соответственно с обвязкой)
      3. Через USB ASP внутрисхемно(с обвязкой соответственно).
      Вышло так, что в наличии кварца 11.0592 МГц не было, и я временно впаял 12 МГц. Прошил трижды всё правильно(фьюзы , контакты и т.д). После прошивки просто не видит МК (ну и плата не работает без МК.да и Бог с ней, но МК всеравно не могу считать). В чем причина понять не могу. Одно думаю, что это разница между 11.0592 и 12 МГц. Посоветуйте как решить проблему.
      Коды ошибок после прошивки во всех трёх случаях одинаковые:
      Sinaprog -invalid device signature
      Averdude -avrdude: warning: cannot set sck period, please check for usbasp firmware update
      target don't answer
×
×
  • Create New...