Go Down

Topic: raw pins (Read 1 time) previous topic - next topic


trying to convert this sketch over to attiny from arduino, however it uses raw pins and I am not quite sure how they work. Not sure if I need to convert them over to attiny or if attiny doesn't need raw pins. its basically a IR decoder here is the code:

Code: [Select]
/* 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.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

     // 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)) {
  // 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
     if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
  pulses[currentpulse][1] = lowpulse;

  // we read one high-low pulse successfully, continue!

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");
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF ");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    //Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION , DEC);
    Serial.print(pulses[i+1][0] * RESOLUTION , DEC);

  //Serial.print("\t"); // tab
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);


any ideas?
for(i = 0, i < 820480075, i++){ Design(); Code(); delay(1000); } // hellowoo.com


May 16, 2013, 09:25 pm Last Edit: May 16, 2013, 09:53 pm by SirNickity Reason: 1
It looks like you're already using direct I/O access according to the top defines and the "too slow" comment on the commented-out digitalRead call.  You just need to make sure you use the right PORTx and pin offsets.  See the io.h include for your specific device, and the datasheet pin definitions, for information on that.

Your bigger problem might be serial print if you're trying to move away from the Arduino library.  AVR libc does have some basic building blocks for this, but it's not quite as plug-n-play.  You can selectively include some of the Arduino/Wiring files if you're careful to resolve (or remove) any inter-dependencies.

Go Up