Message |
|
I have no issues using 1.7 until you feel good about the next release. I'm sure you'll make it right and I really really really appreciate you owning the issue like this.
|
|
|
could you confirm if you can recreate it in a new project, or if it's specific to a project
You might have got this sorted now but I * think* it has something to do with what I click on before adding the item and how recently (and how often) I save.
-Intermittently if I click on a sub menu and then add an element it doesn't appear even though the ID goes up.
-Sometimes I can can successfully create the item and fill out the parameters BUT if I don't save right after I enter the parameters and then click on another menu item the parameters of item just created will revert back to their defaults and blow away the friendly name, callback function, etc.
We are also adding a save as button onto the toolbar, and a label on the root properties panel that shows you what directory the designer is working in
Excellent. I tend to use save as to fork a project or to backup/protect the original that was working. From there I feel safe to make changes that often break something else. I suck at rev control and documentation. I'm just starting to demystify git.
We are looking at reversing the open folder decision and going back to emf file opening
Thank heavens. I'm not going to pretend to understand the difference between a store version and a standalone or compiled version but whoever at MS decided to "make it easier" by not displaying the files with the appropriate extensions during an open file dialog broke away from like... 30 years of Windows use behavior... and probably has pathological issues.
We cannot offer this for free, we are already starting to struggle with the weight of people using the free version on the store
I think it's unreasonable to expect everything for free... but if the most recent free "App" version works poorly or inconsistently I think you will agree that it doesn't serve your brand very well. Can you make it easier on us both by providing a link to buy a single user version? This is one of things that if not listed or easy to buy... some people can be too afraid to ask. In my case I want a stable commercial product to build the framework for application that is not going to be commercialized. I'm not sure if it makes a difference but right now it's just me and another guy and I'd rather pay something for the software that comes with a tiny amount of time for support (like a half hour) and then pay for ongoing support of specific issues that are coming up related to my ongoing (and protracted) issues. Having said that I do have a number in mind but I want to know your number.
So I found your releases page on GitHub Can you tell me what your leaning towards as far as non-appstore version goes? If I install OpenJDK 11 and compile from source will I have more features than 1.5 without the 1.7.5 Appstore bugs?
|
|
|
Firstly, your sketch is reinitializing switches, which I imagine is being done by the code generator, this risks the whole thing being wrongly setup. Remove the direct initialisation in setup.
Line 111 -
switches.initialiseInterrupt(ioFrom8574(0x20, INTERRUPT_PIN_8574),true);
If switches doesn't need to be told to explicitly treat signals coming from this pin as interrupts and that they represent signals from an encoder over i2c then it must be these lines that designate interrupts using TaskManagerIO
taskManager.addInterrupt(ioExpander,ROTARY2_CLK,CHANGE);
taskManager.addInterrupt(ioExpander,ROTARY2_SW, FALLING);
taskManager.addInterrupt(ioExpander, ENABLE_DISABLE_BUTTON,FALLING);
Hopefully this is the way to think about it.
Next, as previously discussed, it is using two different IOexpander references to refer to the same 8574 device, and there could be other errors that I don't immediately see, but I'd start with those two.
Yes as previously discussed
//43
IoAbstractionRef ioExpander = ioFrom8574(0x20, INTERRUPT_PIN_8574)
//111
switches.initialiseInterrupt(ioFrom8574(0x20, INTERRUPT_PIN_8574),true)
Line 111 has no business being there and this important to remove. It's equally important to me that I now think I understand why
Further, you're adding switches before setupMenu() is called that does the switches initialization. Only ever call into switches after setupMenu has run. I'll make that clearer in the documentation.
Ah ha. Well... I'll be. I wouldn't have ever guessed this was important.
Documentation wise I think there are things that could be done that would have prevented someone admittedly inexperienced from having trouble. That isn't meant to be a criticism. No on one the planet knows these libraries better than you and that might make you too close to it to write documentation for plebs like me to understand. Each library is documented well on its own and there are many examples of how to use one with another. I just happened to want to use almost all of them on my first attempt and was cobbling together sections of code from different pages and in doing so initialising some things more than once, incorrectly, and in the wrong order. I'll keep and eye out for changes to documentations about what order things need to take place in just in case I can learn something else.
@davecc I can recognise that you've gone beyond what you think is appropriate for an issue being presented on this forum and the effort isn't unnoticed. I never feel entitled to free dev support so that makes me grateful for it. I'm one of those people whose feature set includes pervasive ambiguation when concepts are abstracted and specific use cases aren't explicit. I also seem to only learn from my own mistakes and tend to step in every mistake possible taking on projects above my skill level because my ambition outweighs my experience and wallet.
I just paid off an an invoice for dev work/hardware for November and December is a tough month for obvious reasons. I'm trying to get something that functions well enough so that I can send you complete source for evaluation of commercial support for bluetooth control because there's no chance I'm going to get that working. I'm looking forward to working with you in 2021. I'm going to read your new examples and hopefully you won't be hearing from me until next year.
|
|
|
I'm now able to see the 2nd encoder CLK and DT on the scope but the interrupt callbacks don't seem to run. I believe I needed to set the IOdevice pin modes to input. I might be misremembering something but recall reading that I might also need to write to them while they are set to be an input or input pullup(??)
I'm away from my machine but will try that later.
|
|
|
I see that in tcMenu.cpp this is how the encoder for the menu is setup
void MenuManager::initForEncoder(MenuRenderer* renderer, MenuItem* root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton) {
this->renderer = renderer;
this->currentRoot = this->rootMenu = root;
switches.addSwitch(encoderButton, nullptr);
switches.onRelease(encoderButton, [](pinid_t /*key*/, bool held) { menuMgr.onMenuSelect(held); });
setupRotaryEncoderWithInterrupt(encoderPinA, encoderPinB, [](int value) {menuMgr.valueChanged(value); });
renderer->initialise();
}
This looks quite different than how I feel instructed to create it.
switches.onRelease(encoderButton, [](pinid_t /*key*/, bool held) { menuMgr.onMenuSelect(held); });
setupRotaryEncoderWithInterrupt(encoderPinA, encoderPinB, [](int value) {menuMgr.valueChanged(value); });
And to be honest I don't know how to read that and it feels a little personal haha. Can you demystify this?
2nd encoder pins definitely seem stuck in High Z state. I'm missng something low level. One of those things you take for granted because you know it implicitly that I don't know because it hasn't kicked my ass enough for me to never forget it...
|
|
|
There's no other way to say it. It's just still not clear to me how a 2nd or 3rd encoder ties in with an 8574 expander using IOAbstraction, TaskManagerIO, and TcMenu.
My 2nd encoder CLK,DT,SW connected to 8574 pins 4,3,2 respectively cause me not to be able to scope those 2nd encoder pins like I'm able to scope the 1st encoder pins even they are both connected to the same expander.
When I disconnect CLK, DT, or SW from the 8574 I can scope those signals. Bold for emphasis because I'm loosing it. Please put me out of my mystery.
I made enough changes to the pins and hardware I'm using and added a library for manual timing/tuning of multiple PWMsignals output frequency, phase, and duty cycle. I mention it because it does use TCC0 and TCC1 and sets GCLK to 48Mhz and I don't know how that may or may not break some things in the task scheduler. For those reasons I created a new topic.
Anyway I think people that are asking these questions need a way to tie it all together.
It would be helpful if there was a TcMenu/TaskManagerIO section on this page about using 8574 w/ Interrupts when additional RotaryEncoder's are interacting with menu items/variables/classes. I mean there is [/url=https://www.thecoderscorner.com/products/arduino-libraries/tc-menu/tcmenu-plugins/encoder-switches-input-plugin/]this page about using the plugin[url] that I followed so I'm starting to suspect something about the way encoder slot 0 is initialized vs the way I'm initializing slot 1. I'm talking about pull up/down behavior on the 8574 specifically and some of the assumptions noobs might make that might be wrong. The encoders I have have 3 10k resistors on them. I'm just trying not to leave anything else out.
I'm particularly interested to know what's missing around lines 40-43 and 111-140.
#include "Arduino_menu.h"
#include "definitions.h"
#include "Clock_Setup.h"
#include "PWM_Signals.h"
#include "Dual_PWM_HW.h"
#include <IoAbstraction.h>
#include <IoAbstractionWire.h>
#include <TaskManagerIO.h>
#include <SPI.h>
#include <Wire.h>
//Pin numbers on evb
#define PWM_OUT1 9
#define PWM_OUT2 10
#define INTERRUPT_PIN_8574 11
#define GFX_CS 12
#define GFX_DC 13
//Pin Numbers on PCF8574
// 5,6,7 are the tcMenu encoder
#define ENABLE_DISABLE_BUTTON 1
#define ROTARY2_SW 2
#define ROTARY2_DT 3
#define ROTARY2_CLK 4
#define MAX_ROTARY_MODES 2 // mode definitions right below
#define FREQUENCY_ADJUST_MODE 0
#define DUTY_CYCLE_ADJUST_MODE 1
#define PHASE_ADJUST_MODE 2
uint16_t rotaryMode = 0;
volatile uint32_t virtualFrequency = DEFAULT_FREQUENCY;
volatile uint32_t virtualDutyCycle = DEFAULT_DUTYCYCLE*1000;
volatile int virtualPhase = DEFAULT_PHASE;
Clock_Setup clk;
PWM_Signals signals;
HardwareRotaryEncoder* RotaryEncoder2;
//0x20 address is means A0-A2 on chip are low
IoAbstractionRef ioExpander = ioFrom8574(0x20, INTERRUPT_PIN_8574);
Adafruit_ST7735 gfx = Adafruit_ST7735(GFX_CS, GFX_DC, -1);
AdaColorGfxMenuConfig colorConfig;
void CALLBACK_FUNCTION onRotary2Changed(int newVal){
switch(rotaryMode){
case FREQUENCY_ADJUST_MODE:
virtualFrequency = newVal;
signals.setSignalFrequency(virtualFrequency,PWM_SIGNAL_1);
signals.setSignalDutyCycle(virtualDutyCycle/1000,PWM_SIGNAL_1);
signals.setSignalFrequency(virtualFrequency,PWM_SIGNAL_2);
signals.setSignalDutyCycle(virtualDutyCycle/1000,PWM_SIGNAL_2);
break;
case DUTY_CYCLE_ADJUST_MODE:
virtualDutyCycle = newVal;
signals.setSignalDutyCycle(virtualDutyCycle/1000,PWM_SIGNAL_1);
signals.setSignalDutyCycle(virtualDutyCycle/1000,PWM_SIGNAL_2);
break;
case PHASE_ADJUST_MODE:
virtualPhase = newVal;
signals.setSignalPhase(virtualPhase,virtualDutyCycle/1000);
break;
}
}
//void CALLBACK_FUNCTION onRotary2Changed(int newVal){}
void CALLBACK_FUNCTION enableDisableButtonPressed(pinid_t pin, bool heldDown){
if(heldDown){} //If holding down the enable/disable button should do something it goes here
//validate that pressing the enable/disable button doesn't screw things up if it's pressed while menu item for enable output is OFF/FALSE
if (menuEnableOutput.getBoolean()){
//toggle timer 0
TCC0->CTRLA.reg ^= (TCC_CTRLA_ENABLE); while (TCC0->SYNCBUSY.bit.ENABLE) {}
//toggle timer 1
TCC1->CTRLA.reg ^= (TCC_CTRLA_ENABLE); while (TCC1->SYNCBUSY.bit.ENABLE) {}
}
}
void CALLBACK_FUNCTION onRotary2SwitchPressed(pinid_t pin, bool heldDown){
if(heldDown){}//If holding down Rotary2 should do something it goes here
// if were already in the last rotaryMode adjustment mode then go back to 0
if ((rotaryMode+1) > MAX_ROTARY_MODES){
rotaryMode=0;
}
//Otherwise increment to the next fine tune adjustment mode
rotaryMode++;
switch (rotaryMode){
case FREQUENCY_ADJUST_MODE:
switches.changeEncoderPrecision(1,MAX_FREQUENCY,virtualFrequency);
break;
case DUTY_CYCLE_ADJUST_MODE:
switches.changeEncoderPrecision(1,MAX_DUTYCYCLE*1000,virtualDutyCycle);
break;
case PHASE_ADJUST_MODE:
switches.changeEncoderPrecision(1,MAX_PHASE,virtualPhase);
break;
}
}
void setup() {
Wire.begin();
initDualPWM(); //sets up output pins and clocks
switches.initialiseInterrupt(ioFrom8574(0x20, INTERRUPT_PIN_8574),true);
//HardwareRotaryEncoder* RotaryEncoder2 = new HardwareRotaryEncoder(ROTARY2_CLK, ROTARY2_DT, onRotary2Changed);
RotaryEncoder2 = new HardwareRotaryEncoder(ROTARY2_CLK, ROTARY2_DT, onRotary2Changed);
switches.setEncoder(1, RotaryEncoder2); //puts this 2nd encoder in "Slot 1"... "Slot 0" is for the menu encoder
/*
Enable/Disable button
PRESS disables output
HOLD disables output and resets all the timer registers*/
// switches.addSwitch(ENABLE_DISABLE_BUTTON,enableDisableButtonPressed,NO_REPEAT,true);
switches.addSwitch(ENABLE_DISABLE_BUTTON,enableDisableButtonPressed,NO_REPEAT,true);
/*
Rotary 2 push button changes between adjustment modes on output screens
PRESS - adjust pulse width / Duty cycle, adjust phase
HOLD - gives back the screen - output is still enabled */
// switches.addSwitch(ROTARY2_SW, onRotary2SwitchPressed,NO_REPEAT,true);
switches.addSwitch(ROTARY2_SW, onRotary2SwitchPressed,NO_REPEAT,true);
//I think this makes the callback only return direction 1=CW, -1=CCW
//switches.changeEncoderPrecision(1,0,0);
taskManager.addInterrupt(ioExpander,ROTARY2_CLK,CHANGE);
taskManager.addInterrupt(ioExpander,ROTARY2_SW, FALLING);
taskManager.addInterrupt(ioExpander, ENABLE_DISABLE_BUTTON,FALLING);
//taskManager.addInterrupt(switches.getIoAbstraction(),ROTARY2_CLK,CHANGE);
//taskManager.addInterrupt(switches.getIoAbstraction(),ROTARY2_SW, FALLING);
//taskManager.addInterrupt(switches.getIoAbstraction(), ENABLE_DISABLE_BUTTON,FALLING);
prepareAdaMonoGfxConfigLoRes(&colorConfig);
gfx.initR(INITR_144GREENTAB); //Adafruit 1.44"
gfx.setRotation(1);
setupMenu();
}
void initDualPWM(){
pinMode(PWM_OUT1,OUTPUT); //D9 is PA7 Pin 12 Function E TCC1
pinMode(PWM_OUT2,OUTPUT); //D10 is PA18 Pin 27 Function F TCC0
//pinMode(ENABLE_DISABLE_BUTTON,INPUT_PULLUP);
//There should be no output until the user sets up the output
digitalWrite(PWM_OUT1, 0);
digitalWrite(PWM_OUT2, 0);
// Enable the peripheral multiplexer for the pins.
PORT->Group[0].PINCFG[18].reg |= PORT_PINCFG_PMUXEN;
PORT->Group[0].PINCFG[7].reg |= PORT_PINCFG_PMUXEN;
// Set PA18's function to function F. Function F is TCC0/WO[2] for PA18.
// Because it's an even numbered pin the PMUX is E (even) and the PMUX
// index is pin number / 2, so 9.
PORT->Group[0].PMUX[9].reg = PORT_PMUX_PMUXE_F;
// Set PA07's function to function E. Function E is TCC1/WO[1] for PA07.
// Because this is an odd numbered pin the PMUX is O (odd) and the PMUX
// index is pin number - 1 / 2, so 3.
PORT->Group[0].PMUX[3].reg = PORT_PMUX_PMUXO_E;
clk.Clock_Init(); //setup system clocks
//PUT THIS SOMEWHERE WHERE IT MAKES SENSE!
//signals.PWM_Signals_Init();
}
void loop() {
taskManager.runLoop();
}
void CALLBACK_FUNCTION enablePWMOutNow(int id) {
signals.PWM_Signals_Init();
}
void CALLBACK_FUNCTION resetRegistersNow(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION globalResetNow(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION setPWMFrequency(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION changedPWMDutyCycle(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION changedPWMPhase(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION enableOutputFlag(int id) {
// TODO - your menu change code
if (menuEnableOutput.getBoolean()==false) // if it's changed to "NO" then it was "YES" so turn off output
enableDisableButtonPressed(id,false);
}
void CALLBACK_FUNCTION beginFrequencySweep(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION beginDutyCycleSweep(int id) {
// TODO - your menu change code
}
void CALLBACK_FUNCTION beginPhaseSweep(int id) {
// TODO - your menu change code
}
It compiles and runs. The signals do output when I select the action from the menu. The 2nd encoder clocking and button, and additional pushbutton switch (enable/disable output that is wired straight to ground) never get called.
It's got to be something simple.
I'm not handing off the renderer to another screen yet but that's next.
|
|
|
Thank you for the thoughtful and detailed reply
The Designer UI is now stable but the documentation is probably even more important than bug fixing
For a guy like me that needs explicit examples and disambiguation... most definitely!
If you wanted an early test version on Windows UWP to try, I can zip a version up and send it to you.
I would be delighted to evaluate it and give feedback on features that give me trouble settings up. It's the solution It's the solution for rapid BT integration without having to hire another consultant. I would rather pay a predictable amount for support using TcMenu and embedCONTROL rather than hire another consultant after I fail for months trying to get a control app working. Whether a stable release becomes available next month or in February it's the solution I want.
If you're not having some fun you're doing something wrong
This probably isn't the best forum topic to give feedback on tcMenu but after I updated to 1.7.5 on the Windows Store I had problems. I tried removing/reinstalling but I'm having intermittent issues.
-Sometimes adding an element to a submenu does not actually create the element even though the ID index does increment. A subsequent attempt usually creates the element but the ID is +2 from the last created menu item.
-In general I do not like "Windows Store" apps. the installation location folder and app details are hidden and took me longer than I care to admit to remove. I have used the downloaded application before but that version isn't up to date. Can you make a stand alone application version available?
-I wish there was a "Save as" feature. I find myself having to create a copy of a project and then open it
-Opening a project confused me for a while because I was expecting to open the .emf file and it took me a bit to realize I need to select the folder containing the emf file
Those could just be me problems so take them with a grain of salt.
|
|
|
I hope you keep doing what you're doing... knocking down barriers
|
|
|
I'll think about this and let you know. I'd like to provide good feedback and not rush it and cause more confusion.
|
|
|
Made the above changes.... still not working...
I verified that:
-the 8574 is connected to and getting 3.3v and Gnd on VCC and Gnd respectively
-SDA/SCL have continuity to boards SDA/SCL and not accidentally reversed
-main encoder connects to 8574 on pins 7,6,5 corresponding to CLK, DT, SW respectively
-rotary encoder A/Clk and B/DT do indeed toggle in quadrature as the dial is indexed on the scope.... oh wait.... no they don't!
Encoder power was going to Gnd instead of 3.3V because the rail labeling is reversed compared to the elegoo power module pins connected to my protoboard. It's SO easy to get something wrong.
I'll be a sonovabitch!
Dave... the control encoder works!
I must say that even if this wiring was right I still wouldn't be able to move forward.
Did you ever know this?
As far as support for a free library goes thank you for not being the kind of arrogant personality that discourages people from asking for help.
In all seriousness.... aside from the connection issue do you think you understand why I was so confused and mixing up the tutorials?
|
|
|
I didn't orphan this. Some other things in life haven't been going the way I'd like. I'm sure this is true for everyone right now. Your feedback is not for naught.
|
|
|
|
|
|
I got the screen working with the new board but still no rotary encoder function.
This is the board I'm using - https://wiki.seeedstudio.com/Wio-Lite-MG126/
Here is the schematic (download) - https://files.seeedstudio.com/wiki/Wio-Lite-MG126/res/Wio%20Lite%20MG126.zip
Expander interrupt pin is pin D9
SDA/SCL is connected to expander
pins 7,6,5,4,3,2 are connected to the encoders
#include "Menu5_menu.h"
#include <IoAbstraction.h>
#include <IoAbstractionWire.h>
#include <TaskManagerIO.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include <Wire.h>
#define GFX_DC 13
#define GFX_CS 12
//#define GFX_RST 7
//#define GFX_MOSI 11
//#define GFX_MISO 12
//#define GFX_CLK 8 //sck
#define PWM_OUT1 5
#define PWM_OUT2 6
//#define ENABLE_DISABLE_BUTTON PIN_WIRE_SCL
//#define ROTARY2_CLK 7
//#define ROTARY2_DT 9
//#define ROTARY2_SW PIN_WIRE_SDA
IoAbstractionRef ioExpander = ioFrom8574(0x20);
// remember the last state of the IO expander switch so we can log any changes later
//uint8_t lastSwitchIoExp = 0;
//#define MAX_ROTARY_MODES 1
Adafruit_ST7735 gfx = Adafruit_ST7735(GFX_CS, GFX_DC, -1);
AdaColorGfxMenuConfig colorConfig;
void setup() {
//SerialUSB.begin(9600)
pinMode(PWM_OUT1,OUTPUT); // First output PWM
pinMode(PWM_OUT2,OUTPUT); // Second output PWM
ioDevicePinMode(ioExpander, 7, INPUT); //Slot 0 CLK
ioDevicePinMode(ioExpander, 6, INPUT); //Slot 0 DT
ioDevicePinMode(ioExpander, 5, INPUT); //Slot 0 SW
ioDevicePinMode(ioExpander, 4, INPUT); //Slot 1 CLK
ioDevicePinMode(ioExpander, 3, INPUT); //Slot 1 DT
ioDevicePinMode(ioExpander, 2, INPUT); //Slot 1 SW
prepareAdaMonoGfxConfigLoRes(&colorConfig);
gfx.initR(INITR_144GREENTAB); //Adafruit 1.44"
gfx.setRotation(1);
switches.initialiseInterrupt(ioFrom8754(0x20, 9), true);
Wire.begin();
setupMenu();
}
void loop() {
taskManager.runLoop();
}
In the menu file the setupMenu() looks like this
void setupMenu() {
menuPWMOut.setReadOnly(true);
menuResonanceSweep.setReadOnly(true);
menuPWMOutByPulseWidthOutput1.setReadOnly(true);
menuPWMOutByPulseWidthOutput2.setReadOnly(true);
renderer.setGraphicsDevice(&gfx, &colorConfig);
switches.initialiseInterrupt(ioExpander, true);
menuMgr.initForEncoder(&renderer, &menuPWMOut, 7, 6, 5);
remoteServer.begin(&SerialUSB, &applicationInfo);
}
I verified continuity on the expander pins. I know this encoder chip is active low but I don't understand how that ties into "switches.initialiseInterrupt(ioFrom8754(0x20, 9), true);" and the setting of the expander pins via ioDevicePinMode.
Still struggling here. Can I get another set of eyes on this please?
|
|
|
I just responded to the other post so there is some closure and a demarcation between that issue and this one. Since I'm now using an expander and a different board entirely I had thought this issue was different enough to warrant a new post. Sorry if doing so just made this more confusing. That's not what I was going for. I think my issue was from using a knockoff of an arduino m0 that is supposed to use the "Arduino Zero" board type but now that I dug around that board it is different. What I saved in dollars I lost in time.
You tied a lot of functionality together with these 3 libraries so maybe I'm expecting too much of myself that I'll understand it all. I really like how the tcMenu App makes building the menu so easy.
Without using the 8574 the only thing I had to do was setup the renderer and encoder pins and it pretty much worked right away. I think I'm confused now because when I used use the tcMenu app to tell IoAbstraction to use IoFrom8574 but then got errors because it didn't exist. My major malfunction is that the examples you provided before (to demonstrate that both encoders could work) and the example8574 here don't use tcMenu, and it wasn't clear to me that I had to create that IOAbstraction (object/interface/variable) for the 8574 and then use the 0 through 7 pins on the encoder. For some reason I thought the TcMenu app would generate that too. I kept looking for something to tie it all together and I just wasn't finding it because clearly I don't fully grasp how "switches" knows how to do what it does.
I guess despite being motivated I'm terribly challenged and am kind of a glutton for failure. When I have time this weekend I'll see if I can get the main encoder working on the 8574 using your feedback.
Thanks again for your responsiveness.
|
|
|
I wanted to close this chapter because the example you provided does indeed print the output when I use either of the encoders so I know the code, and my inputs do work when I initialize the encoders in this way. Thank you for that!
I was still not able to get my second encoder to work in the context of my application. Using the functions provided still won't allow me to use the second encoder inside of a function that is given control from a tcMenu Action item. I can't be sure but I think it might be because I'm using the second encoder in a loop function that tcMenu gives screen control to. For the life of me I can't get it to work that way but your example was a good sanity check. My problem is inexperience and a propensity for making easy things hard and making tricky things almost impossible.
Because I was using a knockoff evb with no support I decided to go with another product (Seeeduino Xiao) that has a known working library and plan to use an expander that has 2 encoders on it. 1 encoder for the menu encoder and 2nd encoder for fine tune adjustments of the PWM outputs that I'm generating using the PWM config registers on the SAMD21.
Thanks again!
|
|
|
|
|