<EnableInterrupt.h

Heb nog een vraagje probeer de code van ryanboland te gebruiken met de arduino mega
Deze werkt goed
Echter wat ik niet snap of misschien verkeerd zie is dat als er geen interrupt subroutine wordt aangeroepen (dus het signaal niet veranderd )
Gaat de code toch naar de void calc_ ch1
Heb dit getest dmv serial.print in de void de zetten
Of komt dit doordat het sigmaal van de rc ontvanger altijd iets fluctueert zoja hoe los ik dit op

#include <EnableInterrupt.h>

#define SERIAL_PORT_SPEED 9600
#define RC_NUM_CHANNELS  4

#define RC_CH1  0
#define RC_CH2  1
#define RC_CH3  2
#define RC_CH4  3

#define RC_CH1_INPUT  A8
#define RC_CH2_INPUT  A9
#define RC_CH3_INPUT  A10
#define RC_CH4_INPUT  A11

uint16_t rc_values[RC_NUM_CHANNELS];
uint32_t rc_start[RC_NUM_CHANNELS];
volatile uint16_t rc_shared[RC_NUM_CHANNELS];

void rc_read_values() {
  noInterrupts();
  memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared));
  interrupts();
}

void calc_input(uint8_t channel, uint8_t input_pin) {
  if (digitalRead(input_pin) == HIGH) {
    rc_start[channel] = micros();
  } else {
    uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]);
    rc_shared[channel] = rc_compare;
  }
}

void calc_ch1() { calc_input(RC_CH1, RC_CH1_INPUT); }
void calc_ch2() { calc_input(RC_CH2, RC_CH2_INPUT); }
void calc_ch3() { calc_input(RC_CH3, RC_CH3_INPUT); }
void calc_ch4() { calc_input(RC_CH4, RC_CH4_INPUT); }

void setup() {
  Serial.begin(SERIAL_PORT_SPEED);

  pinMode(RC_CH1_INPUT, INPUT);
  pinMode(RC_CH2_INPUT, INPUT);
  pinMode(RC_CH3_INPUT, INPUT);
  pinMode(RC_CH4_INPUT, INPUT);

  enableInterrupt(RC_CH1_INPUT, calc_ch1, CHANGE);
  enableInterrupt(RC_CH2_INPUT, calc_ch2, CHANGE);
  enableInterrupt(RC_CH3_INPUT, calc_ch3, CHANGE);
  enableInterrupt(RC_CH4_INPUT, calc_ch4, CHANGE);
}

void loop() {
  rc_read_values();

  Serial.print("CH1:"); Serial.print(rc_values[RC_CH1]); Serial.print("\t");
  Serial.print("CH2:"); Serial.print(rc_values[RC_CH2]); Serial.print("\t");
  Serial.print("CH3:"); Serial.print(rc_values[RC_CH3]); Serial.print("\t");
  Serial.print("CH4:"); Serial.println(rc_values[RC_CH4]);

  delay(200);
}

Kun je wat duidelijker zijn ?

Ik weet niet wat de code van ryanboland is. Misschien is dat deze: bolandrm (Ryan Boland) · GitHub, maar dan weet ik niet welke code je bedoelt. Kun je een link geven als je iets noemt ?

Het zou ook fijn zijn als je noemt welke "EnableInterrupt" library je gebruikt. Misschien heb je zomaar een willekeurige oude versie van internet geplukt.
In de "Bibliotheek Beheer" staat EnableInterrupt by Mike "GreyGnome" Schwager. Dus ik hoop maar dat je die hebt.

Het heet een "functie" en geen "void". Die "void" geeft alleen maar aan wat het type is van de return waarde. Als er geen return waarde is dan wordt "void" gebruikt.
Lees ook eens "Why do people complain when I call my functions voids?". Nick Gammon schrijft onder andere in zijn antwoord: "Think of the word function as being there in spirit".

Als een ingang los hangt, dan komt er ruis op. Dan wordt steeds de interrupt aangeroepen. Het signaal van de RC ontvanger mag niet zomaar fluctueren. Gaat de RC ontvanger misschien in standby-mode waarbij de uitgang losgelaten wordt ? Dat zou heel vreemd zijn. Misschien helpt een pullup of pulldown weerstand. Begin bijvoorbeeld met 10k.
Heb je de GNDs met elkaar verbonden ?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.