(SOLVED) PPM Signal With Pure AVR Interrupts

Hi,

I’m trying to read a ppm signal from RC receiver usig Arduino Uno (pro mini) and *pure AVR code.

The problem I have is if I use ISR(INT0_vect) or ISR(INT1_vect) some times the Arduino just resets.

In the other hand, when I try to use PCINT0 (pin digital 8 ) it seems that works fine, but with PCINT4 all that I get are resets.

Setup for INT0

void setup()
{
  Serial.begin(115200);
  Serial.flush();
  Serial.println("Ready");

  DDRD = 0; //PIN INPUT

  EICRA |= (1 << ISC00);    // Set INT0 on ANY CHANGE
  EIMSK |= (1 << INT0);     // Turns on INT0

  TCCR1A = 0;  //Set Timer1 to 0
  TCCR1B = 0;

  TCCR1B |= (1 << CS11);  //Set pres-scaler to 8 (0,5us)
}

Setup for PCINT0

void setup()
{
  Serial.begin(115200);
  Serial.flush();
  Serial.println("Ready");

  DDRD = 0; //PIN INPUT

  PCICR |= (1 << PCIE0);     // Set PCINT0 on ANY CHANGE
  PCMSK0 |= (1 << PCINT0);   // Turns on PCINT0 (PIN 8)

  TCCR1A = 0;  //Set Timer1 to 0
  TCCR1B = 0;

  TCCR1B |= (1 << CS11);  //Set pres-scaler to 8 (0,5us)
}

Setup for PCINT4

void setup()
{
  Serial.begin(115200);
  Serial.flush();
  Serial.println("Ready");

  DDRD = 0; //PIN INPUT

  PCICR |= (1 << PCIE0);    // Set PCINT4 on ANY CHANGE
  PCMSK0 |= (1 << PCINT4);  // Turns on PCINT4 (PIN 12)

  TCCR1A = 0;  //Set Timer1 to 0
  TCCR1B = 0;

  TCCR1B |= (1 << CS11);  //Set pres-scaler to 8 (0,5us)
}

The code from interrupt is the same for all cases

//ISR(INT0_vect)
//ISR(PCINT0_vect)
ISR(PCINT4_vect)
{
  static unsigned int pulse;
  static unsigned long counter;
  static byte chann;

  counter = TCNT1;
  TCNT1 = 0;

  if (counter < 1020 ) //1020
  {
    //must be a pulse if less than 710us
    pulse = counter;
  }
  else if (counter > 3820) //3820
  {
    //Sync pulses over 1910us
    chann = 0;
  }
  else
  {
    channel[chann] = (counter + pulse) / 2;
    chann++;
  }
}

void loop()
{
  int count;

  while (channel[count] != 0)
  {
    Serial.print(channel[count]);
    Serial.print("  ");
    count++;
  }
  Serial.println("");
  delay(100);
}

Output:

INT0:

Ready

1589  1447  1143  1696  610  597  2163  1122  1655  
1602  1458  1528  1682  926  576  1916  721  1667  
1627  1434  1179  1348  614  938  5918  737  10758  
1569  1415  1521  1737  959  613  4103  778  3699  
1576  990  1541  1337  945  942  1642  1132  12679 
...

Sometimes I get a bad value with holding stick in same position (look first column, channel 1)
and after a while I get ¿more channels?

960  1060  1496  1063  919  936  2306  718  1281  1  3328  1  -6144  3  
609  1401  1489  990  963  1156  4161  1133  -27539  
924  1410  1493  1405  966  957  1828  1138  1635  
912  1421  1493  1431  956  1164  5927  1148  10996  
946  1426  1167  1042  937  941  4392  1168  3717  
936  1414  1479  1017  932  1161  1306  811  13050  
608  1412  1480  1384  964  785  4631  1135  -27142  
533  1422  1537  1037  609  938  2158  1132  -1542  
948  1138  1064  614  927  952  11362  1127  10855  1  3328  1  -6144  3  
539  1417  1520  1418  606  619  4359  1124  3690  1  3328  1  -6144  3  
556  1431  1499  1384  936  937  6956  740  29546  1  3328  1  -6144  3  
947  1417  1490  1377  930  941  10061  712  -10390  1  3328  1  -6144  3  
961  1450  1166  1379  934  928  2168  1138  1676  1  3328  1  -6144  3  
946  1426  1168  615  926  1118  5389  1120  11018  1  3328  1  -6144  3

