Go Down

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

Sijjim

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;
  if(state){
    digitalWrite(sigPin, onState);
    Timer3.attachInterrupt(doit).setPeriod(PPM_PulseLen);
    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];
      cur_chan_numb++;
    }
  }     
}

void setup(){
  for (int i = 0; i < chanel_number; i++){
    ppm[i] = default_servo_value;
  }
  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, !onState);
  Timer3.attachInterrupt(doit).start(1000);
}

void loop(){
  while(1){ }
}

Francois

#16
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  
  cli();
 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
 sei();


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 ?

Sijjim

#17
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:

Quote
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


Quote
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]
REG_TC0_CMR0=0b00000000000001101100010000000000;

Quote
3. Change the match register (trigger)

Code: [Select]
REG_TC0_RC0= XXX

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

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

greetings

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!

Arduino
via Egeo 16
Torino, 10131
Italy