Pagina 1 di 1

Problema errore compilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 15:18
da alien75
Salve, ho installato le librerie per MCP4251 nell'ide per ARDUINODUE ed è andato a buon fine,
ma se compilo mi da il seguente errore:
Codice: Seleziona tutto
/home/fabio/Arduino/libraries/MCP4251/src/MCP4251.cpp:64:6: error: prototype for 'void MCP4251::DigitalPotSetWiperPosition(bool, unsigned int)' does not match any in class 'MCP4251'
void MCP4251::DigitalPotSetWiperPosition(bool potNum, unsigned int value)
      ^
In file included from /home/fabio/Arduino/libraries/MCP4251/src/MCP4251.cpp:1:0:
/home/fabio/Arduino/libraries/MCP4251/src/MCP4251.h:43:8: error: candidate is: void MCP4251::DigitalPotSetWiperPosition(bool, uint16_t)
   void DigitalPotSetWiperPosition(bool potNum, uint16_t value); // Need confirmation if it is working
        ^
exit status 1

Compilation error: exit status 1


Il codice è il seguente:
Codice: Seleziona tutto
#include "Arduino.h"
#include "MCP4251.h"


Non capisco perché mi da tale errore aiutatemi.
Sotto ArduinoUno la compilazione va a buon fine.

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 15:29
da banjoman
La dichiarazione e l'implementazione della funzione membro sono diverse nel tipo del secondo parametro:

Nell'include .h:
Codice: Seleziona tutto
MCP4251::DigitalPotSetWiperPosition(bool, uint16_t)


Nel file .cpp:
Codice: Seleziona tutto
MCP4251::DigitalPotSetWiperPosition(bool, unsigned int)


Max

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 15:40
da alien75
Io non ho messo mano nel file .h e nel file .cpp: come mai sono diverse?
Non capisco il perché.
Hai qualche idea?
qual è il tipo di parametro vero?
Non conosco questa lib nella profondità.

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 15:51
da banjoman
Dipende dal compilatore che usi. Alcuni , (piu' permissivi) emettono solo un warning, altri si fermano riportando un errore.
Prova a mettere uint16_t al posto di unsigned int e vediamo cosa accade...

Se non erro Arduino due e' un micro a 32 bit, quindi l'equivalente di uint16_t sarebbe
Codice: Seleziona tutto
unsigned short int
, mentre
Codice: Seleziona tutto
unsigned int
sarebbe equivalente a uint32_t.

Poi non conosco la libreria, quindi ci sarebbe da approfondire se chi l'ha scritta intendeva usare proprio un uint16_t piuttosto che un uint32_t....

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 16:15
da banjoman
Per curiosita' ho dato un'occhiata alla libreria. Il MCP4251 accetta valori compresi tra 0 e 255, quindi anche l'uint16_t sarebbe inutile (basterebbe un unsigned char oppure un uint8_t).
Di fatto chi ha scritto la libreria alla fine fa un cast a (byte) prima di spedire il dato sulla SPI.
Un po' pasticciato insomma... :-)

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 16:26
da boiler
Benvenuti nel mondo arduino!

Sono andato a vedermi la libreria (qui: https://github.com/kulbhushanchand/MCP4 ... master/src)
Codice: Seleziona tutto
void MCP4251::DigitalPotSetWiperPosition(bool potNum, unsigned int value)
{
    byte cmdByte = B00000000;
    byte dataByte = B00000000;
    if (value > 255)
        cmdByte |= B00000001;
    else
        dataByte = (byte)(value & 0X00FF);


Il safeguarding invece di ritornare un errore (come sarebbe buona prassi) genera un side-effect non documentato (ma poi in realtà cosa c'è di documentato?!?)

Tendenzialmente correggerei sempre prendendo il tipo specificato "piú univocamente", che in questo caso è uint16_t.

Gli orrori continuano:
Codice: Seleziona tutto
    if (potNum)
    {
        cmdByte = cmdByte | ADDRESS_WIPER_1 | COMMAND_WRITE;
        SPI.transfer(cmdByte);
        SPI.transfer(dataByte);
    }
    else
    {
        cmdByte = cmdByte | ADDRESS_WIPER_0 | COMMAND_WRITE;
        SPI.transfer(cmdByte);
        SPI.transfer(dataByte);
    }

potNum è di tipo bool, così che se si dovesse estendere la biblioteca ad un potenziometro a 4 canali, cambierebbe l'interfaccia.
Ah, è ovviamente il paradigma "don't repeat yourself" lo mandiamo a quel paese.

Ogni tanto fa bene dare un'occhiata a queste cose, mi confermano che la scelta di starne alla larga è quella giusta :mrgreen:

Boiler

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 16:28
da boiler
banjoman ha scritto:Per curiosita' ho dato un'occhiata alla libreria. Il MCP4251 accetta valori compresi tra 0 e 255

In realtà no, va fino a 0x100 (scelta molto opinabile, secondo me):
https://ww1.microchip.com/downloads/aem ... 22060b.pdf

Di fatto chi ha scritto la libreria alla fine fa un cast a (byte) prima di spedire il dato sulla SPI.
Un po' pasticciato insomma... :-)

Molto peggio: tronca qualsiasi valore superiore a 256 senza preavviso e senza errore.

Boiler

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 26 apr 2025, 16:29
da banjoman
Lo so, ma non volevo infierire... tu invece si :mrgreen:

Re: Problema errore conpilazione lib per MCP4251

MessaggioInviato: 30 dic 2025, 12:05
da GioArca67
boiler ha scritto:Benvenuti nel mondo arduino!

[...]

Ogni tanto fa bene dare un'occhiata a queste cose, mi confermano che la scelta di starne alla larga è quella giusta :mrgreen:


Però non puoi dare la colpa al micro e al suo contorno HW se ci sono anche cani a scrivere SW... (senza riferimento specifico alla libreria in questione, ovviamente)
Basta selezionare e/o scrivere in proprio. :lol: