Go Down

Topic: Arduino due / ppm (Read 3566 times) previous topic - next topic


Ok, you really wants the same code back? Please test it, i dont have an Due now. But hope this problem isnt one, when i have my own.
Get the Lib from ivanseidel/DueTimer
and test this:

Code: [Select]
#include <DueTimer.h>

#define chanel_number 8
#define default_servo_value 1500
#define PPM_FrLen 22500
#define PPM_PulseLen 300
#define sigPin 10
#define onState 1

int ppm[chanel_number];

void doit(){
  static boolean state = true;
    digitalWrite(sigPin, onState);
    state = false;
  } else {
    static byte cur_chan_numb;
    static unsigned int calc_rest;
    digitalWrite(sigPin, !onState);
    state = true;
    if(cur_chan_numb >= chanel_number){
      cur_chan_numb = 0;
      calc_rest = calc_rest + PPM_PulseLen;
      Timer3.attachInterrupt(doit).setPeriod(PPM_FrLen - calc_rest);
      calc_rest = 0;
    } else {
      Timer3.attachInterrupt(doit).setPeriod(ppm[cur_chan_numb] - PPM_PulseLen);
      calc_rest = calc_rest + ppm[cur_chan_numb];

void setup(){
  for (int i = 0; i < chanel_number; i++){
    ppm[i] = default_servo_value;
  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, !onState);

void loop(){
  while(1){ }


Dec 12, 2013, 02:57 am Last Edit: Dec 12, 2013, 03:03 am by Francois Reason: 1
Thank you very much for your help, I will be able to check the code on Friday (I do not have an osciloscope at home  =( ).

Here is what i would like to learn to do on the arduino due ( in green is the equivalent code for the arduino uno):

1. Setup a timer on the due & Start a timer  
 TCCR1A = 0;                        // set entire TCCR1 register to 0
 TCCR1B = 0;
 OCR1A = 100;                     // compare match register
 TCCR1B |= (1 << WGM12);   // turn on CTC mode
 TIMSK1 |= (1 << OCIE1A);    // enable timer compare interrupt

2. Set a presacaler
  TCCR1B |= (1 << CS11);    // 8 prescaler: 0,5 microseconds at 16mhz

3. Change the match register (trigger)
  OCR1A = XXX // what every value i decide

4. Run into a loop every time the match register is reached
  ISR(TIMER1_COMPA_vect){ code }

Is it possible to do ?


Dec 12, 2013, 10:01 am Last Edit: Dec 12, 2013, 10:03 am by Sijjim Reason: 1
First, if u have an other Arduino, i use this sketch on a Uno for fast bugfixing:

Code: [Select]
#define channumber 7 //How many channels have your radio?
int value[channumber];

void setup()
Serial.begin(57600); //Serial Begin
pinMode(3, INPUT); //Pin 3 as input
void loop()
while(pulseIn(3, LOW) < 5000){} //Wait for the beginning of the frame
// while(pulseIn(3, HIGH) < 5000){} //alt for invert signal
for(int x=0; x<=channumber-1; x++)//Loop to store all the channel position
value[x]=pulseIn(3, LOW);
// value[x]=pulseIn(3, HIGH); //alt for invert signal
for(int x=0; x<=channumber-1; x++)//Loop to print and clear all the channel readings
Serial.print(value[x]); //Print the value
Serial.print(" ");
value[x]=0; //Clear the value afeter is printed
Serial.println(""); //Start a new line

Just hang pin 3 from this one to ppm-out on Due an connect ground together.

and the other points, look to stimmers code too:

1. Setup a timer on the due & Start a timer  

Code: [Select]
REG_PIOB_PDR = 1<<25; // disable PIO, enable peripheral
 REG_PIOB_ABSR= 1<<25; // select peripheral B
 REG_TC0_WPMR=0x54494D00; // enable write to registers
//REG_TC0_CMR0=0b00000000000010011100010000000000; // set channel mode register (see datasheet)
 REG_TC0_CMR0=0b00000000000001101100010000000000; // alternative CMR for inverted output
 REG_TC0_RC0=100000000; // counter period
 REG_TC0_CCR0=0b101;    // start counter
 REG_TC0_IER0=0b00010000; // enable interrupt on counter=rc
 REG_TC0_IDR0=0b11101111; // disable other interrupts

2. Set a presacaler

not sure, think its inside this part, the TCCLKS, look in datasheet at page 869, Table 37-1 and page 904
Code: [Select]

3. Change the match register (trigger)

Code: [Select]

4. Run into a loop every time the match register is reached

Code: [Select]
void TC0_Handler() { code }


Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131