Hi all,
I found tv-be gone program for arduino. I introduced some changes and add 2 transistors with ir leds on pin 3 ( included in code), and another 2 transistors with ir leds on pin 4. I have some problems to implement pin 4 in program. I want have the same signal on pin 3 and 4 at the same time
Please help ;]
Main Code :
#include "main.h"
#include <avr/sleep.h>
void xmitCodeElement(uint16_t ontime, uint16_t offtime, uint8_t PWM_code );
void quickflashLEDx( uint8_t x );
void delay_ten_us(uint16_t us);
void quickflashLED( void );
uint8_t read_bits(uint8_t count);
#define putstring_nl(s) Serial.println(s)
#define putstring(s) Serial.print(s)
#define putnum_ud(n) Serial.print(n, DEC)
#define putnum_uh(n) Serial.print(n, HEX)
extern PGM_P *NApowerCodes[] PROGMEM;
extern PGM_P *EUpowerCodes[] PROGMEM;
extern uint8_t num_NAcodes, num_EUcodes;
void xmitCodeElement(uint16_t ontime, uint16_t offtime, uint8_t PWM_code )
{
TCNT2 = 0;
if(PWM_code) {
pinMode(IRLED, OUTPUT);
// Fast PWM, setting top limit, divide by 8
// Output to pin 3
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS21);
}
else {
// However some codes dont use PWM in which case we just turn the IR
// LED on for the period of time.
digitalWrite(IRLED, HIGH);
}
// Now we wait, allowing the PWM hardware to pulse out the carrier
// frequency for the specified 'on' time
delay_ten_us(ontime);
// Now we have to turn it off so disable the PWM output
TCCR2A = 0;
TCCR2B = 0;
// And make sure that the IR LED is off too (since the PWM may have
// been stopped while the LED is on!)
digitalWrite(IRLED, LOW);
// Now we wait for the specified 'off' time
delay_ten_us(offtime);
}
uint8_t bitsleft_r = 0;
uint8_t bits_r=0;
PGM_P code_ptr;
// we cant read more than 8 bits at a time so dont try!
uint8_t read_bits(uint8_t count)
{
uint8_t i;
uint8_t tmp=0;
// we need to read back count bytes
for (i=0; i<count; i++) {
// check if the 8-bit buffer we have has run out
if (bitsleft_r == 0) {
// in which case we read a new byte in
bits_r = pgm_read_byte(code_ptr++);
// and reset the buffer size (8 bites in a byte)
bitsleft_r = 8;
}
// remove one bit
bitsleft_r--;
// and shift it off of the end of 'bits_r'
tmp |= (((bits_r >> (bitsleft_r)) & 1) << (count-1-i));
}
// return the selected bits in the LSB part of tmp
return tmp;
}
uint16_t ontime, offtime;
uint8_t i,num_codes, Loop;
uint8_t region;
uint8_t startOver;
#define FALSE 0
#define TRUE 1
void setup() {
Serial.begin(9600);
TCCR2A = 0;
TCCR2B = 0;
digitalWrite(LED, LOW);
digitalWrite(IRLED, LOW);
digitalWrite(DBG, LOW); // debug
pinMode(LED, OUTPUT);
pinMode(IRLED, OUTPUT);
pinMode(DBG, OUTPUT); // debug
pinMode(REGIONSWITCH, INPUT);
pinMode(TRIGGER, INPUT);
digitalWrite(REGIONSWITCH, HIGH); //Pull-up
digitalWrite(TRIGGER, HIGH);
delay_ten_us(5000); // Let everything settle for a bit
// determine region
if (digitalRead(REGIONSWITCH)) {
region = NA;
DEBUGP(putstring_nl("NA"));
}
else {
region = EU;
DEBUGP(putstring_nl("EU"));
}
// Indicate how big our database is
DEBUGP(putstring("\n\rNA Codesize: ");
putnum_ud(num_NAcodes);
);
DEBUGP(putstring("\n\rEU Codesize: ");
putnum_ud(num_EUcodes);
);
// Tell the user what region we're in - 3 flashes is NA, 6 is EU
delay_ten_us(65500); // wait maxtime
delay_ten_us(65500); // wait maxtime
delay_ten_us(65500); // wait maxtime
delay_ten_us(65500); // wait maxtime
quickflashLEDx(3);
if (region == EU) {
quickflashLEDx(3);
}
}
void sendAllCodes() {
Start_transmission:
// startOver will become TRUE if the user pushes the Trigger button while transmitting the sequence of all codes
startOver = FALSE;
// determine region from REGIONSWITCH: 1 = NA, 0 = EU
if (digitalRead(REGIONSWITCH)) {
region = NA;
num_codes = num_NAcodes;
}
else {
region = EU;
num_codes = num_EUcodes;
}
// for every POWER code in our collection
for (i=0 ; i < num_codes; i++) {
PGM_P data_ptr;
// print out the code # we are about to transmit
DEBUGP(putstring("\n\r\n\rCode #: ");
putnum_ud(i));
// point to next POWER code, from the right database
if (region == NA) {
data_ptr = (PGM_P)pgm_read_word(NApowerCodes+i);
}
else {
data_ptr = (PGM_P)pgm_read_word(EUpowerCodes+i);
}
// print out the address in ROM memory we're reading
DEBUGP(putstring("\n\rAddr: ");
putnum_uh((uint16_t)data_ptr));
// Read the carrier frequency from the first byte of code structure
const uint8_t freq = pgm_read_byte(data_ptr++);
// set OCR for Timer1 to output this POWER code's carrier frequency
OCR2A = freq;
OCR2B = freq / 3; // 33% duty cycle
// Print out the frequency of the carrier and the PWM settings
DEBUGP(putstring("\n\rOCR1: ");
putnum_ud(freq);
);
DEBUGP(uint16_t x = (freq+1) * 2;
putstring("\n\rFreq: ");
putnum_ud(F_CPU/x);
);
// Get the number of pairs, the second byte from the code struct
const uint8_t numpairs = pgm_read_byte(data_ptr++);
DEBUGP(putstring("\n\rOn/off pairs: ");
putnum_ud(numpairs));
const uint8_t bitcompression = pgm_read_byte(data_ptr++);
DEBUGP(putstring("\n\rCompression: ");
putnum_ud(bitcompression);
putstring("\n\r"));
PGM_P time_ptr = (PGM_P)pgm_read_word(data_ptr);
data_ptr+=2;
code_ptr = (PGM_P)pgm_read_word(data_ptr);
#if 0
for (uint8_t k=0; k<numpairs; k++) {
uint8_t ti;
ti = (read_bits(bitcompression)) * 4;
ontime = pgm_read_word(time_ptr+ti);
offtime = pgm_read_word(time_ptr+ti+2);
DEBUGP(putstring("\n\rti = ");
putnum_ud(ti>>2);
putstring("\tPair = ");
putnum_ud(ontime));
DEBUGP(putstring("\t");
putnum_ud(offtime));
}
continue;
#endif
cli();
for (uint8_t k=0; k<numpairs; k++) {
uint16_t ti;
ti = (read_bits(bitcompression)) * 4;
ontime = pgm_read_word(time_ptr+ti); // read word 1 - ontime
offtime = pgm_read_word(time_ptr+ti+2); // read word 2 - offtime
// transmit this codeElement (ontime and offtime)
xmitCodeElement(ontime, offtime, (freq!=0));
}
sei();
//Flush remaining bits, so that next code starts
//with a fresh set of 8 bits.
bitsleft_r=0;
// delay 205 milliseconds before transmitting next POWER code
delay_ten_us(20500);
// visible indication that a code has been output.
quickflashLED();
// if user is pushing Trigger button, stop transmission
if (digitalRead(TRIGGER) == 0) {
startOver = TRUE;
break;
}
}
if (startOver) goto Start_transmission;
while (Loop == 1);
// flash the visible LED on PB0 8 times to indicate that we're done
delay_ten_us(65500); // wait maxtime
delay_ten_us(65500); // wait maxtime
quickflashLEDx(8);
}
void loop() {
sleepNow();
// if the user pushes the Trigger button and lets go, then start transmission of all POWER codes
if (digitalRead(TRIGGER) == 0) {
delay_ten_us(3000); // delay 30ms
if (digitalRead(TRIGGER) == 1) {
sendAllCodes();
}
}
}
void delay_ten_us(uint16_t us) {
uint8_t timer;
while (us != 0) {
for (timer=0; timer <= DELAY_CNT; timer++) {
NOP;
NOP;
}
NOP;
us--;
}
}
void quickflashLED( void ) {
digitalWrite(LED, HIGH);
delay_ten_us(3000); // 30 millisec delay
digitalWrite(LED, LOW);
}
void quickflashLEDx( uint8_t x ) {
quickflashLED();
while(--x) {
delay_ten_us(15000); // 150 millisec delay between flahes
quickflashLED();
}
}