pulseIN() - converting the code to ATMEL STUDIO


hi,

i have been working on project arduino uno , have written of code in arduino ide. im in situation need move of code arduino's ide atmel studio. of function have figured out on how convert them etc.: direct port control , such. facing issue re-writing pulsein() function atmel studio. crucial part in project since need read on length of pulse width , act accordingly of length. length of signal needs returned in microseconds.

the chip working atxmega32e5. internal oscillator running @ 32mhz.

i have read forum , found pulsein() functions "guts" , tried re-write it.
so far take on trying convert pulsein():
code: [select]
#include <avr/io.h>

unsigned long rc_value;

void pulsein()
{
char rc_pin_state = (pind & (1<<pd2));

//timeout zone
unsigned long numloops = 0;
unsigned long maxloops = 500000;
unsigned long width = 0;
// wait previous pulse end
while ( rc_pin_state == 1)
{
rc_pin_state = (pind & (1<<pd2)); //keep reading pin until changes state
if (numloops++ == maxloops) break;
}
// wait pulse start
while (rc_pin_state == 0)
{
rc_pin_state = (pind & (1<<pd2)); //keep reading pin until changes state
if (numloops++ == maxloops) break;
}

// wait pulse stop @ here measuring pulse width = incrementing width value 1 each cycle. atmega328 1 micro second equal 16 cycles.
while (rc_pin_state == 1)
{
rc_pin_state = (pind & (1<<pd2));
if (numloops++ == maxloops) break;
width++;
}

rc_value = width/16;
}

int main(void)
{
ddrd = (0<<pd2); // port pd2 input rc signal
ddrd = (1<<pd3); // port , output led

//char rc_pin_state = (pind & (1<<pd2)); // read state of pin pd2 , put state variable

    while(1)
    {
      pulsein();
  if(rc_value > 1000 && rc_value < 1395)
  {
  portd = (1<<pd3); // turn led on
  }

    else if(rc_value > 1600 && rc_value < 2200)
{
portd = (0<<pd3); // turn led off
}
    }
}


and original pulsein() code:

code: [select]
unsigned long pulsein(uint8_t pin, uint8_t state, unsigned long timeout)
{
// cache port , bit of pin in order speed the
// pulse width measuring loop , achieve finer resolution.  calling
// digitalread() instead yields coarser resolution.
uint8_t bit = digitalpintobitmask(pin);
uint8_t port = digitalpintoport(pin);
uint8_t statemask = (state ? bit : 0);
unsigned long width = 0; // keep initialization out of time critical area

// convert timeout microseconds number of times through
// initial loop; takes 16 clock cycles per iteration.
unsigned long numloops = 0;
unsigned long maxloops = microsecondstoclockcycles(timeout) / 16;

// wait previous pulse end
while ((*portinputregister(port) & bit) == statemask)
if (numloops++ == maxloops)
return 0;

// wait pulse start
while ((*portinputregister(port) & bit) != statemask)
if (numloops++ == maxloops)
return 0;

// wait pulse stop
while ((*portinputregister(port) & bit) == statemask) {
if (numloops++ == maxloops)
return 0;
width++;
}

// convert reading microseconds. loop has been determined
// 20 clock cycles long , have 16 clocks between edge
// , start of loop. there error introduced by
// interrupt handlers.
return clockcyclestomicroseconds(width * 21 + 16);
}


please me correct code or rewrite pulsein() or explain me how it, since im new moving away comfortable arduino :)

thanks in advance guys!

i thought atmel studio supposed able compile , link arduino sketches without modifications. why can't that?


Arduino Forum > Using Arduino > Programming Questions > pulseIN() - converting the code to ATMEL STUDIO


arduino

Comments