(the good value of first column is ~950)

I assume that all these issues are clock/timing problems, maybe?

PCINT4:

Ready

Rea

ŠRead€Read€Ready Re 
(infinite text of this)

Why on PCINT4 the Arduino Uno resets?

Thank you.

Please post all your code.

http://snippets-r-us.com/

Your declaration for "channel" looks relevant to me.

PCINT4

#define multiplier (F_CPU/8000000)  

int channel[6];  //Array for signals

void setup()
{
  Serial.begin(115200);
  Serial.flush();
  Serial.println("Ready");

  DDRD = 0; //PIN INPUT

  PCICR |= (1 << PCIE0);    // Set PCINT4 on ANY CHANGE
  PCMSK0 |= (1 << PCINT4);  // Turns on PCINT4 (PIN 12)

  TCCR1A = 0;  //Set Timer1 to 0
  TCCR1B = 0;

  TCCR1B |= (1 << CS11);  //Set pres-scaler to 8 (0,5us)
}

ISR(PCINT4_vect)
{
  static unsigned int pulse;
  static unsigned long counter;
  static byte chann;

  counter = TCNT1;
  TCNT1 = 0;

  if (counter < 1020 ) //1020
  {
    //must be a pulse if less than 710us
    pulse = counter;
  }
  else if (counter > 3820) //3820
  {
    //Sync pulses over 1910us
    chann = 0;
  }
  else
  {
    channel[chann] = (counter + pulse) / 2;
    chann++;
  }
}

void loop()
{
  int count;

  while (channel[count] != 0)
  {
    Serial.print(channel[count]);
    Serial.print("  ");
    count++;
  }
  Serial.println("");
  delay(100);
}

Uhm ok, I think PCINT4 doesnt exists.

The ISR(INT1_vect) trigger on every pin change of this port (pins D0 to D7)

So I need to mask to see what pin has triggered.

Still having problem.

#define multiplier (F_CPU/8000000)  //leave this alone

volatile int channel[6];  //array for storing up to 16 servo signals
volatile unsigned int lastPortB = 0xFF;

void setup()
{
  Serial.begin(115200);
  Serial.flush();
  Serial.println("Ready");

  cli();
  
  DDRB |= (0 << DDB4);     // PB4 (PCINT4 pin) is now inputs (not neccesary)

  PORTB |= ((1 << PORTB4)); // Turn On the Pull-up (recommendable)
    
  PCICR |= (1 << PCIE0);    // Set PCINT4 on ANY CHANGE
  PCMSK0 |= (1 << PCINT4);  // Turns on PCINT4 (PIN 12)

  TCCR1A = 0;  //Set Timer1 to 0
  TCCR1B = 0;

  TCCR1B |= (1 << CS11);  //Set pres-scaler to 8 (0,5us)
  
  sei();
}

ISR(PCINT0_vect)
{
  static unsigned int pulse;
  static unsigned long counter;
  static byte chann;

  unsigned int changedBits = PINB ^ lastPortB;
  lastPortB = PINB;

  counter = TCNT1;
  TCNT1 = 0;

  if(changedBits & (1 << PB4))
  {
    if (counter < 1020 ) //1020
    {
      //must be a pulse if less than 710us
      pulse = counter;
    }
    else if (counter > 3820) //3820
    {
      //Sync pulses over 1910us
      chann = 0;
    }
    else
    {
      channel[chann] = (counter + pulse) / 2;
      chann++;
    }
  }
}

void loop()
{
  int count;

  while (channel[count] != 0)
  {
    Serial.print(channel[count]);
    Serial.print("  ");
    count++;
  }
  Serial.println("");
  delay(100);
}

