Pages: [1] 2   Go Down
Author Topic: Help with shift bits...  (Read 1814 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello.How work this?
Code:
#define IRpin_PIN      PIND
#define IRpin             2
 
//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH
 
     // count off another few microseconds
     highpulse++;
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This is from http://www.ladyada.net/learn/sensors/ir.html
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

West Des Moines, Iowa USA
Offline Offline
Sr. Member
****
Karma: 2
Posts: 428
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

1 is shifted left IRpin places. Since IRpin is defined to have a value of 2, the shifted value will be 4. That 4 will be ANDed with the value of IRpin_PIN and the result will be 4 if the corresponding bit of IRpin_PIN is also a 1, and otherwise will be zero.
Logged

There's always a better way!

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I can't understand how pin is still high ....the pulse is 01010101....38 KHz....?
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

The counter work when pin2 something there is ....the pulse?
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 602
Posts: 33371
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

post all you code not just a tiny bit of it.
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
/* Raw IR decoder sketch!
 
 This sketch/program uses the Arduno and a PNA4602 to
 decode IR received. This can be used to make a IR receiver
 (by looking for a particular code)
 or transmitter (by pulsing an IR LED at ~38KHz for the
 durations detected
 
 Code is public domain, check out www.ladyada.net and adafruit.com
 for more tutorials!
 */
 
// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN      PIND
#define IRpin          2
 
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
 
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20
 
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2];  // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
 
void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}
 
void loop(void) {
  uint16_t highpulse, lowpulse;  // temporary storage timing
  highpulse = lowpulse = 0; // start out with no pulse length
 
 
//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH
 
     // count off another few microseconds
     highpulse++;
     delayMicroseconds(RESOLUTION);
 
     // If the pulse is too long, we 'timed out' - either nothing
     // was received or the code is finished, so print what
     // we've grabbed so far, and then reset
     if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][0] = highpulse;
 
  // same as above
  while (! (IRpin_PIN & _BV(IRpin))) {
     // pin is still LOW
     lowpulse++;
     delayMicroseconds(RESOLUTION);
     if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  pulses[currentpulse][1] = lowpulse;
 
  // we read one high-low pulse successfully, continue!
  currentpulse++;
}
 
void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
}
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 602
Posts: 33371
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

So what sort of arduino do you have?
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino Duemilanove Mega328
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

If i remove delay from the code....i measurement the high pulse general or only the total time when the bit is 1 high for 13usecs (38KHz)?
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino work with 16MHz....every cycle is 62.5 nanoseconds....i could use this for more precision?
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 602
Posts: 33371
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Arduino Duemilanove Mega328
OK so the pin mapping is still valid.

Quote
If i remove delay from the code
You will measure the high period but it will not be easy to say what units they are in. At the moment the delay dominates the rest of the code and so you can just ignore what time it takes to do that and simply use the count times the delay to get your pulse width.

I am not sure what you are receiving, have you got a print out of the results this program gives. What are you expecting it to give?
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 175
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

toyotomi a/c on pulse with resolution 20usec

Ready to decode IR!



Received:

OFF    ON
45204 usec, 8940 usec
4420 usec, 760 usec
400 usec, 680 usec
420 usec, 680 usec
1500 usec, 680 usec
1520 usec, 700 usec
1500 usec, 680 usec
400 usec, 700 usec
400 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
400 usec, 680 usec
1500 usec, 700 usec
1500 usec, 680 usec
1500 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
400 usec, 680 usec
1500 usec, 700 usec
420 usec, 660 usec
440 usec, 680 usec
1500 usec, 680 usec
1500 usec, 700 usec
400 usec, 680 usec
1500 usec, 700 usec
400 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
1500 usec, 680 usec
400 usec, 700 usec
400 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
400 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
1500 usec, 680 usec
1520 usec, 660 usec
1500 usec, 720 usec
1500 usec, 680 usec
1500 usec, 680 usec
1500 usec, 700 usec
400 usec, 680 usec
440 usec, 660 usec
400 usec, 700 usec
400 usec, 680 usec
420 usec, 680 usec
400 usec, 700 usec
1500 usec, 680 usec
1520 usec, 660 usec
1520 usec, 700 usec
1500 usec, 680 usec
1500 usec, 680 usec
1500 usec, 700 usec
400 usec, 680 usec
440 usec, 660 usec
400 usec, 700 usec
400 usec, 680 usec
440 usec, 660 usec
400 usec, 700 usec
420 usec, 660 usec
420 usec, 680 usec
400 usec, 700 usec
1520 usec, 660 usec
400 usec, 700 usec
1520 usec, 660 usec
1520 usec, 680 usec
420 usec, 680 usec
1500 usec, 680 usec
420 usec, 500 usec

