Hi,
I'm trying to read this 3 channel magnetic sensor with a 10μm resolution :
https://www.willtec.de/media/pdf/04/9a/e5/LHR5_DB_20140811_DE_-37414.pdf
It works with this code:
const int A_PIN = 4;
const int B_PIN = 5;
byte a=0;
byte b=0;
byte last_a=0;
int a_counter=0;
int c=0;
void setup() {
Serial.begin(19200);
while (!Serial) continue;
Serial.println(F("Start"));
pinMode(A_PIN , INPUT);
pinMode(B_PIN , INPUT);
}
void loop() {
if(a!=last_a){
if(b!=a){
a_counter=a_counter-1;
}else{
a_counter=a_counter+1;
}
}
last_a=a;
a=digitalRead(A_PIN);
b=digitalRead(B_PIN);
if(c%32000==0){
Serial.println(a_counter);
c=0;
}
c=c+1;
}
But it works only when I move the sensor slowly. When I move the sensor faster, I lose a lot of pulses. With the display unit of willtec I don't lose steps with the same speed, so it can't be the sensor, or me moving the sensor too fast. I'm guessing the clock frequency of the nano is too low, or the script performes too bad.
For example, before I was doing a Serial.println for every loop and I had to move the sensor even slower to not lose pulses.
I'm happy for any help I can get.
Best regards
Daniel
horace
February 6, 2023, 4:08pm
2
what ardunino are you using?
upload a schematic showning how the encoder is connected and powered?
pylon
February 6, 2023, 4:15pm
3
A standard Arduino UNO will probably reach about the slowest read frequency of the table in the datasheet with above code. You can get higher frequencies by using direct register manipulations (digitalRead() makes a flash read to translate the pin number into the corresponding register). If you need even higher frequencies you can change to external interrupts but then you should change the input pins.
Thanks for your answers. I'm using an arduino nano. Powered by USB, A connected to Pin 4, B connected to Pin 5, A/,B/,Z,Z/ not connected. See schematic.
pylon, can you explain a little bit? I was reading the arduino uno/nano run on 16Mhz clockfrequency? Or does that not apply to digital read of inputs?
pylon
February 6, 2023, 5:51pm
5
16 MHz is the CPU clock. Every machine code instruction needs at least one CPU clock to execute, so reading an input pin (and doing something with that information) is much slower than the CPU clock.
As I wrote, digitalRead() isn't the fastest way to get the state of an I/O pin. What speed do you want to reach?
The easiest way to do this with an arduino is probably to map both input pins to interrupts and do the counting there. Probably using a Gray table to make sure you do the transitions right. Note that even then, a standard Nano will not be able to keep up with the higher pulse rates from your encoder. An ESP32 or a black pill (32-bit devices) should be able to.
I use the LS7366 encoder counter in an arduino Nano-based device that interfaces to encoders on high-speed motors and outputs Resolver signals (phase-shifted sine waves). It tops out at 40MHz, so it will have no problem managing the pulse rate from your encoder.
As I said before, a black pill should be fast enough. I only use the LS7366 because my product was already designed and working before I was asked to add reading encoders as an extra feature. Easier to add an extra chip than redesign the whole thing at that point!
Hi
run this simple code and you will see that just reading the ports takes 8 to 12 microseconds, which will greatly affect the higher speed performance of your sensor.
With times of 8 microseconds vice can theoretically read data of a maximum ~ 120Khz.
const int A_PIN = 4;
const int B_PIN = 5;
byte a = 0;
byte b = 0;
byte last_a = 0;
int a_counter = 0;
int c = 0;
void setup() {
Serial.begin(19200);
while (!Serial) continue;
Serial.println(F("Start"));
pinMode(A_PIN, INPUT);
pinMode(B_PIN, INPUT);
}
int timeSpend = 0;
int timeStart = 0;
void loop() {
timeStart = micros();
a = digitalRead(A_PIN);
b = digitalRead(B_PIN);
timeSpend = micros() - timeStart;
Serial.println(timeSpend);
delay(500);
}
Hi
If you want to use ESP32, it has integrated resources that can read up to 40Mhz, (Clock/2), such as the resource like
PULSE_CNT.
The problem is that while you can get the pulses that fast, it doesn't leave much time for anything else on a 16MHz arduino.
Hi again,
I'm trying to implement all the suggestions, so now I am now using a ESP32 Devkit C V4 with the following code (with interrupts and direct port manipulation):
#include <Arduino.h>
static int pinA = 35;
static int pinB = 34;
volatile byte aFlag = 0;
volatile byte bFlag = 0;
volatile byte encoderPos = 0;
volatile byte oldEncPos = 0;
volatile byte reading = 0;
void IRAM_ATTR PinA()
{
cli();
reading = GPIO_REG_READ(GPIO_IN1_REG) & 0xC;
if (reading == B1100 && aFlag)
{
encoderPos--;
bFlag = 0;
aFlag = 0;
}
else if (reading == B1000)
bFlag = 1;
sei();
}
void IRAM_ATTR PinB()
{
cli();
reading = GPIO_REG_READ(GPIO_IN1_REG) & 0xC;
if (reading == B1100 && bFlag)
{
encoderPos++;
bFlag = 0;
aFlag = 0;
}
else if (reading == B100)
aFlag = 1;
sei();
}
void setup()
{
Serial.begin(115200);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
attachInterrupt(digitalPinToInterrupt(pinA), PinA, RISING);
attachInterrupt(digitalPinToInterrupt(pinB), PinB, RISING);
}
void loop()
{
if (oldEncPos != encoderPos)
{
Serial.print("encoderPos: ");
Serial.println(encoderPos);
oldEncPos = encoderPos;
}
}
As soon as I move the sensor and the interrupt happens I get the following error:
16:42:29.675 -> ets Jul 29 2019 12:21:46
16:42:29.675 ->
16:42:29.675 -> rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:42:29.675 -> configsip: 0, SPIWP:0xee
16:42:29.675 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:42:29.675 -> mode:DIO, clock div:1
16:42:29.675 -> load:0x3fff0030,len:1344
16:42:29.675 -> load:0x40078000,len:13836
16:42:29.675 -> load:0x40080400,len:3608
16:42:29.675 -> entry 0x400805f0
16:42:29.816 -> encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0encoderPos: 0enco
16:42:30.992 -> assert failed: spinlock_acquire spinlock.h:122 (result == core_id || result == SPINLOCK_FREE)
Anyone has an idea what's going wrong?
hi
you have defined "reading" as byte but test
the B1000?
What is B1000?
HEX = 0xB1000;
Number = notB;
String="B1000".
volatile byte reading = 0;
...........
else if (reading == B1000)
And what is 0xC here?
GPIO_REG_READ(GPIO_IN1_REG) & 0xC;
This kind of error may be power quality problem.
Brownout detector was triggered
And the answer is poor power source or bad quality USB cable.
pylon
February 13, 2023, 7:00pm
13
ruilviana:
What is B1000?
I guess that should be a binary literal, but binary literals a defined like this in C++:
0b1000
ruilviana:
And what is 0xC here?
That's a correct hexadecimal literal.
Ok,
I didn't question the syntax, but what the meaning of this value is.
Because of the "and" of GPIO_REG_READ(GPIO_IN1_REG) with 0xC;
pylon
February 13, 2023, 7:26pm
15
That way the code masks the two bits 2 and 3 because OP is only interested in these two bits of the hardware register.
Thanks for your answers. The script is from this stackoverflow thread which I found while researching on how to implement interrupts/direct port manipulation.
https://stackoverflow.com/questions/53802457/adapting-this-arduino-instructable-to-esp32
The script is explained there pretty well. Because it's basically my script for an ESP32 with interrupts and direct port registration, I thought I use it as is. Maybe it's important: I use 10kOhm resistors as pullups. Tomorrow I will additionally power the ESP32 from an external power supply to rule out the power source issue and report back.
Okay, I additionally powered the ESP32 by a 5V 2A power supply now. No difference.
Then I tried to remove everything from the interrupt functions.
With empty interrupt functions everything worked (Who would have guessed ).
But as soon as I added the clear interrupt (cli()) and set interrupt (sei()) I got the error again. So I only removed the cli and sei functions and now everything seems to work.
Anyone has an idea why that's happening and if I have to fear any malfunctions from not setting the interrupt flags?
pylon
February 16, 2023, 4:35pm
18
Globally disabling interrupts and then enabling all again inside an ISR isn't a good idea. Usually you shouldn't touch such flags while the interrupt is handled.
system
Closed
August 15, 2023, 4:35pm
19
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.