Здравствуйте!
Пробую разобраться как программа генерирует алгоритм описанный здесь:
homes-smart.ru/index.php/oborudovanie/be...da-na-radiomodulyakh
Допишите, пожалуйста, комменты в эту программу.
Спасибо.
Программа в спойлере.
Но первым дело мне понятно что такое, откуда, куда и зачем 3Lв этой строке:
data |= 3L << 20;
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
#define RC_BIT 6 // пин
#define periodms 4
void sendRC(unsigned long data)
{
DDRD |= _BV(RC_BIT);
data |= 3L << 20;
unsigned short repeats = 1 << (((unsigned long)data >> 20) & 7);
data = data & 0xfffff; //truncate to 20 bit
unsigned long dataBase4 = 0; uint8_t i;
for (i=0; i<12; i++)
{
dataBase4<<=2;
dataBase4|=(data%3);
data/=3;
}
unsigned short int j;
for (j=0;j<repeats;j++)
{
data=dataBase4; uint8_t i;
for (i=0; i<12; i++)
{ switch (data & 3)
{
case 0:
PORTD |= _BV(RC_BIT);
_delay_ms(periodms);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms*3);
PORTD |= _BV(RC_BIT);
_delay_ms(periodms);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms*3);
break;
case 1:
PORTD |= _BV(RC_BIT);
_delay_ms(periodms*3);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms);
PORTD |= _BV(RC_BIT);
_delay_ms(periodms*3);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms);
break;
case 2:
PORTD |= _BV(RC_BIT);
_delay_ms(periodms);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms*3);
PORTD |= _BV(RC_BIT);
_delay_ms(periodms*3);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms);
break;
}
data>>=2;
}
PORTD |= _BV(RC_BIT);
_delay_ms(periodms);
PORTD &= ~_BV(RC_BIT);
_delay_ms(periodms*31);
}
}
while(1)
{
sendRC (531362);
}
}