when i decrease resolution to 1 usec the time 400usec became 250usecs...

the toyotomi ok on
but i have another a/c united no work...
Logged

Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 602
Posts: 33371
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok so what is wrong with that information, it looks good to me. What are you expecting it to show you?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I used the same stuff on Sunday, didn't quite work out for me.. Here's what I ended up with:

It's not quite correct, but close enough (can resend IR signals from remote 95% of the time..)

Code:

/* Raw IR decoder sketch!
 
 This sketch/program uses the Arduno and a PNA4602 to
 decode IR received. This can be used to make a IR receiver
 (by looking for a particular code)
 or transmitter (by pulsing an IR LED at ~38KHz for the
 durations detected
 
 */
 
#define IRpin          2

#define irLed          9
 
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
 
// we will store up to 100 pulse pairs (this is -a lot-)
unsigned long pulses[100][2];  // pair is high and low pulse
int currentpulse = 0; // index for pulses we're storing

unsigned long time;
unsigned long timeCmp;

void setup(void) {
  Serial.begin(9600);
  
  pinMode(irLed, OUTPUT);
  delay(200);
  digitalWrite(irLed, LOW);
}

 
void loop() {
  
 if (currentpulse >= 100) {
       stopReading();
  }
 //Serial.println("Waiting for data!");
 // wait for data..
  while (currentpulse == 0 && digitalRead(IRpin) ) {
  
  }
 
  time = micros();
  while (!digitalRead(IRpin)) {
    // If the pulse is too long, we 'timed out' - either nothing
     // was received or the code is finished, so print what
     // we've grabbed so far, and then reset
     timeCmp = micros() - time;
     if (timeCmp > MAXPULSE) {
       stopReading();
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][0] = timeCmp;
 
  // same as above
  time = micros();
  while (digitalRead(IRpin)) {
     timeCmp = micros() - time;
     if (timeCmp > MAXPULSE) {
       stopReading();
       return;
     }
  }
  pulses[currentpulse][1] = timeCmp;
 
  // we read one high-low pulse successfully, continue!
  currentpulse++;
}

void stopReading() {
  if (currentpulse != 0) {
    printpulses();
    currentpulse=0;
  }
}

 
void printpulses(void) {

  
  // print it in a 'array' format
  Serial.print("int IRsignal[] = {");
  for (int i = 0; i <= currentpulse; i++) {

    Serial.print(pulses[i][0]);
    Serial.print(", ");
    Serial.print(pulses[i][1]);
    Serial.print(", ");
  }
 
  Serial.println("-1};");
  delay(1000);
  unsigned long now = micros();
 
  for (int i = 0; i < currentpulse; i++) {
    pulseIR(pulses[i][0]);
     delayMicroseconds(pulses[i][1] - 10);
  }
   now = (micros() - now);

 
  Serial.print("Sent stuff, took in ms ");
  Serial.println(now / 1000);
  
  unsigned long shouldTake = 0;
   for (int i = 0; i < currentpulse; i++) {
    shouldTake += (pulses[i][0] / 10);
    shouldTake += (pulses[i][1] / 10);
  }
   Serial.print("Should take in ms ");
  Serial.println(shouldTake / 100);
    Serial.println("");
}

void pulseIR(unsigned long microsecs) {
   if (!microsecs) { return; }
   unsigned long start = micros();
   digitalWrite(irLed, HIGH);  
  
      // 38 kHz is about 13 microseconds high and 13 microseconds low
   unsigned long cdiff = 0;
  while (micros() - start < microsecs) {
     digitalWrite(irLed, HIGH);
     cdiff += 13;
     while (micros() - start < cdiff);
    
     digitalWrite(irLed, LOW);  
      cdiff += 13;
     while (micros() - start < cdiff);
  
  }
}

void sendPulses(const int pulses[]) {
   int i = 0;
   while (pulses[i] > 0) {
  
    pulseIR(pulses[i++]);
    delayMicroseconds(pulses[i++] - 50);
  }
}
Logged

Pages: [1] 2   Go Up
Jump to: