Viktor Sekanina, Marek Labudík
xsekan02
studfeec.vutbr.cz,
xlabud01
studfeec.vutbr.cz


![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Dostupné IR LED:
Pozn. jednotka mW/Sr znamená přibližně vyzářený výkon v daném úhlu.
![]() | ![]() | ![]() |
Program odesílá předem naprogramované sekvence o délce 32bitů. Právě odeslaná sekvence se zobrazí na displeji. Nejdůležitější část programu je popsána tu:
ISR( TIMER0_COMP_vect ) /*generuje nosný kmitočet 38kHz na pin OC0*/ { if (inter==0) { inter=1; /*stav IR LEDky*/ IRON; /*zapnout IR LED*/ } else { inter=0; /*stav IR LEDky*/ IROFF; /*vypnout IR LED*/ } } ISR( TIMER1_COMPA_vect ) { TCCR1B = 0b00001000; /*zastavit čítače*/ TCCR0 = 0b00001000; IROFF; /*vypnout IR LED*/ inter=0; TCNT0 = 0; /*vynulovat čítače*/ TCNT1 = 0; prerus=0; /*vyvolat reakci v hlavním programu*/ }
A v programu "vyslat":
void vyslat(uint32_t vyslane)
{
uint8_t pocetbitu;
uint32_t kopie = vyslane; /*kopie vysílané sekvence*/
uint32_t maska = 0x80000000;
uint32_t zprac;
/*start vysilani*/
OCR0 = 131; /*kmitočet nosné 38kHz*/
OCR1A = 1313; /*impulz dlouhý 8,4ms -> start*/
TCCR1B = 0b00001011; /*zapnout čítače*/
TCCR0 = 0b00001001;
prerus=1; /*nastavit příznak*/
while(prerus==1); /*cekej nastavenou dobu impulzu*/
IROFF; /*zapnutá IR LEDka ve spínacím režimu = konec LEDky*/
OCR1A = 656;//4,2ms /*mezera dlouhá 4,2ms*/
TCCR1B = 0b00001011; /*zapnout čítač pro odpočítání doby, nikoli generátor nosné*/
prerus=1;
while(prerus==1); /*cekej nastavenou dobu mezery*/
IROFF;
/*bit navíc - byl již naprogramován v přijímači - přijímač vznikl dříve než vysílač*/
/*vyšli logickou 1 */
OCR1A = 82; /*impulz cca.0,52ms*/
TCCR1B = 0b00001011;
TCCR0 = 0b00001001;
prerus=1;
while(prerus==1);
IROFF;
OCR1A = 257; /*mezera 1,65ms*/
TCCR1B = 0b00001011;
prerus=1;
while(prerus==1);
IROFF;
//-----------------
zprac = kopie & maska; /*do zprac je uložen nejvyšší bit z vysílané sekvence*/
for (pocetbitu=0;pocetbitu<=33;pocetbitu++) /*zpracování vysílané sekvence bit po bitu pomocí rotace masky*/
{
if (zprac == 0)
{ /*sekvence pro log.0*/
OCR1A = 82;
TCCR1B = 0b00001011;
TCCR0 = 0b00001001;
prerus=1;
while(prerus==1);
IROFF;
OCR1A = 82;
TCCR1B = 0b00001011;
prerus=1;
while(prerus==1);
IROFF;
}
else
{ /*sekvence pro log.1*/
OCR1A = 82;
TCCR1B = 0b00001011;
TCCR0 = 0b00001001;
prerus=1;
while(prerus==1);
IROFF;
OCR1A = 257;
TCCR1B = 0b00001011;
prerus=1;
while(prerus==1);
IROFF;
}
kopie=kopie<<1;
zprac = kopie & maska; /*rotace masky a její aplikace na vysílanou sekvenci*/
}
}
Přijímač vznikl na pokusné destičce takového vzhledu, že se její fotku autor stydí zveřejnit. Schéma přijímače:

ISR( INT1_vect ) /*přišla sestupná hrana*/ { if (detect == 0) { TCCR1B = 0b00000010; /*spousti se citac pro mereni delky impulzu (presc.=8)*/ detect = 1; /*bude se prijimat sekvence*/ } else { prijate = prijate<<1; /*rotace bitů do prijate*/ if (pocitadlo != 33) { hodnota = TCNT1; /*zjistovani delky impulzu+mezery*/ TCNT1 = 0; /*zastaveni citace*/ if (hodnota>26900 && hodnota<27050) /*odpovida zhruba 8,4ms+4,2ms -> start*/ pocitadlo++; if (hodnota>4000 && hodnota<4700) /*odpovida zhruba 2,1ms -> log.1*/ { pocitadlo++; prijate |= 0x0001; } if (hodnota>1800 && hodnota<2400) /*odpovida zhruba 1,05ms -> log.0*/ { pocitadlo++; } } } } int main( void ) { MCUCR = 0b00001000; //sestupna hrana GICR = 0b10000000; //int 1 Interrupt enable /*nastavení přerušení*/ TCNT1 = 0; DDRA = 0xFF; DDRC = 0b00100000; //ledka PORTD = 0b00001100; //pullup int 0, 1 PORTC = 0; _delay_ms(500); PORTC = 0b00100000; _delay_ms(500); PORTC = 0b00000000; _delay_ms(500); /*zůstalo z testování - bliknutí připájenou ledkou - není ve schematu!!!!*/ lcd_init(); lcd_gotoxy(0,0); lcd_puts("DISPLEJ 16x2"); sei(); /*inicializace displeje a povolení přerušení*/ while(1){ if (pocitadlo == 33) { cli(); TCCR1B = 0; pocitadlo = 0; detect = 0; /*byla přijmuta sekvence*/ prijateL = prijate & 0x0000FFFF; prijates = prijate & 0xFFFF0000; prijateH = prijates>>16; /*rozdeleni 32bit. slova, aby to slo zobrazit na dislpeji*/ lcd_gotoxy(0,1); sprintf(lcd_buffer,"%x",prijateH); lcd_puts(lcd_buffer); sprintf(lcd_buffer,"%x",prijateL); lcd_puts(lcd_buffer); /*zobrazení slova ve tvaru 0x00000000 na displeji*/ PORTC = 0b00100000; /*stejný pozůstatek z testování-není ve schematu!!!!*/ lcd_gotoxy(0,0); lcd_puts("Prijato "); sei(); } neco++; /*todle zůstalo po simulaci, ničemu to nevadí*/ } }
Schéma: schema.