Unsolved signal generator segmentation fault
-
I want to program the hardware of my signalgenerator over i2c-Bus. Unfortunately I can only upload pictures of the program because my programs on the beaglebone are linux.
Programs: form.h, form.cpp, i2ccwn.h, i2ccwn.cpp, main.cppi2CCWn.cpp: row 19 MWindow*cw;//Object
row 108 void I2CCWn:: writeFb(){
row 109. writeRegister (OLATA, cw->get_Fb() );The call "get_Fb() )" leads to error "Segmentation fault".
Only when I write the function in program "form.cpp" for instance:
unsigned char MWindow::get_Fb() {
return 12;
}
give 12 over i2c-Bus out.Please help me since I am no expert in programming.;)
-
@inexpert Please post code as text and not pictures of your screen!
-
I am very sorry that I put the code in the wrong place without any comment, but since I am nearly 80 years old it´s really hard for me to handle the internet stuff. So here another time the code and I hope that someone can help me with my programming problem.
main.cpp #include "form.h" #include <QApplication> #include "ui_menuwindow.h" int main(int argc, char*argv[] ) { QApplication app(argc, argv); MWindow window; window.show(); return app.exec(); } form.h /media/ubuntu/rootfs/home/debian/jauk/Signalgenerator/CW/CW #ifndef FORM_H #define FORM_H #include <QMainWindow> #include <QMessageBox> #include "ui_cwwindow.h" #include "ui_menuwindow.h" const long fosc = 171798692 ; //Quartzoscillator frequency class MWindow : public QMainWindow, private Ui::CwWindow { Q_OBJECT public: MWindow(); // constructor ~MWindow() {} // destructor double get_FR(); unsigned char get_Fb(); long long get_YIGFr(); unsigned int get_YIGDA(); unsigned int get_YIGFilter(); unsigned char get_Ndiv(); //double get_FrDDS(); long get_Phase(); unsigned char get_Koswitch(); unsigned char get_Att(); unsigned int get_Pow(); private slots: void analyseDialog(); void updatef(); void updatep(); private: double FR ; // input frequency [Hz] double P; // output power [dBm] or [mW] unsigned char Fb ; // frequency range long long YIGFr ; //requiered YIG frequency unsigned int YIGDA ; //requiered YIG D/A unsigned int YIGFilter ; //requiered YIG Filter unsigned char Ndiv ; //divider factor for PLL SDI //double FrDDS ; //requiered DDS frequency = YIGFR/Ndiv -fosc (18667400.00Hz <= FrDDS <= 28201308.00Hz) long Phase ; //decimal value of 32-bit frequency tuning word for DDS AD9851 = 25*FrDDS unsigned char Koswitch ; //koaxswitch 3 to 8 decoder HCT 238 unsigned char Att ; //60dB attenuator step 10dB unsigned int Pow; // input power range fine (0 - 10dB) SDI int decimals ; double minimum; double maximum; }; #endif form.cpp #include "form.h" #include "i2ccwn.h" #include <math.h> //Constructor MWindow::MWindow() { setupUi(this); //Signal-Slot connection connect( pushButton_2, SIGNAL( clicked() ), this, SLOT(analyseDialog() ) ); connect( pushButton, SIGNAL( clicked() ), qApp, SLOT(quit() ) ); connect( pushButton_2, SIGNAL( clicked() ), this, SLOT(updatef() ) ); connect( pushButton_2, SIGNAL( clicked() ), this, SLOT(updatep() ) ); } void MWindow::analyseDialog() { if(comboBox->currentText() == "GHz" ) { doubleSpinBox->setMaximum ( 31.999999999 ); doubleSpinBox->setDecimals( 9 ); } else if(comboBox->currentText() == "MHz" ) { doubleSpinBox->setMaximum ( 31999.999999 ); doubleSpinBox->setDecimals( 6 ); } else if(comboBox->currentText() == "KHz" ) { doubleSpinBox->setMaximum ( 31999999.999 ); doubleSpinBox->setDecimals( 3 ); } else if(comboBox->currentText() == "Hz" ) { doubleSpinBox->setMaximum ( 31999999999 ); doubleSpinBox->setDecimals( 0 ); } if( comboBox_2->currentText() == "dBm" ) { doubleSpinBox_2-> setDecimals( 2 ) ; doubleSpinBox_2-> setMinimum( -50.00 ) ; doubleSpinBox_2-> setMaximum( 20.00 ) ; } else if( comboBox_2->currentText() == "mW" ) { doubleSpinBox_2-> setDecimals( 5 ) ; doubleSpinBox_2-> setMinimum( 0.00001 ) ; doubleSpinBox_2-> setMaximum( 100.00000 ) ; } } // End of "analyseDialog()" double MWindow::get_FR() { if(comboBox->currentText() == "GHz" ) { FR = doubleSpinBox->value() * 1000000000; return FR; } else if(comboBox->currentText() == "MHz" ) { FR = doubleSpinBox->value() * 1000000; return FR; } else if(comboBox->currentText() == "KHz" ) { FR = doubleSpinBox->value() * 1000; return FR; } else if(comboBox->currentText() == "Hz" ) { FR = doubleSpinBox->value(); return FR; } } // End of "get_FR" unsigned char MWindow::get_Fb() { //get_FR(); Segmentation fault //cw->get_FR(); -------"---------- //this->get_FR(); -------"---------- if( FR < 62500000 ) { " Fb = 0; " return Fb; " } else if( (FR >= 62500000E+6) && (FR < 125000000 ) ) { Fb = ( FR < 88000000 ) ?1 : 2; return Fb; } else if( (FR >= 125000000) && (FR < 250000000 ) ) { Fb = ( FR < 177000000 ) ?3 : 4; return Fb; } else if( (FR >= 250000000) && (FR < 500000000 ) ) { Fb = ( FR < 353000000 ) ?5 : 6; return Fb; } else if( (FR >= 500000000) && (FR < 1000000000 ) ) { Fb = ( FR < 707000000 ) ?7 : 8; return Fb; } else if( (FR >= 1000000000) && (FR < 2000000000 ) ) { Fb = ( FR < 1400000000 ) ?9 : 10; return Fb; } else if( (FR >= 2000000000) && (FR < 4000000000 ) ) { Fb = ( FR < 2800000000 ) ?11 : 12; return Fb; } else if( (FR >= 4000000000) && (FR < 8000000000 ) ) { Fb = ( FR < 5600000000 ) ?13 : 14; return Fb; } else if( (FR >= 8000000000) && (FR < 16000000000 ) ) { Fb = ( FR < 11200000000 ) ?15 : 16; return Fb; } else if( (FR >= 16000000000) && (FR < 32000000000 ) ) { Fb = ( FR < 22400000000 ) ?17 : 18; return Fb; } // Fb = 12; // returnFb; Segmentation fault return 12; // OK without 'Segmentation fault' ...gibt '12' über I2C-Bus aus } //End of "get_Fb" unsigned char MWindow::get_Att() { if( (comboBox_2->currentText() == "dBm" ) ) { if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 20.0 ) ) { Att = 0 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { Att = 10 ; return Att; } else if( (doubleSpinBox_2-> value() > -10.0 ) && (doubleSpinBox_2-> value() <= 0.0 ) ) { Att = 20 ; return Att; } else if( (doubleSpinBox_2-> value() > -20.0 ) && (doubleSpinBox_2-> value() <= -10.0 ) ) { Att = 30 ; return Att; } else if( (doubleSpinBox_2-> value() > -30.0 ) && (doubleSpinBox_2-> value() <= -20.0 ) ) { Att = 40 ; return Att; } else if( (doubleSpinBox_2-> value() > -40.0 ) && (doubleSpinBox_2-> value() <= -30.0 ) ) { Att = 50 ; return Att; } else if( (doubleSpinBox_2-> value() > -50.0 ) && (doubleSpinBox_2-> value() <= -40.0 ) ) { Att = 60 ; return Att; } } else if( (comboBox_2->currentText() == "mW" ) ) { if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 100.0 ) ) { Att = 0 ; return Att; } else if( (doubleSpinBox_2-> value() > 1.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { Att = 10 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.1 ) && (doubleSpinBox_2-> value() <= 1.0 ) ) { Att = 20 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.01 ) && (doubleSpinBox_2-> value() <= 0.1 ) ) { Att = 30 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.001 ) && (doubleSpinBox_2-> value() <= 0.01 ) ) { Att = 40 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.0001 ) && (doubleSpinBox_2-> value() <= 0.001 ) ) { Att = 50 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.00001 ) && (doubleSpinBox_2-> value() <= 0.0001 ) ) { Att = 60 ; return Att; } } } //End of "get_Att()" unsigned int MWindow::get_Pow() { if( (comboBox_2->currentText() == "dBm" ) ) { if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 20.0 ) ) { Pow = ( (doubleSpinBox_2-> value()-10.0) / 10) * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > 0.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { Pow = ( (doubleSpinBox_2-> value()-0.0 ) / 10) * 6/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -10.0 ) && (doubleSpinBox_2-> value() <= 0.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+10.0 ) / 10) * 5/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -20.0 ) && (doubleSpinBox_2-> value() <= -10.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+20.0 ) / 10) * 4/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -30.0 ) && (doubleSpinBox_2-> value() <= -20.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+30.0 ) / 10) * 3/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -40.0 ) && (doubleSpinBox_2-> value() <= -30.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+40.0 ) / 10) * 2/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -50.0 ) && (doubleSpinBox_2-> value() <= -40.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+50.0 ) / 10) * 1/7 * 65536 ; return Pow; } } else if( (comboBox_2->currentText() == "mW" ) ) { if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 100.0 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(10.0) ) * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 10.0 ) * 65536.0 ; return Pow; } else if( (doubleSpinBox_2-> value() > 1.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(1.0) ) * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 1.0 ) * 6/7 * 65536.0 ; return Pow; } else if( (doubleSpinBox_2-> value() > 0.1 ) && (doubleSpinBox_2-> value() <= 1.0 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.1) ) * 5/7 * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 0.1 ) * 5/7 * 65536.0 ; return Pow; } else if( (doubleSpinBox_2-> value() > 0.01 ) && (doubleSpinBox_2-> value() <= 0.1 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.01) ) * 4/7 * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 0.01 ) * 4/7 * 65536.0 ; return Pow; } else if( (doubleSpinBox_2-> value() > 0.001 ) && (doubleSpinBox_2-> value() <= 0.01 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.001) ) * 3/7 * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 0.001 ) * 3/7 * 65536.0 Pow = log10(doubleSpinBox_2-> value() / 0.0001 ) * 2/7 * 65536.0 ; return Pow; } else if( (doubleSpinBox_2-> value() > 0.00001 ) && (doubleSpinBox_2-> value() <= 0.0001 ) ) { // Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.00001) ) * 1/7 * 65536.0 ; Pow = log10(doubleSpinBox_2-> value() / 0.00001 ) * 1/7 * 65536.0 ; return Pow; } } } // End of "get Pow" long long MWindow::get_YIGFr() { if( (FR >= 62500000) && (FR < 125000000 ) ) { YIGFr = FR * 64; return YIGFr ; } else if( (FR >= 125000000) && (FR < 250000000 ) ) { YIGFr = FR * 32; return YIGFr ; } else if( (FR >= 250000000) && (FR < 500000000 ) ) { YIGFr = FR * 16; return YIGFr ; } else if( (FR >= 500000000) && (FR < 1000000000 ) ) { YIGFr = FR * 8; return YIGFr ; } else if( (FR >= 1000000000) && (FR < 2000000000 ) ) { YIGFr = FR * 4; return YIGFr ; } else if( (FR >= 2000000000) && (FR < 4000000000 ) ) { YIGFr = FR * 2; return YIGFr ; } else if( (FR >= 4000000000) && (FR < 8000000000 ) ) { YIGFr = FR ; return YIGFr ; } else if( (FR >= 8000000000) && (FR < 16000000000 ) ) { YIGFr = FR / 2; return YIGFr ; } else if( (FR >= 16000000000) && (FR < 32000000000 ) ) { YIGFr = FR / 4; return YIGFr ; } } // End of "get_YIGFr() unsigned int MWindow::get_YIGDA() { YIGDA = (YIGFr/4000000000 -1) * 65536 ; return YIGDA ; } // End of "get_YIGDA()" unsigned int MWindow::get_YIGFilter() { YIGFilter = (YIGFr/4000000000 -1) * 65536 ; return YIGFilter ; } // End of "get_YIGFilter()" unsigned char MWindow::get_Koswitch() { if ( FR < 10000000 ) { Koswitch = 0b00000000 ; return Koswitch; } else if( ( FR >= 10000000) && ( FR < 62500000) ) { Koswitch = 0b00100000 ; return Koswitch; } else if( ( FR >= 62500000) && ( FR < 4000000000) ) { Koswitch = 0b01000000 ; return Koswitch; } else if( ( FR >= 4000000000) && ( FR < 8000000000) ) { Koswitch = 0b01100000 ; return Koswitch; } else if( ( FR >= 8000000000) && ( FR < 16000000000) ) { Koswitch = 0b10000000 ; return Koswitch; } else if( ( FR >= 16000000000) && ( FR < 32000000000) ) { Koswitch = 0b10100000 ; return Koswitch; } } //End of "get_Koswitch()" unsigned char MWindow::get_Ndiv() { int n={0},FrDDS={0}; if( YIGFr > 6000000000) { // (( n >= 31 ) && ( n <= 40 ) ); n = 31; } else if( YIGFr <= 6000000000 ) { // (( n >= 20 ) && ( n <= 30 ) ); n = 20; } do { FrDDS = YIGFr/n - fosc ; Ndiv = n++ ; } while (!( FrDDS >= 18677400 && FrDDS <= 28201308 ) ); if (n > 41) { return 1; } return Ndiv; } // End of "get_Ndiv()" long MWindow::get_Phase() { Phase = 25 * (YIGFr / Ndiv - fosc) ; return Phase; } //End of "get_Phase()" //---------------SLOT Definition------------------ void MWindow::updatef(double) { I2CCWn m_i2ccwn(2, 0x20); //object //I2CCWn m_i2ccwnb; //object for default constructor call if(get_FR() !>= doubleSpinBox->value() ) { FR = doubleSpinBox->value() ; m_i2ccwn.writeFb(); } } void MWindow::updatep(double) { I2CCWn m_i2ccwn(2, 0x20); //object // m_i2ccwn.writeAtt(); //Segmentation fault // if( att != Att) { // Att = att; // m_i2ccwn.writeAtt(); // } } i2ccwn.h #ifndef I2C_H_ #define I2C_H_ #include <QObject> #define BBB_I2C_1 "/dev/i2c-1" #define BBB_I2C_2 "/dev/i2c-2" class I2CCWn{ private: unsigned int bus; unsigned int device; int file; public: I2CCWn(unsigned int bus, unsigned int device); //constructor declaration I2CCWn(); //default constructor declaration int open(); // virtual int write(unsigned char value); // virtual unsigned char readRegister(unsigned int registerAddress); // virtual unsigned char* readRegisters(unsigned int number, unsigned int fromAddress=0); // virtual int writeRegister(unsigned int registerAddress, unsigned char value); int writeRegister(unsigned int registerAddress, unsigned char value); // virtual void debugDumpRegisters(unsigned int number = 0xff); virtual void close(); virtual ~I2CCWn(); void writeAtt(); void writePow(); //SDI void writeFb(); void writeYIGDA(); void writeYIGFilter(); void writeKoswitch(); void writeNdiv(); //SDI void writePhase(); // virtual ~I2CCWn(); }; //} /* namespace exploringBB */ #endif /* I2C_H_ */ i2ccwn.cpp #include "i2ccwn.h" #include "form.h" #include <iostream> #include <unistd.h> #include <stdio.h> #include <sstream> #include <fcntl.h> #include <iomanip> #include <sys/ioctl.h> #include <linux/i2c.h> #include <linux/i2c-dev.h> using namespace std; #define HEX(x) setw(2) << setfill('0') << hex << (int)(x) class MWindow; MWindow* cw; // Object //MWindow cw; // Object---Must construct a QApplication before a QPaintDevice #define IODIRA 0x00 // Input/Output -Direction Register A #define IODIRB 0x01 // Input/Output -Direction Register B #define OLATA 0x14 // Output Latch A #define OLATB 0x15 // Output Latch B // constructor //I2CCWn::I2CCWn (unsigned int bus = 2, unsigned int device = 0x20) { I2CCWn::I2CCWn (unsigned int bus, unsigned int device) { bus = bus; device = device; file = -1; open(); writeRegister(IODIRA, 0x00); // 0x00 sets all 8bits of Input/Output -Direction Register A to Output writeRegister(IODIRB, 0x00); // 0x00 sets all 8bits of Input/Output -Direction Register B to Output } // constructor I2CCWn::I2CCWn() { // QObject (parent), bus= 2; device= 0x28; //device 0x20 or 0x28 file= -1; open(); writeRegister(IODIRA, 0x00); writeRegister(IODIRB, 0x00); } // Method open int I2CCWn::open(){ string name = BBB_I2C_2; if((this->file=::open(name.c_str(), O_RDWR)) < 0){ perror("I2C: failed to open the bus\n"); return 1; } if(ioctl(this->file, I2C_SLAVE, this->device) < 0){ perror("I2C: Failed to connect to the device\n"); return 1; } return 0; } int I2CCWn::writeRegister(unsigned int registerAddress, unsigned char value) { unsigned char buffer[2]; buffer[0] = registerAddress; buffer[1] = value; if(::write(this->file, buffer, 2)!=2) { perror("I2C: Failed write to the device\n"); return 1; } return 0; } //Method to output Att on I2C void I2CCWn:: writeAtt () { writeRegister (OLATA,cw->get_Att()); writeRegister (OLATB, 0x0f); writeRegister (OLATB, 0x10); } /* //Method to output Pow on I2C/SPI void I2CCWn:: writePow () { device = 0x28; writeRegister (0x28,0xf0,0x05); //Bridge SC18IS602B MSB_First, SPI-Clock 0 quit, Data clocked on trailing edge SPI device = 0x20; //SPI clock rate 461kHz writeRegister (OLATB, 0x15); //Synch AD5660-2 set device = 0x28; writeRegister (0x28,0x01,0x00,cw->get_Pow() ) i; //input Pow-data // writeRegister (0x28,0x01,0x00,cw.get_Pow() ) i; //input Pow-data device = 0x20; writeRegister (OLATB, 0x16); //Synch AD5660-2 set 1 } */ //Method to output Fb on I2C void I2CCWn:: writeFb () { writeRegister (OLATA,cw->get_Fb()); writeRegister (OLATB, 0x0d); writeRegister (OLATB, 0x0e); } //Method to output YIGDA on I2C void I2CCWn:: writeYIGDA () { writeRegister (OLATA,cw->get_YIGDA()>>8 ); //Output high Byte writeRegister (OLATB, 0x01); writeRegister (OLATB, 0x02); writeRegister (OLATA,cw->get_YIGDA() & 0x00ff ) ; //Output low Byte writeRegister (OLATB, 0x01); writeRegister (OLATB, 0x02); writeRegister (OLATB, 0x03); writeRegister (OLATB, 0x02); } //Method to output YIGFilter on I2C void I2CCWn:: writeYIGFilter () { writeRegister (OLATA,cw->get_YIGDA()>>8 ); //Output high Byte writeRegister (OLATB, 0x04); writeRegister (OLATB, 0x05); writeRegister (OLATA,cw->get_YIGDA() & 0x00ff ) ; //Output low Byte writeRegister (OLATB, 0x04); writeRegister (OLATB, 0x05); writeRegister (OLATB, 0x06); writeRegister (OLATB, 0x05); } //Method to output Koswitch on I2C void I2CCWn:: writeKoswitch () { writeRegister (OLATB,cw->get_Koswitch()); //Output Koswitch } //Method to output Ndiv on I2C/SDI //Method to output Phase on I2C void I2CCWn::writePhase () { writeRegister (OLATA, 0x00); //W0 Output for 6x REFCLK Multiplyer disabled writeRegister (OLATB, 0x08); writeRegister (OLATB, 0x07); writeRegister (OLATA,cw->get_Phase()>>24 ); //W1 writeRegister (OLATA,cw.get_Phase()>>24 ); //W1 writeRegister (OLATB, 0x08); writeRegister (OLATB, 0x07); writeRegister (OLATA,cw->get_Phase()>>16 & 0x00ff); //W2 writeRegister (OLATA,cw.get_Phase()>>16 & 0x00ff); //W2 writeRegister (OLATB, 0x08); writeRegister (OLATB, 0x07); writeRegister (OLATA,cw->get_Phase()>>8 & 0x0000ff); //W3 writeRegister (OLATA,cw.get_Phase()>>8 & 0x0000ff); //W3 writeRegister (OLATB, 0x08); writeRegister (OLATB, 0x07); writeRegister (OLATA,cw->get_Phase() & 0x000000ff); //W4 writeRegister (OLATA,cw.get_Phase() & 0x000000ff); //W4 writeRegister (OLATB, 0x08); writeRegister (OLATB, 0x09); writeRegister (OLATB, 0x07); } void I2CCWn::close(){ ::close(this->file); this->file = -1; } I2CCWn:: ~I2CCWn() { if(file!=-1) this->close(); }
-
Hi,
The first thing I see is that you have an encapsulation issue .
Your class that manages your i2c devices should not know anything regarding the widgets. Its role is to communicate with the device(s) and not to change the GUI.
Your MainWindow is the one that will pilot the devices through that other class and will keep things regarding the GUI in sync with whatever comes from the device.
-
Hi,
Thanks a lot for your Swift reply. Based on Your feedback, I Will try to solve the Issue. However, it is probably going to take me a while. -
@inexpert said in signal generator segmentation fault:
However, it is probably going to take me a while.
No pressure, do it at your own pace.
I would recommend getting your I2C class working independently from the GUI first with some unit tests to ensure things keep working and then build your user interface using that class.
-
Hi,
Thanks. I already checked my i2c class and it is working as it should. -
I cannot find a way to bring the data 'Fb' ( return value of the method 'MWindow get_Fb() )
into the i2c class :
void I2CCWn : : writeFb() {
writeRegister (OLATA, Fb);
+
+
can you help me, please -
It should be the other way around: the method should be
writeFb(char Fb)
and you call it in MWindow.In your application the main class is MWindow, so it should have an object of type I2CCWn and call its methods with adequate parameter. As suggested before, I2CCWn should be completely independent so that if you use it through your MWindow class or decide to build a command line tool with it, you do not have to change it.
-
three cheers !!!Following your advice the i2c output works.
You are a very competent expert and I want to thank you very much for your efforts.
I hope you don`t mind if I contact you again in the future regarding my work on my signal generator
(menue, modulation etc.).
Best regards!