Sam nie wiem czemu pominąłem to, mimo, że na każdej stronie jest bardzo wyraźnie podkreślone, że jedynka to migania.
Poprawiłem kod, ale wciąż mam jakiś problem (tj. nie działa jakbym chciał). Czytałem kilka razy - bardzo dokładnie (a przynajmniej tak mi się wydaje) - i nie wiem co powinienem zrobić jeszcze żeby działało.
Załączam kod oraz schemat nadawcy.
Jestem pewien co do tego, że dioda świeci na LED_ON i gaśnie na LED_OFF. Całość sprawdzam poprzez skierowanie diody bezpośrednio na odbiornik w telewizorze z odległości mniejszej jak 10 cm.
W AVRStudio ustawiłem, że komenda jest wysyłana z dokładnością co do us (bez tych przerw powyżej 10ms). Sygnały są jak w pdfie przy założeniu częstotliwości 500kHz.
Miłe by było nawet zobaczenie gotowego schematu i kodu do uC z czego mógłbym wyciągnąć jakieś wnioski.
Chciałbym w końcu zrobić większy krok naprzód.
Dziękuję i pozdrawiam.
#define F_CPU 1000000ul // częstotliwość zegara w Hz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define LED_DDR DDRB
#define LED_PORT PORTB // port diody LED
#define LED_BIT 0x01
#define LED_ON (LED_PORT = LED_BIT)
#define LED_OFF (LED_PORT = 0x00)
void USART_send(uint16_t Data);
uint8_t USART_receive(void);
void init(void);
void led_flashing(uint16_t data);
void start_signal(void);
void command_signal(uint16_t data);
void blink(void);
void logic_1(void);
void logic_0(void);
void init(void)
{
LED_DDR = LED_BIT;
LED_OFF;
}
int main(void)
{
init();
uint16_t data[6] = {0x17F, 0xEF, 0x157, 0x57, 0xFF, 0xDF};
int i, j;
while(1)
{
for(i=0;i<6;++i)
{
j = 10;
led_flashing(data[i]+0x200);
_delay_ms(19); // ~19,968ms
_delay_us(200);
_delay_us(200);
_delay_us(200);
_delay_us(148);
while(j)
{
led_flashing(data[i]+0x200);
_delay_ms(177);
_delay_us(72);
--j;
}
}
_delay_ms(200);
}
return 0;
}
void led_flashing(uint16_t data)
{
// start section
start_signal();
// signal received
command_signal(data);
}
void start_signal(void)
{
blink(); // for 512us blinks in 'good' way
_delay_ms(2);
_delay_us(150);
_delay_us(150);
_delay_us(150);
_delay_us(90);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void command_signal(uint16_t data)
{
int i=10;
while(i)
{
if(data &0x200)
{ // trzeba dodac nop, bo robi mniej clocka
asm("nop");
logic_1();
}
else logic_0();
data <<= 1;
--i;
}
}
void logic_1(void)
{
blink(); // for 512us blinks in 'good' way
_delay_us(150);
_delay_us(150);
_delay_us(150);
_delay_us(52);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void logic_0(void)
{
_delay_us(150);
_delay_us(150);
_delay_us(150);
_delay_us(56);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
blink(); // for 512us blinks in 'good' way
asm("nop");
asm("nop");
asm("nop");
}
void blink(void)
{
int i=15;
while(i)
{
LED_ON;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LED_OFF;
_delay_us(20);
asm("nop");
--i;
}
LED_ON;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LED_OFF;
}