Output

13423  -23330  32594  32620  -17543  -2707  -11265  30699  16255  -16883  20355  -4130  -8233  -24981  -6308  31273  22861  -17649  -2718  -5649  -8520  11847  -24865  -6861  18170  28594  1991  29670  995  -422  17822  24506  15327  30363  7915  -25921  21997  -7458  -18529  31682  -18433  -4133  30479  -7338  -2689  -16706  -11525  -8346  -4650  15902  28671  -26213  -25494  -15745  -3513  2683  15071  -30249  -19889  12895  16615  15093  -26644  -55  -24723  -6343  -24406  -27249  -17922  21359  -8785  -47  -333  -12241  -6963  -8348  2437  -21039  23835  -26937  -2895  -22977  -2700  -589  31030  -8594  -25177  -1113  20895  19823  -16441  14265  -18350  -3973  -6666  -28952  31476  -25859  -14849  23389  -9401  -46Ready
13423  -23330  32594  32620  -17543  -2707  -11265  30699  16255  -16883  20355  -4130  -8233  -24981  -6308  31273  22861  -17649  -2718  -5649  -8520  11847  -24865  -6861  18170  28594  1991  29670  995  -422  17822  24506  15327  30363  7915  -25921  21997  -7458  -18529  31682  -18433  -4133  30479  -7338  -2689  -16706  -11525  -8346  -4650  15902  28671  -26213  -25494  -15745  -3513  2683  15071  -30249  -19889  12895  16615  15093  -26644  -55  -24723  -6343  -24406  -27249  -17922  21359  -8785  -47  -333  -12241  -6963  -8348  2437  -21039  23835  -26937  -2895  -22977  -2700  -589  31030  -8594  -25177  -1113  20895  19823  -16441  14265  -18350  -3973  -6666  -28952  31476  -25859  -14849  23389  -9401  -4610  -18645  14312  -20486  -22709  -594  -10369  -217  -14341  -28946  -5186  30695  1374  5326  -14429  -513  32735  -16875  -17609  12622  -4209  -11378  -23  28154  -1199  -29081  5983  -16465  -6221  -26001  28334  -31507  -19461  -8323  30679  25261  -31564  -2593  28001  -497  24511  22927  -19913  30584  -25105  -22345  24575  22653  -25473  -24838  -2990  -30033  -4154  -18881  -4908  26287  -7969  -5484  -8091  -4289  -2345  -2583  -1192  -14353  -1745  32162  -13957  -2706  -6148  -16690  8171  17943  -10546  -5302  -16643  -29443  -20081  -20531  10020  11103  -6505  -19591  2884  -20625  -24965  -1441  -8582  -22193  31369  -7457  29977  -15381  -777  22711  -10384  32508  29725  15325  30495  32351  -705  20383  -25387  -21073  5177  6752  -2041  -21961  -322  -1839  -1196  -1027  -30038  32762  -2869  14195  -10529  -6249  -8453  -261  3439  -1327  -16709  -18955  10093  -12066  -24277  9451  25080  18911  -20500  -385  -5346  -9155  -2860  -28546  17405  12111  32486  -18946  -9732  -23556  32511  15295  -15863  32497  -949  -17923  -8216  -17053  -20602  24535  16167  -1542  -409  31163  5486  -28175  553  -4164  -8961  23966  -12611  -2051  -27962  31167  24476  -15053  24172  -12320  -5133  -4401  -3334  30069  32597  -23893  -14357  5785  -4297  -18051  -4248  -15322  19492  -23566  32191  -1065  -19498  20451  -9921  31615  -135  32759  -29749  22391  28572  30197  -3747  -5249  -24612  25791  14102  -8706  13063  21607  -12316  -23298  -18896  14859  -25017  -20791  -27834  -7970  31818  -2861  15378  15125  -16441  -21793  -11265  10981  -13527  -6091  -9873  -12545  18552  -28178  -313  16359  -6405  22002  32613  31738  -114  -153  -25794  -8482  -3228  29919  -17266  31678  -2338  -12677  -25867  -601  -28439  -8311  15347  8183  -15409  6543  30207  -18177  -12017  -25780  -11633  -1285  27542  -14008  -13328  24572  16331  -25090  -6859  -5653  28631  -12097  26175  -1621  19043  28925  26174  -21253  -2689  28667  -16682  23547  -10045  -7449  -16562  -1553  -18851  -29348  -12293  -651  31412  3455  -1250  32551  -19114  -21697  6634  22422  -8863  19070  24687  21229  -16650  15237  -21841  -4619  7935  29604  -10833  12262  -22538  3565  10196  1866  21471  -28605  -13574  5337  1016  381  312  7736  2079  820  381  312  3896  2070  48  2  8960  163  -27902  -16376  -9208  14337  14337  1540  -13816  -6392  14337  266  -25084  -8803  31235  31235  32003  32003  14337  14337  12078  8193  512  
Ready
13423  -23330  32594  32620  -17543  -2707  -11265  30699  16255  -16883  20355  -4130  -8233  -24981  -6308  31273  22861  -17649  -2718  -5649  -8520  11847  -24865  -6861  18170  28594  1991  29670  995  -422  17822  24506  15327  30363  7915  -25921  21997  -7458  -18529  31682  -18433  -4133  30479  -7338  -2689  -16706  -11525  -8346  -4650  15902  28671  -26213  -25494  -15745  -3513  2683  15071  -30249  -19889  12895  16615  15093  -26644  -55  -24723  -6343  -24406  -27249  -17922  21359  -8785  -47  -333  -12241  -6963  -8348  2437  -21039  23835  -26937  -2895  -22977  -2700  -589  31030  -8594  -25177  -1113  20895  19823  -16441  14265  -18350  -3973  -6666  -28952  31476  -25859  -14849  23389  -9401  -4610  -18645  14312  -20486  -22709  -594  -10369  -217  -14341  -28946  -5186  30695  1374  5326  -14429  -513  32735  -16875  -17609  12622  -4209  -11378  -23  28154  -1199  -29081  5983  -16465  -6221  -26001  28334  -31507  -19461  -8323  30679  25261  -31564  -2593  28001  -497  24511  22927  -19913  30584  -25105  -22345  24575  22653  -25473  -24838  -2990  -30033  -4154  -18881  -4908  26287  -7969  -5484  -8091  -4289  -2345  -2583  -1192  -14353  -1745  32162  -13957  -2706  -6148  -16690  8171  17943  -10546  -5302  -16643  -29443  -20081  -20531  10020  11103  -6505  -19591  2884  -20625  -24965  -1441  -8582  -22193  31369  -7457  29977  -15381  -777  22711  -10384  32508  29725  15325  30495  32351  -705  20383  -25387  -21073  5177  6752  -2041  -21961  -322  -1839  -1196  -1027  -30038  32762  -2869  14195  -10529  -6249  -8453  -261  3439  -1327  -16709  -18955  10093  -12066  -24277  9451  25080  18911  -20500  -385  -5346  -9155  -2860  -28546  17405  12111  32486  -18946  -9732  -23556  32511  15295  -15863  32497  -949  -17923  -8216  -17053  -20602  24535  16167  -1542  -409  31163  5486  -28175  553  -4164  -8961  23966  -12611  -2051  -27962  31167  24476  -15053  24172  -12320  -5133  -4401  -3334  30069  32597  -23893  -14357  5785  -4297  -18051  -4248  -15322  19492  -23566  32191  -1065  -19498  20451  -9921  31615  -135  32759  -29749  22391  28572  30197  -3747  -5249  -24612  25791  14102  -8706  13063  21607  -12316  -23298  -18896  14859  -25017  -20791  -27834  -7970  31818  -2861  15378  15125  -16441  -21793  -11265  10981  -13527  -6091  -9873  -12545  18552  -28178  -313  16359  -6405  22002  32613  31738  -114  -153  -25794  -8482  -3228  29919  -17266  31678  -2338  -12677  -25867  -601  -28439  -8311  15347  8183  -15409  6543  30207  -18177  -12017  -25780  -11633  -1285  27542  -14008  -13328  24572  16331  -25090  -6859  -5653  28631  -12097  26175  -1621  19043  28925  26174  -21253  -2689  28667  -16682  23547  -10045  -7449  -16562  -1553  -18851  -29348  -12293  -651  31412  3455  -1250  32551  -19114  -21697  6634  22422  -8863  19070  24687  21229  -16650  15237  -21841  -4619  7935  29604  -10833  12262  -22538  3565  10196  1866  21471  -28605  -13574  5337  1016  381  312  7736  2079  820  381  312  3896  2070  48  2  8960  163  -27134  -16376  -9208  14337  14337  1540  -13816  -6392  14337  266  -25084  -8803  31235  31235  32003  32003  14337  14337  12078  8193  512  
13423

