/******************************************************** * Code to access the raw data coming from the IR receiver * and display it on the screen. I used this code to generate * the code that sends commands to the tv. * By: Jonathan Mash * Date: Feb. 2009 * Based on work by: Walter Anderson (wandrson@walteranderson.us) *********************************************************/ #include <avr/interrupt.h> #include <avr/io.h> #define TIMER_RESET TCNT1 = 0 #define SAMPLE_SIZE 150 #define DEGBUG 0 int IRpin = 2; unsigned int TimerValue[SAMPLE_SIZE]; char direction[SAMPLE_SIZE]; byte change_count; long time; int value; void setup() { Serial.begin(115200); Serial.println("Analyze IR Remote"); TCCR1A = 0x00; // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1 -- PWM11=0,PWM10=0 => PWM Operation disabled // ICNC1=0 => Capture Noise Canceler disabled -- ICES1=0 => Input Capture Edge Select (not used) -- CTC1=0 => Clear Timer/Counter 1 on Compare/Match // CS12=0 CS11=1 CS10=1 => Set prescaler to clock/64 TCCR1B = 0x03; // 16MHz clock with prescaler means TCNT1 increments every 4uS // ICIE1=0 => Timer/Counter 1, Input Capture Interrupt Enable -- OCIE1A=0 => Output Compare A Match Interrupt Enable -- OCIE1B=0 => Output Compare B Match Interrupt Enable // TOIE1=0 => Timer 1 Overflow Interrupt Enable TIMSK1 = 0x00; pinMode(IRpin, INPUT); } void loop() { Serial.println("Waiting..."); change_count = 0; while(digitalRead(IRpin) == HIGH) {} TIMER_RESET; TimerValue[change_count] = TCNT1; direction[change_count++] = '0'; while (change_count < SAMPLE_SIZE) { if (direction[change_count-1] == '0') { while(digitalRead(IRpin) == LOW) {} TimerValue[change_count] = TCNT1; direction[change_count++] = '1'; } else { while(digitalRead(IRpin) == HIGH) {} TimerValue[change_count] = TCNT1; direction[change_count++] = '0'; } } //Serial.println("Bit stream detected!"); change_count = 0; time = (long) TimerValue[change_count] * 4; change_count++; while (change_count < SAMPLE_SIZE) { time = (long) TimerValue[change_count] * 4; if(direction[change_count-1] == '0' && direction[change_count] == '1') { Serial.print("\t//"); Serial.print((int)change_count); Serial.print("\t"); Serial.print("HIGH\t"); Serial.print("\t"); Serial.println(time - (long)TimerValue[change_count-1] * 4); Serial.print("\toscillationWrite(led_pin, "); Serial.print(time - (long)TimerValue[change_count-1] * 4); Serial.println(");"); } else if(direction[change_count-1] == '1' && direction[change_count] == '0') { Serial.print("\t//"); Serial.print((int)change_count); Serial.print("\t"); Serial.print("LOW\t"); Serial.print("\t"); Serial.println(time - (long)TimerValue[change_count-1] * 4); Serial.print("\tdelayMicroseconds("); Serial.print(time - (long)TimerValue[change_count-1] * 4); Serial.println(");"); } change_count++; } value=0; delay(100); }