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(;;); |
} |