Nantonos
12-16-2013, 07:17 PM
I have a sketch which works on Teensy 3.0 and fails to compile on Teensy 3.1. The culprit appears to be the Adafruit library for the MCP4725 DAC, which is . I downloaded a fresh copy from github today, the error persists. Its uses TWBR which, it seems, is defined for Teensy 3.0 but not for 3.1.
Here is the relevant bit of the Adafruit library:
void Adafruit_MCP4725::setVoltage( uint16_t output, bool writeEEPROM )
{
uint8_t twbrback = TWBR;
TWBR = 12; // 400 khz
Wire.beginTransmission(_i2caddr);
if (writeEEPROM)
{
Wire.write(MCP4726_CMD_WRITEDACEEPROM);
}
else
{
Wire.write(MCP4726_CMD_WRITEDAC);
}
Wire.write(output / 16); // Upper data bits (D11.D10.D9.D8.D7.D6.D5.D4)
Wire.write((output % 16) << 4); // Lower data bits (D3.D2.D1.D0.x.x.x.x)
Wire.endTransmission();
TWBR = twbrback;
}
Here is the error in full.
Arduino: 1.0.5 (Windows 7), Board: "Teensy 3.1"
F:\Arduino\arduino-105-td117\hardware\tools\arm-none-eabi\bin\arm-none-eabi-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mcpu=cortex-m4 -DF_CPU=96000000 -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 -mthumb -nostdlib -D__MK20DX256__ -DTEENSYDUINO=117 -fno-rtti -felide-constructors -std=gnu++0x -DUSB_MIDI -DLAYOUT_CANADIAN_FRENCH -IF:\Arduino\arduino-105-td117\hardware\teensy\cores\teensy3 -IF:\Arduino\arduino-105-td117\libraries\Wire -IF:\Arduino\sketches\libraries\Adafruit_MCP4725 C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\midi2cv_01.cpp -o C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\midi2cv_01.cpp.o
Using previously compiled: C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Wire\Wire.cpp.o
Using previously compiled: C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Wire\utility\twi.c.o
F:\Arduino\arduino-105-td117\hardware\tools\arm-none-eabi\bin\arm-none-eabi-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mcpu=cortex-m4 -DF_CPU=96000000 -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 -mthumb -nostdlib -D__MK20DX256__ -DTEENSYDUINO=117 -fno-rtti -felide-constructors -std=gnu++0x -DUSB_MIDI -DLAYOUT_CANADIAN_FRENCH -IF:\Arduino\arduino-105-td117\hardware\teensy\cores\teensy3 -IF:\Arduino\arduino-105-td117\libraries\Wire -IF:\Arduino\sketches\libraries\Adafruit_MCP4725 -IF:\Arduino\sketches\libraries\Adafruit_MCP4725\ut ility F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp -o C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Adafruit_MCP4725\Adafruit_MCP4725.cpp .o
F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp: In member function 'void Adafruit_MCP4725::setVoltage(uint16_t, bool)':
F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp:67:22: error: 'TWBR' was not declared in this scope
I had a look in hardware/teensy/cores/teensy3/avr_emulation.h but didn't see TWBR in there. [url=http://forum.pjrc.com/threads/21512-Teensyduino-1-13-Released?p=27601&viewfull=1#post27601]This thread (]on Github[/url) indicates that Paul was looking at adding it, and of course something must ghave been done since it works with Teensy 3.0 ...
Here is the relevant bit of the Adafruit library:
void Adafruit_MCP4725::setVoltage( uint16_t output, bool writeEEPROM )
{
uint8_t twbrback = TWBR;
TWBR = 12; // 400 khz
Wire.beginTransmission(_i2caddr);
if (writeEEPROM)
{
Wire.write(MCP4726_CMD_WRITEDACEEPROM);
}
else
{
Wire.write(MCP4726_CMD_WRITEDAC);
}
Wire.write(output / 16); // Upper data bits (D11.D10.D9.D8.D7.D6.D5.D4)
Wire.write((output % 16) << 4); // Lower data bits (D3.D2.D1.D0.x.x.x.x)
Wire.endTransmission();
TWBR = twbrback;
}
Here is the error in full.
Arduino: 1.0.5 (Windows 7), Board: "Teensy 3.1"
F:\Arduino\arduino-105-td117\hardware\tools\arm-none-eabi\bin\arm-none-eabi-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mcpu=cortex-m4 -DF_CPU=96000000 -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 -mthumb -nostdlib -D__MK20DX256__ -DTEENSYDUINO=117 -fno-rtti -felide-constructors -std=gnu++0x -DUSB_MIDI -DLAYOUT_CANADIAN_FRENCH -IF:\Arduino\arduino-105-td117\hardware\teensy\cores\teensy3 -IF:\Arduino\arduino-105-td117\libraries\Wire -IF:\Arduino\sketches\libraries\Adafruit_MCP4725 C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\midi2cv_01.cpp -o C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\midi2cv_01.cpp.o
Using previously compiled: C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Wire\Wire.cpp.o
Using previously compiled: C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Wire\utility\twi.c.o
F:\Arduino\arduino-105-td117\hardware\tools\arm-none-eabi\bin\arm-none-eabi-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mcpu=cortex-m4 -DF_CPU=96000000 -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 -mthumb -nostdlib -D__MK20DX256__ -DTEENSYDUINO=117 -fno-rtti -felide-constructors -std=gnu++0x -DUSB_MIDI -DLAYOUT_CANADIAN_FRENCH -IF:\Arduino\arduino-105-td117\hardware\teensy\cores\teensy3 -IF:\Arduino\arduino-105-td117\libraries\Wire -IF:\Arduino\sketches\libraries\Adafruit_MCP4725 -IF:\Arduino\sketches\libraries\Adafruit_MCP4725\ut ility F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp -o C:\Users\Chris\AppData\Local\Temp\build77448584411 46534684.tmp\Adafruit_MCP4725\Adafruit_MCP4725.cpp .o
F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp: In member function 'void Adafruit_MCP4725::setVoltage(uint16_t, bool)':
F:\Arduino\sketches\libraries\Adafruit_MCP4725\Ada fruit_MCP4725.cpp:67:22: error: 'TWBR' was not declared in this scope
I had a look in hardware/teensy/cores/teensy3/avr_emulation.h but didn't see TWBR in there. [url=http://forum.pjrc.com/threads/21512-Teensyduino-1-13-Released?p=27601&viewfull=1#post27601]This thread (]on Github[/url) indicates that Paul was looking at adding it, and of course something must ghave been done since it works with Teensy 3.0 ...