Problem with comparison.
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_30000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF8FE986BF84E089BF24 |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_32000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF85E986BF84E089BF2E |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_34000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF8CE886BF84E089BF28 |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_36000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF84E886BF84E089BF30 |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_38000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF8DE786BF84E089BF28 |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_40000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF87E786BF84E089BF2E |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/BIN/Tykadlo_56000.hex |
---|
0,0 → 1,20 |
:1000000009C016C015C014C013C012C012C010C061 |
:100010000FC00EC011241FBECFE9CDBF10E0A0E677 |
:10002000B0E001C01D92A436B107E1F76FD07CC0EB |
:10003000E7CF1F920F920FB60F9211242F933F9389 |
:100040004F935F938F939F93809163008F5F809313 |
:100050006300833108F44FC01092630086B350915F |
:10006000620090E08071907024E0959587952A95C4 |
:10007000E1F7252F30E02170307040916100821748 |
:10008000930711F44F5F01C0415040936100552325 |
:1000900069F48091610090916000823011F49F5F5B |
:1000A00001C09150909360001092610080916000B7 |
:1000B00089321CF088E28093600080916000883D66 |
:1000C0001CF488ED80936000809160008F310CF00B |
:1000D000C39A87FDC398852F8F5F8093620082301B |
:1000E00010F01092620080916200882311F482E186 |
:1000F00001C082E28FBD9F918F915F914F913F919F |
:100100002F910F900FBE0F901F90189581B781BF50 |
:1001100082E18FBD81E083BF84E586BF84E089BF33 |
:0C0120007894B99ABB9AFFCFF894FFCFF7 |
:00000001FF |
/Modules/Sensors/IRFEE01A/SW/Makefile |
---|
0,0 → 1,80 |
############################################################################### |
# Makefile for the project Tykadlo |
############################################################################### |
# (c)miho www.mlab.cz |
# 1.00 - new makefile |
# 1.01 - solved problem with default rules (invalid target "Makefile") |
## User Settings |
# Frequencies are in Hz, Callibration is usualy not needed |
FREQUENCIES = 30000 32000 34000 36000 38000 40000 56000 |
CALIBRATION = 0 |
## Project |
# Main source file name, target platform, destination directory |
PROJECT = Tykadlo |
MCU = attiny13 |
TARGETDIR = BIN |
## Variants - all supported frequences |
# Combine project name with all required frequencies |
VARIANTS = $(foreach FREQ, $(FREQUENCIES), $(PROJECT)_$(FREQ)) |
## General Flags |
CC = avr-gcc |
## Options common to compile, link and assembly rules |
COMMON = -mmcu=$(MCU) |
## Compile options common for all C compilation units. |
CFLAGS = $(COMMON) |
CFLAGS += -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums |
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d |
## Linker flags |
LDFLAGS = $(COMMON) |
LDFLAGS += -Wl |
## Intel Hex file production flags |
HEX_FLASH_FLAGS = -R .fuse -R .lock -R .signature |
## Build |
# Tag targets that are not / do not require files |
.PHONY: all allhex alllss clean Makefile |
# Main target |
all: allhex |
# Subtarget - all variants hex files |
allhex: $(foreach VAR, $(VARIANTS), $(VAR).hex) |
# Subtarget - all variants lss files |
alllss: $(foreach VAR, $(VARIANTS), $(VAR).lss) |
# How to translate .o file - from .c with all possible frequencies |
%.o: $(PROJECT).c |
$(CC) $(INCLUDES) $(CFLAGS) -c $< -D CALIBRATION=$(CALIBRATION) -D IR_FREQUENCY=$(subst $(PROJECT)_,,$(@:.o=))UL -o $@ |
# How to link .elf - from .o |
%.elf: %.o |
$(CC) $(LDFLAGS) $< $(LIBDIRS) $(LIBS) -o $@ |
rm $< |
# How to generate .hex file - from .elf |
%.hex: %.elf |
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $(TARGETDIR)/$@ |
# How to generate .lss file - from .elf |
%.lss: %.elf |
avr-objdump -h -S $< > $(TARGETDIR)/$@ |
## Clean target |
clean: |
-rm -rf $(PROJECT)*.o $(PROJECT)*.elf dep/* $(TARGETDIR)/$(PROJECT)*.hex $(TARGETDIR)/$(PROJECT)*.lss |
-rmdir dep |
-rmdir $(TARGETDIR) |
## Other dependencies |
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*) |
-include $(shell mkdir $(TARGETDIR) 2>/dev/null) |
/Modules/Sensors/IRFEE01A/SW/Tykadlo.c |
---|
0,0 → 1,186 |
// Infracervene tykadlo IRFEE01A |
// ----------------------------- |
// |
// (c)miho@mlab.cz |
// |
// 1.00 - zakladni funkcni verze |
// 1.01 - doplnena moznost s externim nastavenim parametru |
// 1.02 - oprava spravneho poctu generovanych impulsu |
// Prirazeni portu |
// --------------- |
// |
// Procesor: |
// |
// ATtiny13 @ 9.6MHz (interni RC oscilator, vypnuty preddelic 1:8) |
// (brown-out reset 2.7V) |
// HIGH 0xFB |
// LOW 0x7A |
// |
// Porty: |
// |
// PB1 - Ir LED Anoda proti zemi (svetlo=H) |
// PB3 - Vstup od prijimace Ir signalu (tma=H) |
// PB4 - Indikacni LED a vystup (odraz=H) |
// |
// Princip funkce: |
// |
// Pomoci casovace v rezimu CTC se na vystupu PB1 generuje signal |
// o prislusnem kmitoctu (napr 34kHz). Stridavy signal se zapina |
// a vypina (vysilaji se jednotky a nuly) a na prijimacim portu |
// se testuje, zda pri vysilani signalu je signal prijat a zda bez |
// vysilani signalu signal prijat neni. Pokud je splnena tato podminka, |
// zvysi se citac prubezne hodnoty, jinak se naopak tento citac snizi. |
// Trvani jednoho symbolu je dano konstantnou SYMBOL_LENGTH. |
// |
// Je-li dosazeno maximalni/minimalni hodnoty prubezneho citace, |
// hodnota se dale nezvysuje/nesnizuje. Pri prekroceni (velke kladne) |
// hodnoty pro zapnuti se aktivuje vystup, pri poklesu hodnoty pod |
// spodni (mensi kladnou) mez se vystup deaktivuje. Meze jsou definovany |
// konstantami SUMA_xxx. |
// |
// Cilem tohoto opatreni je docilit odolnosti proti ruseni a zavedeni |
// hystereze tak, aby vystupni signal byl stabilni a spolehlivy. |
// |
#ifndef F_CPU |
#define F_CPU 9600000UL // 9.6MHz je maximální interní frekvence pro ATtiny |
#endif |
#ifndef IR_FREQUENCY |
#define IR_FREQUENCY 36000UL // Frekvece IR signalu |
#endif |
#ifndef CALIBRATION |
#define CALIBRATION 0 // Zpresneni kalibrace na 9.6MHz 0=nekompenzovat |
#endif |
#include <avr/io.h> |
#include <util/delay.h> |
#include <avr/interrupt.h> |
#define SYMBOL_LENGTH 10 // Pocet period jednoho symbolu |
#define SUMA_MAX 40 // Maximalni (a minimalni) pocet |
#define SUMA_ON 30 // Pocet pro zapnuti |
#define SUMA_OFF 0 // Pocet pro vypnuti |
// Zpracovani preruseni od dosazeni horni hranice citace |
// ----------------------------------------------------- |
// Citac cita (automaticky a opakovane) od 0 do hodnoty v registru OCR0A |
// Pri dosazeni horni meze se neguje vystupni signal na kanalu B |
// Ma-li se vysilat tma, signal na kanalu B se neotaci ale nuluje |
ISR(TIM0_COMPA_vect) |
{ |
static unsigned char SymbolLen; // Citac pulperiod symbolu |
static unsigned char SymbolState; // Stridame 0 a 1 symboly |
static signed char InData; // Zde se strada pocet shod od dvojice symbolu |
static signed char InSuma; // Zde se prumeruji shody |
// Citac pulperiod symbolu |
if(++SymbolLen>=(SYMBOL_LENGTH*2-1)) |
{ |
// Konec symbolu - zaciname citat pocet pulperiod od zacatku |
SymbolLen=0; |
// Cteme stav vstupu a porovnavame s ocekavanou hodnotou |
// (1 na portu znamena tmu) |
if(((PINB & 0x10)>>4) ^ (SymbolState&1) ^ 1) |
InData++; |
else |
InData--; |
// Symboly 0 1 vyhodnocujeme po dvojicich |
if(!SymbolState) |
{ |
// Add Result |
if (InData==2) |
{ |
InSuma++; // Byla shoda u obou symbolu, zapocteme |
} |
else |
{ |
InSuma--; // Nebyla shoda u obou symbolu, odpocteme |
} |
// Jdeme na dalsi dvojici symbolu |
InData=0; |
} |
// Osetrime prubezny soucet tak, aby nepretekl |
if(InSuma>SUMA_MAX) |
{ |
InSuma=SUMA_MAX; |
} |
if(InSuma<-SUMA_MAX) |
{ |
InSuma=-SUMA_MAX; |
} |
// Vyhodnoceni prubezneho souctu |
if(InSuma>SUMA_ON) |
{ |
PORTB |= 0x08; // Zapni vystup (je signal) |
} |
if(InSuma<SUMA_OFF) |
{ |
PORTB &= ~0x08; // Vypni vystup (neni signal) |
} |
// Dalsi symbol |
// Stridame 0 a 1 (tma a svetlo) |
if(++SymbolState>=2) |
{ |
SymbolState=0; |
} |
// Generujeme svetlo a tmu (nastavenim casovace) |
if(SymbolState==0) |
{ |
TCCR0A = 0x12; // Blikej (svetlo) |
} |
else |
{ |
TCCR0A = 0x22; // Tma (vystup casovace se jen nuluje) |
} |
} |
} |
// Hlavni program |
int main() |
{ |
// Nastaveni prostredi behu |
// ------------------------ |
// Kompenzace vnitrniho RC oscilatoru |
OSCCAL += CALIBRATION; |
// Nastav rezim casovace |
// CTC Mod |
// Toogle B |
// CLK x 1 |
TCCR0A = 0x12; |
TCCR0B = 0x01; |
// Set frequency |
OCR0A = (F_CPU / IR_FREQUENCY) / 2 - 1; |
//OCR0B = 0; |
// Nastav preruseni |
TIMSK0 = 4; // Preruseni od kompare na A (citac proti registru OCR0A) |
//TIFR0 = 0; // Priznak preruseni se nuluje automaticky (HW) |
sei(); // Povol globalni preruseni |
// Nastaveni vyvodu PB1 PB3 jako vystup |
DDRB |=0x02; // PB1 vystup pro IR Led |
DDRB |=0x08; // PB3 vystup pro indikacni Led |
// Hlavni program |
// -------------- |
// Nedela nic, vsechno se dela v obsluze preruseni |
// od casovace. |
for(;;); |
} |
/Modules/Sensors/IRFEE01A/SW/ATmega8/TykadloATmega8.c |
---|
0,0 → 1,187 |
// Infracervene tykadlo IRFEE01A |
// ----------------------------- |
// |
// Firmware portovaný pro ATmega8 |
// |
// (c)miho@mlab.cz |
// |
// 1.00 - zakladni funkcni verze |
// 1.01 - doplnena moznost s externim nastavenim parametru |
// 1.01 ATmega8 - derivovaný firmware pro ATmega8 |
// Prirazeni portu |
// --------------- |
// |
// Procesor: |
// |
// ATmega8 @ 8MHz (interni RC oscilator, vypnuty preddelic 1:8) |
// (brown-out reset 2.7V) |
// HIGH 0xD9 |
// LOW 0xD4 |
// |
// Porty: |
// |
// PB3 - Ir LED Anoda proti zemi (svetlo=H) |
// PB1 - Vstup od prijimace Ir signalu (tma=H) |
// PB2 - Indikacni LED a vystup (odraz=H) |
// |
// Princip funkce: |
// |
// Pomoci casovace 2 v rezimu CTC se na vystupu PB1 generuje signal |
// o prislusnem kmitoctu (napr 34kHz). Stridavy signal se zapina |
// a vypina (vysilaji se jednotky a nuly) a na prijimacim portu |
// se testuje, zda pri vysilani signalu je signal prijat a zda bez |
// vysilani signalu signal prijat neni. Pokud je splnena tato podminka, |
// zvysi se citac prubezne hodnoty, jinak se naopak tento citac snizi. |
// Trvani jednoho symbolu je dano konstantnou SYMBOL_LENGTH. |
// |
// Je-li dosazeno maximalni/minimalni hodnoty prubezneho citace, |
// hodnota se dale nezvysuje/nesnizuje. Pri prekroceni (velke kladne) |
// hodnoty pro zapnuti se aktivuje vystup, pri poklesu hodnoty pod |
// spodni (mensi kladnou) mez se vystup deaktivuje. Meze jsou definovany |
// konstantami SUMA_xxx. |
// |
// Cilem tohoto opatreni je docilit odolnosti proti ruseni a zavedeni |
// hystereze tak, aby vystupni signal byl stabilni a spolehlivy. |
// |
#ifndef F_CPU |
#define F_CPU 8000000UL // 8MHz je maximální interní frekvence |
#endif |
#ifndef IR_FREQUENCY |
#define IR_FREQUENCY 36000UL // Frekvece IR signalu |
#endif |
#ifndef CALIBRATION |
#define CALIBRATION 0 // Zpresneni kalibrace na 9.6MHz 0=nekompenzovat |
#endif |
#include <avr/io.h> |
#include <util/delay.h> |
#include <avr/interrupt.h> |
#define SYMBOL_LENGTH 10 // Pocet period jednoho symbolu |
#define SUMA_MAX 40 // Maximalni (a minimalni) pocet |
#define SUMA_ON 30 // Pocet pro zapnuti |
#define SUMA_OFF 0 // Pocet pro vypnuti |
// Zpracovani preruseni od dosazeni horni hranice citace |
// ----------------------------------------------------- |
// Citac cita (automaticky a opakovane) od 0 do hodnoty v registru OCR0A |
// Pri dosazeni horni meze se neguje vystupni signal na kanalu B |
// Ma-li se vysilat tma, signal na kanalu B se neotaci ale nuluje |
ISR(TIMER2_COMP_vect) |
{ |
static unsigned char SymbolLen; // Citac pulperiod symbolu |
static unsigned char SymbolState; // Stridame 0 a 1 symboly |
static signed char InData; // Zde se strada pocet shod od dvojice symbolu |
static signed char InSuma; // Zde se prumeruji shody |
// Citac pulperiod symbolu |
if(++SymbolLen>=(SYMBOL_LENGTH*2-1)) |
{ |
// Konec symbolu - zaciname citat pocet pulperiod od zacatku |
SymbolLen=0; |
// Cteme stav vstupu a porovnavame s ocekavanou hodnotou |
// (1 na portu znamena tmu) |
if(((PINB & 0x02)>>1) ^ (SymbolState&1) ^ 1) |
InData++; |
else |
InData--; |
// Symboly 0 1 vyhodnocujeme po dvojicich |
if(!SymbolState) |
{ |
// Add Result |
if (InData==2) |
{ |
InSuma++; // Byla shoda u obou symbolu, zapocteme |
} |
else |
{ |
InSuma--; // Nebyla shoda u obou symbolu, odpocteme |
} |
// Jdeme na dalsi dvojici symbolu |
InData=0; |
} |
// Osetrime prubezny soucet tak, aby nepretekl |
if(InSuma>SUMA_MAX) |
{ |
InSuma=SUMA_MAX; |
} |
if(InSuma<-SUMA_MAX) |
{ |
InSuma=-SUMA_MAX; |
} |
// Vyhodnoceni prubezneho souctu |
if(InSuma>SUMA_ON) |
{ |
PORTB |= 0x04; // Zapni vystup (je signal) |
} |
if(InSuma<SUMA_OFF) |
{ |
PORTB &= ~0x04; // Vypni vystup (neni signal) |
} |
// Dalsi symbol |
// Stridame 0 a 1 (tma a svetlo) |
if(++SymbolState>=2) |
{ |
SymbolState=0; |
} |
// Generujeme svetlo a tmu (nastavenim casovace) |
if(SymbolState==0) |
{ |
TCCR2 = 0x19; // Blikej (svetlo) |
} |
else |
{ |
TCCR2 = 0x29; // Tma (vystup casovace se jen nuluje) |
} |
} |
} |
// Hlavni program |
int main() |
{ |
// Nastaveni prostredi behu |
// ------------------------ |
// Kompenzace vnitrniho RC oscilatoru |
OSCCAL += CALIBRATION; |
// Nastav rezim casovace |
// CTC Mod |
// Toogle |
// CLK x 1 |
TCCR2 = 0x19; |
// Set frequency |
OCR2 = (F_CPU / IR_FREQUENCY) / 2 - 1; |
//OCR0B = 0; |
// Nastav preruseni |
TIMSK = 0x80; // Preruseni od kompare (citac proti registru OCR2) |
//TIFR = 0; // Priznak preruseni se nuluje automaticky (HW) |
sei(); // Povol globalni preruseni |
// Nastaveni vyvodu PB1 PB3 jako vystup |
DDRB |=0x08; // PB3 vystup pro IR Led |
DDRB |=0x04; // PB2 vystup pro indikacni Led |
// Hlavni program |
// -------------- |
// Nedela nic, vsechno se dela v obsluze preruseni |
// od casovace. |
for(;;); |
} |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A.cs.html |
---|
0,0 → 1,517 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
<html> |
<head> |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
<title> IRFEE01A </title> |
<meta name="keywords" content="stavebnice MLAB univerzální moduly infračervený detektor infrared tykadlo"> |
<meta name="description" content="Projekt MLAB, Infračervný detektor překážek pro robota"> |
<!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE --> |
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl"> |
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print"> |
<link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico"> |
<script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script> |
<!-- AUTOINCLUDE END --> |
</head> |
<body lang="cs"> |
<!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE --> |
<!-- ============== HLAVICKA ============== --> |
<div class="Header"> |
<script type="text/javascript"> |
<!-- |
SetRelativePath("../../../../../"); |
DrawHeader(); |
// --> |
</script> |
<noscript> |
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p> |
</noscript> |
</div> |
<!-- AUTOINCLUDE END --> |
<!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE --> |
<!-- ============== MENU ============== --> |
<div class="Menu"> |
<script type="text/javascript"> |
<!-- |
SetRelativePath("../../../../../"); |
DrawMenu(); |
// --> |
</script> |
<noscript> |
<p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p> |
</noscript> |
</div> |
<!-- AUTOINCLUDE END --> |
<!-- ============== TEXT ============== --> |
<div class="Text"> |
<p class="Title"> |
Infračervené tykadlo pro robota |
</p> |
<p class=Autor> |
Milan Horkel |
</p> |
<p class="Subtitle"> |
Čidlo využívá modulované infračervené záření pro bezdotykovou detekci |
předmětů. Je určeno zejména pro menší pohyblivé roboty jako náhrada |
mechanických tykadel. Jádrem čidla je procesor řady ATtiny a přijímač |
Ir pro dálkové ovládání. Modulace a průměrování signálu zajišťuje |
zvýšenou odolnost proti rušení. |
</p> |
<p class="Subtitle"> |
<img width="327" height="105" src="IRFEE01A_Files/image001.jpg" |
alt="Pohled na čidlo zhora"> |
</p> |
<p class="Subtitle"> |
<img width="328" height="162" src="IRFEE01A_Files/image002.jpg" |
alt="Pohled na čidlo ze strany"> |
</p> |
<p> |
<a href="../IRFEE01A.cs.pdf"><img class="NoBorder" |
src="../../../../../Web/PIC/FileIco_PDF.ico" |
alt="Acrobat"> PDF verze</a> |
</p> |
<h1>Technické parametry </h1> |
<table> |
<tr> |
<th> Parametr </th> |
<th> Hodnota </th> |
<th> Poznámka </th> |
</tr> |
<tr> |
<td> Napájení </td> |
<td> (2.7V ..) 3.6V .. 5V (.. 5.5V) </td> |
<td> Zkontrolujte požadavky U1 a U2 </td> |
</tr> |
<tr> |
<td> Spotřeba </td> |
<td> 10mA / 15mA </td> |
<td> Při 5V v klidu a při detekci </td> |
</tr> |
<tr> |
<td> Nosný kmitočet </td> |
<td> 38kHz </td> |
<td> Obvyklé hodnoty: 30, 33, 36, 38, 40, 56kHz </td> |
</tr> |
<tr> |
<td> Dosah </td> |
<td> Cca 1m </td> |
<td> Bez stínítka proti listu papíru A4 </td> |
</tr> |
<tr> |
<td> Rychlost odezvy </td> |
<td> 20ms / 15ms </td> |
<td> Aktivace a deaktivace </td> |
</tr> |
<tr> |
<td> Rozměry </td> |
<td> 35 x 15 x 15mm </td> |
<td> Bez stínítka </td> |
</tr> |
</table> |
<h1> Popis konstrukce </h1> |
<h2> Úvodem </h2> |
<p> |
Aby mohl robot detekovat překážku aniž do ní narazí, potřebuje vhodné |
čidlo. Tato konstrukce popisuje čidlo, které využívá odrazu |
infračerveného záření od překážky. |
</p> |
<h2> Zapojení modulu </h2> |
<p> |
Srdcem čidla je obvod U1, přijímač infračerveného signálu a procesor |
ATtiny U2, který zajišťuje inteligenci čidla. |
</p> |
<p> |
<img width="588" height="396" src="IRFEE01A_Files/image003.png" |
alt="Schéma zapojení čidla"> |
</p> |
<p> |
Infračervená dioda D2 vysílá modulovaný signál směrem k překážce. |
Signál se od překážky odráží do přijímače U1. Procesor U2 generuje |
vysílací signál pro diodu D2 a současně analyzuje přijímaný signál |
z přijímače U1. Pokud se přijímaný signál <i>dostatečně</i> |
shoduje s vysílaným signálem, je aktivován výstupní signál na |
výstupu J2 a rozsvítí se indikační dioda D3. |
</p> |
<p> |
R1 a C1 filtruje napájení pro přijímač infračerveného signálu U1, dioda |
D1 je ochranná proti nechtěnému přepólování čidla. Čidlo je vybaveno |
jedním upevňovacím šroubem. |
</p> |
<p> |
Konektor J3 je standardní programovací konektor ATMEL ISP 6 PIN. Je |
zapojen obvyklým způsobem. Do procesoru se musí nahrát ovládací program |
přeložený pro příslušný nosný kmitočet použitého přijímače U1. Kmitočet |
přijímače bývá uváděn v posledním dvojčíslí označení, například 38 |
znamená 38kHz. |
</p> |
<h2> Přijímač IR (obvod U1) </h2> |
<p> |
Tyto obvody jsou vyráběny pro přijímače dálkového ovládání rádií, |
televizí a dalších komponent spotřební elektroniky. |
</p> |
<p> |
<img width="386" height="195" src="IRFEE01A_Files/image004.png" |
alt="Blokové schéma IR přijímače"> |
</p> |
<p> |
Sdružují v sobě přijímací fotodiodu, selektivní zesilovač |
s proměnným ziskem a obvody pro demodulování signálu. Aby čidlo |
fungovalo nezávisle na okolním osvětlení, je jeho pouzdro z černé |
hmoty, která propouští je vybranou vlnovou délku infračerveného záření. |
</p> |
<p> |
<img width="222" height="212" src="IRFEE01A_Files/image005.png" |
alt="Závislost citlivosti na vlnové délce záření"> |
</p> |
<p> |
Dálkové ovládání používá spoustu přenosových kódů, ale drtivá většina |
je založena na vysílání pulsů nosné frekvence řádu 30 až 50kHz. |
Nejkratší přenesený impuls musí obsahovat alespoň 10 period nosného |
kmitočtu. Pro optimální fungování přijímače je doporučeno, aby |
přenášené impulsy byly dlouhé mezi 10 a 70 periodami nosného kmitočtu. |
</p> |
<p> |
<img width="362" height="158" src="IRFEE01A_Files/image006.png" |
alt="Testovací signál"> |
</p> |
<p> |
Čidla se vyrábějí pro různé frekvence nosného kmitočtu a mohou být lépe |
nebo méně přizpůsobené pro použití konkrétního přenosového protokolu |
(jedná se o kompromis mezi odolností vůči rušení a parametry |
jednotlivých kódů). <i>Je třeba dát pozor na zapojení vývodů, existují |
i typy, které mají prohozené napájecí vývody.</i> |
</p> |
<h2> Jaký použít IR přijímač? </h2> |
<p> |
Zdánlivě prostá otázka skrývá velkou záludnost. Záludnost spočívá |
v tom, že některé přijímače IR signálu fungují dobře, jiné |
mizerně. Platí zde že méně inteligence může být lépe. |
</p> |
<h3> TSOP34838 – špatná volba </h3> |
<p> |
Konkrétně přijímač TSOP348xx funguje tak, že s tím, jak se signál |
zeslabuje zvyšuje svou citlivost až nakonec signál ztratí. Jenže pak je |
třeba signál hodně zesílit, aby ho přijímač zase začal registrovat. |
</p> |
<p> |
V praxi to pak vypadá tak, že čidlo nic nevidí dokud se překážka |
velmi nepřiblíží a pak ji vidí dokud se velmi nevzdálí. Pro náš účel je |
tato řada IR přijímačů nepoužitelná. |
</p> |
<h3> Jaký přijímač tedy použít? </h3> |
<p> |
Přijímače OSRAM řady SFH5110-xx pracují správně. Překážku čidlo |
zaregistruje a zase ztratí v prakticky stejné vzdálenosti. Další |
typy je třeba ověřit. |
</p> |
<table> |
<tr> |
<th> Přijímač </th> |
<th> Výrobce </th> |
<th> Poznámka </th> |
</tr> |
<tr> |
<td> TSOP348xx </td> |
<td> VISHAY </td> |
<td> Má obrovskou hysterezi mezi zachycením signálu a jeho ztrátou </td> |
</tr> |
<tr> |
<td> SFH5110-33 <br> |
SFH5110-36 <br> |
SFH5110-38 <br> |
SFH5110-40 </td> |
<td> OSRAM </td> |
<td> Funguje výborně </td> |
</tr> |
</table> |
<h2> Inteligence čidla </h2> |
<p> |
Pro detekci překážky by stačilo použít střídavý signál o vhodném |
kmitočtu a přímo výstup IR přijímače. Takové řešení ale není příliš |
odolné proti rušení, a kromě toho stejně potřebujeme nějaký obvod pro |
generování nosného kmitočtu. Proto bylo zvoleno řešení s malým |
procesorem, který generuje signál a současně ho i vyhodnocuje. |
</p> |
<p> |
Vysílá se signál v podobě nepřetržité řady jedniček a nul. |
Jednička je představována 10 impulsy nosného kmitočtu a nula stejně |
dlouhou mezerou, během které se nevysílá žádné záření. Průběh je na |
obrázku ve stopě 1. |
</p> |
<p> |
<img width="320" height="240" src="IRFEE01A_Files/image007.png" |
alt="Průběh vysílaného a přijímaného signálu"> |
</p> |
<p> |
Ve stopě 2 je signál na výstupu IR přijímače U1. Stav L indikuje |
detekovaný optický signál. Detekovaný signál na přijímači je „rozpitý“, |
protože přijímač potřebuje cca 6 až 10 period signálu pro vyhodnocení a |
změnu stavu. Na obrázku vidíme asi 10 sekund aktivity zaznamenané přes |
sebe. |
</p> |
<p> |
Vyhodnocování procesor provádí tak, že testuje, zda přijímač zachytil |
kombinaci 10 a pokud ano, zvýší počítadlo úspěšných detekcí. Jakmile |
toto počítadlo přeroste aktivační mez, nastaví výstup čidla do stavu H. |
Pokud se místo očekávané kombinace 10 přijme cokoli jiného, sníží se |
počítadlo. Jakmile počítadlo poklesne pod nulu, výstup čidla se |
překlopí do neaktivního stavu L. Obrázek ukazuje máchnutí rukou před |
čidlem, odezva 20ms pro zapnutí a 15ms pro vypnutí. |
</p> |
<p> |
<img width="320" height="240" src="IRFEE01A_Files/image008.png" |
alt="Odezva čidla na máchnutí rukou"> |
</p> |
<p> |
Toto poměrně jednoduché řešení vede k solidní odolnosti vůči |
rušení. Ani ovladač od televize z bezprostřední blízkosti |
neovlivňuje funkci čidla. |
</p> |
<h2> Mechanická konstrukce </h2> |
<p> |
Předpokládá se, že čidlo bude připevněno na přední část robotu nebo na |
nějaký drátový nebo plechový tvarovatelný nosník. Je proto opatřeno 1 |
upevňovacím šroubem. Vysílací dioda a přijímací obvod na sebe nesmějí |
vidět a je nutné tyto komponenty doplnit vhodně tvarovanými stínítky |
tak, aby čidlo detekovalo překážky dle potřeby. Přijímač je velmi |
citlivý a vidí vysílací LED i tehdy, kdyby to člověk neřekl (například |
zezadu). Stínítko lze udělat například z černé smršťovací bužírky. |
</p> |
<p> |
Vysílací IR LED lze osadit jak shora desky, tak i ze spodní strany. |
V případě potřeby je možné LED umístit dál od desky a vhodně |
nasměrovat. |
</p> |
<h1> Osazení a oživení </h1> |
<h2> Osazení </h2> |
<p> |
<img width="567" height="241" src="IRFEE01A_Files/image010.jpg" |
alt="Osazovací výkres, strana součástek"> |
</p> |
<p> |
<img width="563" height="240" src="IRFEE01A_Files/image011.jpg" |
alt="Osazovací výkres, strana spojů"> |
</p> |
<table class="Soupiska"> |
<tr> |
<th> Počet </th> |
<th> Reference </th> |
<th> Název </th> |
<th> Pouzdro </th> |
</tr> |
<tr> |
<th colspan="4"> Odpory </th> |
</tr> |
<tr> |
<td> 1 </td> |
<td> R1 </td> |
<td> 100 </td> |
<td> R0805 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> R2 </td> |
<td> 330 </td> |
<td> R0805 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> R3 </td> |
<td> 680 </td> |
<td> R0805 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> R4 </td> |
<td> 10k </td> |
<td> R0805 </td> |
</tr> |
<tr> |
<th colspan="4"> Keramické kondenzátory </th> |
</tr> |
<tr> |
<td> 2 </td> |
<td> C1, C2 </td> |
<td> 4u7/6.3V </td> |
<td> C0805 </td> |
</tr> |
<tr> |
<th colspan="4"> Diody </th> |
</tr> |
<tr> |
<td> 1 </td> |
<td> D1 </td> |
<td> 1N4007SMD </td> |
<td> MELF </td> |
</tr> |
<tr> |
<th colspan="4"> LED </th> |
</tr> |
<tr> |
<td> 1 </td> |
<td> D2 </td> |
<td> L-53F3BT </td> |
<td> LED5 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> D3 </td> |
<td> LED_RED_5mm </td> |
<td> LED5 </td> |
</tr> |
<tr> |
<th colspan="4"> Integrované obvody </th> |
</tr> |
<tr> |
<td> 1 </td> |
<td> U1 </td> |
<td> IR_RECEIVER (viz text) </td> |
<td> TSOP348xx </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> U2 </td> |
<td> ATtiny13-20SU </td> |
<td> SO8_210 </td> |
</tr> |
<tr> |
<th colspan="4"> Mechanické součástky </th> |
</tr> |
<tr> |
<td> 1 </td> |
<td> J1 </td> |
<td> JUMP3 </td> |
<td> JUMP3 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> J2 </td> |
<td> JUMP1 </td> |
<td> JUMP1 </td> |
</tr> |
<tr> |
<td> 1 </td> |
<td> J3 </td> |
<td> JUMP2x3 </td> |
<td> JUMP2x3/B </td> |
</tr> |
</table> |
<p> |
<img width="328" height="147" src="IRFEE01A_Files/image009.jpg" |
alt="Obrázek osazené desky ze strany spojů"> |
</p> |
<h2> Oživení a kalibrace </h2> |
<p> |
Oživení spočívá v naprogramování řídícího programu do procesoru. |
Je třeba použít program, který generuje vysílací signál o stejné |
frekvenci, na jakou je naladěn přijímací obvod. Hodnoty pro |
naprogramování konfiguračních buněk procesoru jsou uvedeny na začátku |
zdrojového kódu. |
</p> |
<h1> Programové vybavení </h1> |
<h2> Popis programu </h2> |
<p> |
Pro generování budícího signálu vysílací IR diody se využívá časovač |
v režimu CTC. Časovač opakovaně čítá od 0 do horní meze, která je |
nastavena v registru OCR0A. Touto konstantou je dána frekvence |
generovaného signálu. |
</p> |
<p> |
Při každém dosažení horní meze časovače se automaticky neguje výstup |
PB1, na který je připojena vysílací dioda. Současně se vyvolá |
podprogram pro obsluhu přerušení, který čítá počet půlperiod vysílaného |
signálu. Pokud se má vysílat tma (nazvěme stav 0), vše probíhá stejně, |
jen se výstupní stav PB1 nemění. |
</p> |
<p> |
Po vyslání nastaveného počtu period signálu (konstanta SYMBOL_LENGTH) |
se střídá vysílání stavu 0 a 1 (střídavý signál a tma) a současně se |
vyhodnocuje, zda se přijímaný signál shoduje s vysílaným. |
Vyhodnocování se provádí po dvojici 0/1. |
</p> |
<p> |
Hlavní program obsahuje inicializační část a prázdnou nekonečnou |
smyčku. Za běhu se vše vyřizuje v podprogramu obsluhy přerušení od |
časovače. |
</p> |
<h2> Překlad programu </h2> |
<p> |
Pro překlad je připravený Makefile, který přeloží program |
s nastavením pro vyjmenované nosné kmitočty. |
</p> |
</div> |
<!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE --> |
<!-- ============== PATIČKA ============== --> |
<div class="Footer"> |
<script type="text/javascript"> |
<!-- |
SetRelativePath("../../../../../"); |
DrawFooter(); |
// --> |
</script> |
<noscript> |
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p> |
</noscript> |
</div> |
<!-- AUTOINCLUDE END --> |
</body> |
</html> |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image003.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image001.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image002.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image004.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image005.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image006.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image007.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image008.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image009.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image010.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/HTML/IRFEE01A_Files/image011.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Modules/Sensors/IRFEE01A/DOC/IRFEE01A.cs.pdf |
---|
0,0 → 1,4372 |
+%âãÏÓ |
+0000000016 00000 n |
+0000001448 00000 n |
+0000002192 00000 n |
+0000002423 00000 n |
+0000002673 00000 n |
+0000003467 00000 n |
+0000003697 00000 n |
+0000003719 00000 n |
+0000004394 00000 n |
+0000004416 00000 n |
+0000004983 00000 n |
+0000005005 00000 n |
+0000005594 00000 n |
+0000005616 00000 n |
+0000006174 00000 n |
+0000006515 00000 n |
+0000006737 00000 n |
+0000006897 00000 n |
+0000007121 00000 n |
+0000007420 00000 n |
+0000007573 00000 n |
+0000008276 00000 n |
+0000008996 00000 n |
+0000009018 00000 n |
+0000009705 00000 n |
+0000010451 00000 n |
+0000010673 00000 n |
+0000011358 00000 n |
+0000011588 00000 n |
+0000011610 00000 n |
+0000012282 00000 n |
+0000012629 00000 n |
+0000012790 00000 n |
+0000012812 00000 n |
+0000013488 00000 n |
+0000013510 00000 n |
+0000014151 00000 n |
+0000026228 00000 n |
+0000026457 00000 n |
+0000033961 00000 n |
+0000034101 00000 n |
+0000034389 00000 n |
+0000071833 00000 n |
+0000072048 00000 n |
+0000072322 00000 n |
+0000092728 00000 n |
+0000106744 00000 n |
+0000106966 00000 n |
+0000107173 00000 n |
+0000123156 00000 n |
+0000130466 00000 n |
+0000152656 00000 n |
+0000231365 00000 n |
+0000001553 00000 n |
+0000002170 00000 n |
+stream |
+Hb```f``d`c`¸Ä Ì Â¬ì,p4Ì(háÔÀÀ ºm |
+ÌÆÆaÉâÕÈllfa ïå8Î ic CF%CB/ÇeÂÀÀ¤dô``PlàüÁ¬À(Âp¡«Aá@¨ö Ö'½*4pi0é µô9³>zÀóáåÆL"ôÚs~aÎZÀæÀô¤fL ¶ÏõW$&°TpÍaä: ½ó˦ |
+stream |
+Hl=oÜ0wÿ |
+¾Á<ú¢ºµh4@Ô[!½ ù@) ôפ$ÛÀl?"E/Å/ó°g4ÎÌ¿ÆòÃè \D²ÞÌÇÁªíÏã°¿üáÌã;/ÌyÑìæa |
+\2Sòdæ¯k-×ÔOÃíøýæÛÅ ua7 ñ°Üøo³7hmlf8îh|ÞÝÍWcäã9êíøôÆƧßöûÓéÔâ÷ënÂñþ'þê)Æѱ/¥@¡Z¡þ%ÎkÌÁ¶%Í´ÖÕSÕúBÝË_Dyÿº1Ç`¶oJ¯eïÅ<8#.ËssÉ+W¼òÂøÌqÖ\Û;kØòl`¸ÀÇ x2ÇÁs3tùuá$=j\sää3XR´Ô«M26ACã"î¨ÚI |
+stream |
+stream |
+íø«^1G·ö3Ó*Qµ¡Ô#Rc9äé§rÍ-ï*L |
+stream |
+Hl9rD!DsbN ZnäÀ¾jóqÙá}ÔÝÌÇAõbÚÀøúú88ÑÙa*(,h\A¶WT (Ë|Àº:<¾áîl¾¢ù§wu^~z+ÃØÿðòq¦Ü¬0³¾v±bðiƬqß0(t8Í>Î! w',öÃãB§- |
+)XKi®fÊyWWW¹m!Y3åñj_vÖûÝúS±U±¥WA eúÙS |
+stream |
+:è§q¶á½Ò¤ p |
+ ×lJãþf4kuo > b |
+stream |
+HTÁnà ï< zd;F¹4RUݪ%ÛÉ@9äíQmcÙ¿ùÃüÔ6³ø¼ê0±NN~& pÇÁ:(JÐVÅZ_5Ê <»e8¶Îx¨*Æß8EZàÐ\Úóùvìûç£xþFɺýKùñ:ÝÂ7è"¨kÐh?]ex#ÿëÿÕú% k]l$^ã¤Bn@¨0X?:ý_¸îF}Ibût!¥é}ù;éz$#Xû¥y[ö#À ±-oq |
+stream |
+stream |
+HTÁn@½ós\¼Ù]XX¤¨R«ôH=Tâõ@`Su1¸²?ÅÇ1B¤î.ÛI¤Ì¼y3ï½ÁÓSîqÓþ7ºs&R@ô×A©lä2É`5rç&8èÏ e!1Õ·|ékü¾`×%|¨1m )D2-§½(=Á§½ÈE/Î5S<ÁìíF2ï}¤¹ydÜ®áAB[O2Ãq(+Ç-!Ïò¢?aôضÚ<1Û^V |
+v2/_ªVµRV{ÃE ¦B¤®E`¥Û§"Û¼@T³3cFØòx© êuÆ"YÄU4.÷Ù ?Òôû/_4ÛeÊBkÑ¥µ,aªF}áÿ¡¹¨A<¢,-bÈgvi2¢$rjýNHL÷ójÎ<qî Ó7¹r6ÈeLyGî¯QU[/³Î)¹²üçب¡,?ñyº(åÓóù<Xþ\Ú÷µMTÚK¥3¢6EvÕöEH³ÌY°i]^Ùæ£ÃAåùÉ ùãÍ}tvtÏ |
+.0Ó?Ós!QùO ÂZ |
+stream |
+HTMO0ïü9®ÙC?MH²Ñ£k½³íM¤4ü{K¨¶yúÎLç¢<FO@^Ý + ÕF9ÙI+vÚ ã ´6 |
+»ìÄ'WË8a_v<OÈÇÉ-p8?ÅåX×ìHo\B§M:åïþ¦ýÂÍ mBçƾ4=ùÿ«ÕEàÙÖÉ p´D×!§´U§ШÿzŬk+?ø0*C4»+±S ô6RÔ²»@:eÒH"ñ¯lõØOõøØÞm1DÓbúÚÞ:Èݵó Ó~W§Úàþ!v°«©u%ß Nbü |
+stream |
+HSMoÓ@½ûWÌq÷éÎ~y-!¤¢"q\¤CÃëÿ±×q"Å#¿õ{ûÞÌ$ |
+ò2á¿o /yò5ÑÖaêAñ4¡ @©Å4ÑÉ*e\¼®5\5É»äEîOÕ |
+íNª ,äuÏ<2 |
+stream |
+Y}g_ªzýe¢d¦d£û, EEj(8{húå-zà|V¼Ï~y?ÙúqÔº÷CιðÎ~ûF âÖ0åþÀ-¾þÜí«?0¯^ÖU³ßRtYºÜh:Bü½}Ì"#©D£r ÀÔÕÒ¶E4;É |
+stream |
+¡Å]Q0&Òl¢¢1FârÀ%ñ9JbÁùÑ q&èDgÔ4îNh\f41ç¨]ó`¶dúßçÕÿ¯êÝ÷êÕ-X¶SçÍ5t]\Êo¶ öÃy%ù3þðAgöðÉlñùÅòfF]ºôyLóä6¼Ð¹È?Ászðÿü7ñ¸kÁ¹ókåñ~ CTñ¬©,ûF¼Ác×ÏüV~Íó-ö7KæL+¹Ö·â} êÐ&ÀXÃÂO'Y¾ÊÓ7½Ãôc:Þ"}Eðìßüû±ï +îQ<¢ÃðÇhT`ð Zc)Øp |
+@*d`3.`2æà:® |
+é¸Lþ¼%B?}ÿÓ±Jïe/_$c'öQ1C,ÛiÂEÑy®Qú¸>Ï£¸N]u-ÒØúíÅxþ(ÂQý¤©BÈA5-¢[E6ÊU*ÓÓÑ»qÒÙÆù»Q̳¶êu£¾ß+Â4^iV1ã]¨=d²ñ.LDà9¿þ |
+.ÞµA42FÐFc"Mbx( |
+èدoÞ½íÛ#Æݽ[TdDxWgX¨Ò¥s§ vµðo׶MëV-ý|[øØmàr;S³M+"ÛRδ´¦±ÓÃ/<?{mü*õ>ÝìfþÒ3=óþÏ3é_Iÿõ¤¶æ qn§iOqu4iL&ÛkRY¦u§ÙÑl¿Ùl·b;4'îàÓ¢lÓm¥Î+(sg§ðrµ~¾ÉÎäi¾1.Ôúú±éÇåpÔc 5ÂáN¬ðiŤ¬Î·õ3¥%ÃÝ\kôLwJÇÐЬEÉS96ÑÍ.HncÙ-{s³°)µ®ú²ÕumÝ2×ëiIOVSvÑ7År,¼ü¿!/îÿOÖ«6ã |
+¿ÝÛ»Ûüù¹c9[þÃüÔM1Ì]¦!ÆÆܹNs · ?j"~²¶¤mDAµ)ÂmXÒÚTBFBiEiU¶))mi´HÞ~oöör>h¡U-÷fÞ7óæÍ{ófëã»2¥Õ_ä®iî |
+ZâÒÿ&ÃáXÒaáWáÂÆæ Ö;qKÙ¼Þ³»5F9ÉõAëc±Ö\ÄÁ-Ûê-,ôÛRa4h¶Ä5?`$V.,ê) sÙÖ"Á Ã%=þÑ[{Få¦#s2kÒ2Ùùո,íW -2!¬àê ,ØÓþY3ÌÕs0 ZVÎcõH}Òô×ïg}ËöAó6áüO>ÎYâèaÿmâ&GI:Ð wÛVy¹UVÆâÇÂÆ:Ù¯®¬ØÒ',c?÷ÑSðíÊDm |
+H5Øhå×ÇÕH8-PåTßöôÌÜä¹´°.ã¿£ÏëC KYþdó |
+=¤Rý)kIò¹ZjOVmùðþÜaýaæ4U¬Æ6Ó1LÃee1#3æÊ>»kôf¿WãæhÒ=þ>ûÔ{5M¬UjÚôÊ»¹-ÞïÇ'Öîx¯PD}rA¢g |
+dñþ îgÉÌe&wÜA}CVô |
+í#*Ó6Ríîc½êD*C{2d¥Þ{ξÊr,ǵBo#uA^þ£@w/@s|ð1ÏQ¶´Q=Ã{µo ½v,Bû3Ðl]ºü¥hÏr óEQc¯F{4ÚóàÑh¢Ð»Ã:; /@_ðX¬à±³T½¤xS]¢ |
+ %}óÝ=±ýlÓ¿AíËcÛ*>·í,¬QgʳÚÚëAq6¨íhzEÞK4 ûû¨Ñ:hw¢ýWظÈsªÑ÷ã%xδS½EÈÊõ×7T'¦CPmßß zÀ~áo*í =ÄÂkú4I»J hG>¢?§ýßàìAëá÷ë>²?ÁõÌÓþ8¬_Å>àsWZº1öd/ #qï1ÖÇ:óÎ9_Æ À±Ìp:ºþ?&1ÌxÝ×Oßå1w,ÆO/qÌplr|plÈøG<ÉåsÜßp99óñ,í |
+ |
+|ìL¡ce¾ð9²Í<7ÇÇK!/vâ^¹ÁûäÊ §B®-sc+rì3U#r¥bfqÌ:¾v©´!ÊùÈ9áR×ÎO# j'å³ïøÜ]êú"MS²%÷è m:PÏ"þÛÑ~ |
+ÀÅÚyzCÒA1YT<nû§[¼äÀmgÒl()#Sößòÿnzí¿ym[¤×°Wòþ]] |
+ï_Þ2ä=Y¯;>¦õQ8f ïáóÔææ50CþóÔ={çÍ5s¯Ý®¿`·«ívìó'ú.Ðö Qb÷¤kjf¤î²B·²<ç©(]Gô4u ¹jGQÃ:/ëç_h¼ç¦¼ÛfH{99«pï ÿþ«åÑsê+D*òù&i>£þwîbÚ¤²«îwPT¢Z.|6Þ#¨È³¡Cr>Ê<¶_×|4 ³rïe>{ý.å %ë¸Z1æÜkXÞãûi |
+Ð;9@ÎØ Ë oÓ<õ´NÀûà |
+ômTàÝBj ø Õ÷pϽCSdÏ \ iÒ"³Çç.×çÿ×|ï6àiiÃuÜÇ2hrѾڪ\DÝÞ»@¿ý|×î9ÿÉÏ:?Ä |
+¨XÐbbÁBÁvLb».%3í´ÓBqÔqFãcú Mß9{oLZÿqw¾ßw~ó¸ç{Îï×Çļ²cI¿õ~¬÷ú~0¾°z¨A>{W#¬os¿¸gͯJ®÷]ì%I¹ûMÜý6ð<¬Íÿ'àÛyxxëÝ%X«9ê2²\[Üs-Áuuè=B3Àq.àËìGù7(o |
+P~¶£àý`l5w`Æ9ÂÀ'ÔLäïìÐÆúdÝ¡[ÀóÉ6.òïßج?ø°>dfg7¥¨cµó}è;Á¿¾2ÙÖ ÊC× |
+Àx¯Hÿo/ðûÐgoZgµ·Þ·Çq¦}ÖúxÏÈOq¦LDSð0» Å&ÊRÏâñb¬³ûSå9£GÓÿnóÆÊKïËÆÐÇjo¼zjÞ1n=%/±ôTÜçO]{V>I2GòÝân¡öÜÍý1¤~Ç#ßuGhÂ: |
+"¶ýíɤÈæ}æ]Øc½@´²h{óQ`Û<E¶5¾$]`Ï`ªÃìøôæ»cXàt]"vôn;& |
+yC¾P^¨]-ôú |
+ó |
+ÛUîå>ÇÛÕæÊîÊKW*Õhe]eS%+Æ«Eɳ}{ébWdÒÇB¶× F8d!ê UéäJ¬]°v* |
+>¿¢@=F®°uä!9Pt*«Á[§táß©t2X_0 ©S !IvwÄLÄÐq¸ |
+ûm»mmkm«lËlmómÙ¶¶¶»ÇÛ'Ú'ØívÍ®Ú;±g$ûÃ_a椩Bª²ìV»¾Bí |
+?z;IÓA4H1±6êjCe^Ì ^F.5zÚAþ |
+ò9 |
+v¨Ð]73WV£¯[5+ѱòµA½Uc"·k«êp©cê\'¯W66ÍÞ6jª°b¾oýíGÌQÛ/o1)Sç&&Ψë4¼±ÚòX=CìÏ¡<Ó9ëþ¹ºÆÁà<¹=c²<æóLŲ̂~\Oôy¦N®³h¡VÄ7ðoM±ËØj$ÆJÙýÚ[ÀÁ%A§×a³ow AnRb`Ka+øb µ¥°* Ö{©åÄò' .0_X.ð¨Ên«Õq¾J©ßæcíÚZ¤³B£©P×âr}-B·ëÕWq*R löúý^K¬±ams9«òºWù×4ªÊ¡«ym³êO.×úON¹yè@ág¯]9èÚséÂýÉóGgqëo®6Ù-¥ê½÷¯ÍÜ¿~;ÿßc©³³_ÎÝý#î¾°Éf¶ègwÃʦD"þÏF s»c²T²:'=¬Î` -MµùZ.)îHÿ+ͤGtæW®3[HWfM&0ê¡j/HÒ%)Ñz©ë µ«êöÉKÿ,¦W×6!oXX[®NMænUºíæbö{A}@=Åsöß¹Üèojm3Þ¿#ô8vzBÒq@p5ýØ<f&ð2éÆïâËÜåhî8>s/c%¦çLÇ\ÇÜÃÞ%/gtã߬,"7keq |
+ØpÙæÓrÞ)K*¹Å$KÅ\:ü´nTGtu< |
+ %Ñ~4²h-"-í ètåáJ²WâÊ<Öɦ% u³VfÕlØ>O~ZQ6%R÷R;© ¬bk¡â©;¦«ìMI³Ïv2Ç%Rñ`} ¥¥·Pò$ð $xCC¼´çWfÍA5Ï1,ýtÊñA¤|%¨Re½²¦ 56ج°Wùý«}kµÆtønþŧ;òëú'ÖUK½Þõ»¿ýÌ©][ð÷1{û.Ýâ¯ó[¸ª:v:óUøÉýSÀ®.&,ÈÉzÀÍbE:°)ªL¡W5 #ì æª0²ÑhÚ}Fq<G8ê¦Os |
+¯¥'À¸ò6墪¾´TYÆK°±` |
+¬-¨2í*+sUù|,Ióuuá*Ì5q)¹ÂL¯Âüä |
+ÓN!QDIËGºÂíØdGÐEgUîhҸ袷Ó55MJw×ê'ìl 6f~Þ¶³|»ðÝJ3ZÓjtjëfvü=¢;ÊÿÀy¼)̯?nòËäsÆlJrIÍ~ÈnDû.÷{ÃïNÿa´spX¨ç;Öj7Ú§]ݤ[»óHÅëæ3Ú3%yÍ6[rü,êK,#n#)ªéÚÁ¢e9;¤² ÍJ§j6M;CÖqëm«Êjµ¨Â°pÜ@}:e¦ê¼É¤k¼Ãéphl5ö Á÷Ùl£6ƶl±kp@3¦!ÍÉ®ÖØ8ª+|ÏÌìììÃóØÇìû;cïc2»NÖözÖÙÄÇqb8Á® |
+¿ò¨SÕ¯?ÉíÿãÃú~ä þü1xÿðʾ㹽îyÌA,þÙ£ÂýiÝ1Ç¥ÄëeÙ£µ²¤è(ý¹{h/ÎÙD / 4·Hb0£azèAZtdÒ |
+Æ_Wh(¸:]'if¥Ùi;N°elãTÆm¶ |
+gÉñìÀeö"öqÙy×áEǪç%ÝÎ(M^qµnÛÎäwKvF>MÛlÝ=Ù>«8Òé;"Ùþ |
+{â\6«(²?¦ç¼K,K Y/JïHÔä~ëvÚt®hØÓö¬Ý° E{É^¶yb«6g3²Fô{vàås´æ,!ó(×Ûw,<UüÅgÒjµÏ[_Âçôã°,Oð¢Oð±xĸ'¨C¬«ÏãÍ£4PEÄô¨éz%ÚåPUmæÇNê¢>+_É_>?ùmS}6öÝ_9úè#¹orcd¬O1)KHk]üÆÐã3©\Î*(SðèçØH×õtg.7~xi"©äȳ,ͯ ÏvÁåí,Zt)ÎE#¦Y |
+VÜ ÑAc}B3¶Ydlãß ,Ò(7%ÁÞ/Ý *×o"⤧¬9ëÅ[»¼ñ <X+ߨ·ÔõÕÿãzíímÜo£>K+`ìïÃbÝq§À@qJ÷ø.PÄRã |
+3¢}º¸>)¯Õï"¶Ó39Séçús'¯[E0ìLÜêÖìLìGYË2G |
+ë ñZÄTA/úÀWSá1Çcþ"¸"{"3ÃEsÉä©Ëæ*£sÖ~ù»,1PUmX§!Ôl V]Õn¨[CF- IÑêv}Åj«{è¡ÖüÀï=681Ë¢»{þºQëNø=Ù¤aù!Ê¿výúhU=±Ú¸ï PÉéjVS/~%Eáxá°îZç/<×» Ýbº,Ì]´kÞýêfú±ÿ7L±a&ÙÄd(Eç ÿa( |
+µ?3î\¦C¹7)1x^r\L÷ÈX |
+Ѳªä'å¥5¤"¾aµu«µ»Þ(íDË1o;eó?`âr.ÃUÛK@¢ ?E0 h/ÉôS_2$II£)Rip·1MQÐ!j\¡£¡UØBF[lT¦á´Y¥¢?¬®©nzV9`Qq4Y«a-[Â@`ÐØgN¦') §yÙ®©LÞÊJx3ÒA3OKM8äý$O$ØóÈþ?è2ðMW&Ë |
+4à"¼PõËIÌÓá¥0·Ír'a5l¢±~7,gWÏý/QûPúPö¨úµÚ |
+Ý©cuÞgØ»*B¬# ¤I¢iмh =hÉþ`tU |
+¥IDÀ¦}¤Âú"·¹îTcÝíTÕ(ÀÓÆôTcnº2>^Á˳Ôj»Wú'&ú+ãÈÞ!!ÃÍyÎà®ÇÜÈYòXÎzÎ' |
+Ôû\v»" |