Sziasztok!
Infrás játékfegyvereket szeretnék építeni.
jelenleg dugaszolós próbapanelen 2db
ATtiny85 el tesztelgetem a küldés és a fogadást.
a vivő frekvenciát(36khz) egy 555 időzítő állítja elő és egy n-csatornás feten keresztül kapcsolgatom
A programot AVR Studio 4 és AVR-GCC használatával írtam c-ben.
dolgozom egy idelye ezen a kódon de már annyira összekavarodtam hogy kell egy kis hozzáértő segítség
Tehát az alábbi kód-nak elvileg az lenne a dolga hogy
start bittel kezdve (2400us-os pulza + 600us szünet)
és a 2x8bites kód küldése (log"1" 1200us ,log"0" 600us, szünet 600us)
LSB-től kezdve külön a címet és a parancsot.
void ir_send(uint8_t address, uint8_t command) {
uint8_t mask=0x01;
uint8_t i;
// start
PORTB |= (1<<PINB3);
_delay_us(2400);
PORTB &= ~(1<<PINB3);
for(i=0;i<8;i++){
// várj
_delay_us(600);
if(mask & address) {
// 1
PORTB |= (1<<PINB3);
_delay_us(1200);
PORTB &= ~(1<<PINB3);
}
else {
// 0
PORTB |= (1<<PINB3);
_delay_us(600);
PORTB &= ~(1<<PINB3);
}
address >>= 1;
}
for(i=0;i<8;i++){
// várj
_delay_us(600);
if(mask & command) {
// 1
PORTB |= (1<<PINB3);
_delay_us(1200);
PORTB &= ~(1<<PINB3);
}
else {
// 0
PORTB |= (1<<PINB3);
_delay_us(600);
PORTB &= ~(1<<PINB3);
}
command >>= 1;
}
}
ir_send(0x01,0xFF);
A vétel felől (TSOP 4836 active LOW)
a beérkező címet és parancsot memóriába égetem az olvasás végén
#define INPUT PB4
uint8_t j;
uint8_t address;
uint8_t command;
while(1) {
while(bit_is_set(PINB, INPUT)) {
PORTD &= ~(1<<PIND6); // led ki
}
address = 0;
command = 0;
_delay_us(3100); // vár míg vége a start bitnek
//8-bit cím
for(j = 8;j >0;j--) {
_delay_us(800);
if(bit_is_set(PINB, INPUT)) {
// 0
address &= ~(1 << 7);
address >>= 1;
}
else {
// 1
address |= (1 << 7);
address >>= 1;
_delay_us(590);
}
_delay_us(350);
}
//8-bit parancs
for(j = 8;j >0;j--) {
_delay_us(800);
if(bit_is_set(PINB, INPUT)) {
// 0
command &= ~(1 << 7);
command >>= 1;
}
else {
// 1
command |= (1 << 7);
command >>= 1;
_delay_us(590);
}
_delay_us(350);
}
eeprom_write_byte((uint8_t*)0,address);
eeprom_write_byte((uint8_t*)1,command);
PORTD |= (1<<PIND6); // led be
_delay_ms(1500);
}
visszaolvasva az eepromból teljesen más értékeket kapok
van egy sejtésem hogy a küldés felöl lesz a gond de már kezdem feladni ezért fordultam hozzátok
üdv fillx