Problem with comparison.
/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/SW/BIN/Tykadlo_30000.hex
0,0 → 1,20
:1000000009C016C015C014C013C012C012C010C061
:100010000FC00EC011241FBECFE9CDBF10E0A0E677
:10002000B0E001C01D92A436B107E1F76FD07CC0EB
:10003000E7CF1F920F920FB60F9211242F933F9389
:100040004F935F938F939F93809163008F5F809313
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
: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
:100050006300843108F44FC01092630086B350915E
:10006000620090E08071907024E0959587952A95C4
:10007000E1F7252F30E02170307040916100821748
:10008000930711F44F5F01C0415040936100552325
:1000900069F48091610090916000823011F49F5F5B
:1000A00001C09150909360001092610080916000B7
:1000B00089321CF088E28093600080916000883D66
:1000C0001CF488ED80936000809160008F310CF00B
:1000D000C39A87FDC398852F8F5F8093620082301B
:1000E00010F01092620080916200882311F482E186
:1000F00001C082E28FBD9F918F915F914F913F919F
:100100002F910F900FBE0F901F90189581B781BF50
:1001100082E18FBD81E083BF84E586BF84E089BF33
:0C0120007894B99ABB9AFFCFF894FFCFF7
:00000001FF
/Modules/Sensors/IRFEE01A/SW/Makefile
0,0 → 1,69
###############################################################################
# Makefile for the project Tykadlo
###############################################################################
# (c)miho www.mlab.cz
 
 
## User Settings
FREQUENCIES = 30000 32000 34000 36000 38000 40000 56000
CALIBRATION = 0
 
## Project
PROJECT = Tykadlo
MCU = attiny13
TARGETDIR = BIN
 
## Variants - all supported frequences
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
.PHONY: all
all: allhex
 
.PHONY: allhex
allhex: $(foreach VAR, $(VARIANTS), $(VAR).hex)
 
.PHONY: alllss
alllss: $(foreach VAR, $(VARIANTS), $(VAR).lss)
 
%.o: $(PROJECT).c
$(CC) $(INCLUDES) $(CFLAGS) -c $< -D CALIBRATION=$(CALIBRATION) -D IR_FREQUENCY=$(subst $(PROJECT)_,,$(@:.o=))UL -o $@
 
%.elf: %.o
$(CC) $(LDFLAGS) $< $(LIBDIRS) $(LIBS) -o $@
rm $<
 
%.hex: %.elf
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $(TARGETDIR)/$@
 
%.lss: %.elf
avr-objdump -h -S $< > $(TARGETDIR)/$@
 
## Clean target
.PHONY: clean
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,185
// Infracervene tykadlo IRFEE01A
// -----------------------------
//
// (c)miho@mlab.cz
//
// 1.00 - zakladni funkcni verze
// 1.01 - doplnena moznost s externim nastavenim parametru
 
// 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))
{
 
// 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(;;);
}