Any idea?
Why Arduino resets?

Thanks

In loop(), it looks like you keep indexing channel until you reach a zero value. What if all the values in channel are non-zero? Don't you then take a waltz through memory?

Eh eh, good idea :stuck_out_tongue:

I change loop for

void loop()
{
  int count;

  for(int i = 0; i < 6; i++)
  {
    Serial.print(channel[count]);
    Serial.print("  ");
    count++;
  }
  Serial.println("");
  delay(100);
}

Now the output is:

Ready
0  0  0  0  0  0  
1315  1536  1420  931  931  944  
1767  1406  1497  1436  961  953  
1792  1410  1489  1394  958  1139  
1784  1392  1487  1403  958  959  
1804  1403  1479  1382  1160  939  
1837  1444  1511  1393  929  927  
1819  1409  1471  1378  931  1120  
1805  1400  1479  1384  934  926  
Ready
0  0  0  0  0  0  
1799  1445  1524  1390  931  925  
Ready
0  0  0  0  0  0  
1845  1426  1496  1392  923  931  
1781  1415  1491  1431  947  936  
Ready
0  0  0  0  0  0  
1809  1409  1486  1378  934  934  
1799  1392  1484  1400  957  1121  
1820  1420  1471  1402  932  927  
1780  1417  1520  1413  930  931  
1794  1439  1524  1408  925  927  
Ready
0  0  0  0  0  0  
1846  1438  1490  1378  913  932  
1842  1444  1516  1409  939  927  
1781  1420  1520  1426  936  937  
1845  1427  1500  1384  929  1123  
1805  1450  1508  1402  919  924  
1830  1443  1503  1391  933  937  
1833  1592  1403  930  915  1108  
1822  1425  1488  1386  935  938  
1812  1399  1485  1388  945  1163  
1803  1440  1531  1415  928  914  
1822  1408  1480  1394  913  1132  
1802  1436  1489  1377  908  938  
1836  1424  1493  1371  931  941  
1813  1405  1471  1395  931  1150  
1783  1436  1520  1407  938  928  
1836  1418  1476  1385  920  914  
1819  1404  1479  1385  943  1117  
1840  1439  1487  1380  937  929  
1823  1420  1473  1375  918  934  
1815  1437  1488  928  935  1114  
1800  1400  1480  1393  966  1141  
1779  1402  1495  1406  950  953  
1762  1406  1389  1148  1134  920

The values are good (more or less)… But why resets?

Maybe your ISR has a similar problem. Variable chann is declared as static. Did you intend to initialize it each time you call the ISR? Because a static won't be.

Ok,

I secure the code with

  if(changedBits & (1 << PB4))
  {
    if (counter < 1020 ) //1020
    {
      //must be a pulse if less than 710us
      pulse = counter;
    }
    else if (counter > 3820) //3820
    {
      //Sync pulses over 1910us
      chann = 0;
    }
    else
    {
      [b]if(chann > 5) return;[/b]
      channel[chann] = (counter + pulse) / 2;
      chann++;
    }
  }

And now does not reboot…

So, the reboot was for write in not allowed memory or something like that?

Thank you very much aarg

Yes. You're welcome.