Teensy 3.5, 16x2 LCD, and an HD44780 I2C backpack

Status
Not open for further replies.

dpmanthei

Member
Good day, I'm at wits end with this particular problem. In a previous project, I used an Arduino Mega with a 16x2 LCD and a HD44780 I2C backpack and it worked well. This is the code I used for that project:

Code:
#include <Wire.h>
#include <LiquidCrystal.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>            
#define I2C_ADDR 0x3F
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define BACKLIGHT 3
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

unsigned long previousMillis = 0;      // Stores the time since last LCD refresh in ms
int SerialRefresh = 200;               // Time in ms to refresh voltage outputs on PC

void setup() {
  lcd.begin (16,2);                            // initialize LCD
  lcd.setBacklightPin(BACKLIGHT,POSITIVE);     // Turn on LCD backlight
  lcd.setBacklight(HIGH);                      // Turn on LCD backlight
  Serial.begin(115200);                        // Start PC USB Serial connection at baud rate
}

void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= SerialRefresh) {
  previousMillis = currentMillis;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("TESTING...");
  }
}

This code does not compile on the Teensy 3.5...dozens of errors that are all from within the LiquidCrystal library. Neither does any other LCD code snippet I can find on this forum. The LiquidCrystal Example files compile, but it looks like those examples expect wiring straight from the Teensy to the LCD without using an I2C interface and that doesn't match my hardware configuration. The "I2C_t3" basic_scanner does successfully find my device at address 0x3F as expected. I've also run other code on this specific Teensy 3.5 that reads and writes from the SD card and tracks a 60khz encoder flawlessly, so this specific device is successfully compiling code and using the digital IO and SPI interfaces. I read on another thread that someone was having trouble with the Arduino Wire.h being pulled instead of the Teensyduino Wire.h, so I renamed the Arduino Wire.h and moved it to ensure the correct library is being pulled.

My questions:
1) I've read that pullup resistors are needed when using I2C on a Teensy 3.x...isn't this specific to 3.3v logic and a Teensy 3.5 (5v tolerant) should not need pullup resistors?
2) What libraries do I need to get this going?
3) Are said libraries included with Teensyduino, or do I need to go get someone's very specific modified version from Github or something?
4) If someone is willing to post some working T3.5 example code I would be absolutely thrilled.

Thanks in advance!
Dylan
 
1. Besides the fact that the pullup resistors aren’t related to the compiler errors which need to be fixed first (no help can be offered when you don’t publish the compiler verbose output), their need does not depend on the voltage, just their value. Some I2C modules have integrated fixed pullup resistors, on others they can be activated with jumpers or solder bridges. Others haven’t, but some MCUs like the Mega have integrated pull-ups which can be activated in software. The T3.5 hasn’t. Thus, you’ll have to study the schematics and datasheet of our I2C backpack and/or look at the traffic on the SCL and SDA lines with an oscilloscope to find deformations in the waveforms and deduce the need o increase or decrease the resistor values accordingly.
2. Normally, the liquid cristal library should work, I have no idea who wrote it and if it was written and intended to work with the Teensy 3.5. More can be said when we see the errors, which should finally allow you to tweak the library to work as expected.
3. Locate the libraries on your hard disk. If they are inside the additional Teensyduino hardware folder or not, will tell you more.
 
Thank you for the detailed reply.

Things are better, but the explanation is messy. I'm working on this little project from either my desktop or my laptop depending on what I'm doing. For whatever reason, I discovered that I was getting fewer compiler errors on my desktop when I was enabling verbose output as you expressed above. I could actually understand and address these errors (LiquidCrystal_I2C.h couldn't be found and too many arguments in the LiquidCrystal_I2C lcd(); line) and after doing so, no more compilation errors!

For the record, my desktop was somehow missing the LiquidCrystal_I2C library which I installed, and then I had to modify the code to arrive at the following:


Code:
#include <Wire.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>            
#define I2C_ADDR 0x3F

LiquidCrystal_I2C lcd(I2C_ADDR,16,2);

unsigned long previousMillis = 0;      // Stores the time since last LCD refresh in ms
unsigned long SerialRefresh = 200;               // Time in ms to refresh voltage outputs on PC

void setup() {
  lcd.begin (16,2);                            // initialize LCD
  lcd.setBacklight(HIGH);                      // Turn on LCD backlight
  Serial.begin(115200);                        // Start PC USB Serial connection at baud rate
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("TESTING...");
}

void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= SerialRefresh) {
  previousMillis = currentMillis;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("TESTING...");
  }
}

So this is great progress, but I'm still stuck on point 1. I have one solid black bar on the LCD in the top row and I've adjusted contrast to ensure my text isn't hidden behind it. I also used the I2C scanner example and again confirmed that device 0x3F is still responding. I'll take a look at things with a scope tomorrow.

Thanks!
 
Back when I was still using 16x2 LCDs, at least one of my LCDs would only work with 5v. It would not work with 3.3v. I had to use voltage level shifters to boast the i2c bus to 5v. Since then I tend to use OLED displays that run at 3.3v, and I rarely use the 16x2 character displays.

To do level shifting on an i2c bus, I tended to use the Pololu logic level shifter:

Given the i2c scanner does find the device (and doesn't hang), it probably means the pull-up resistors are fine. it may be the backlight that needs 5v. If you don't have a voltage shifter handy (that is good for i2c), you might try plugging your VIN wire into the display's VCC connection. But it is more foolproof to shift both SCL/SDA to 5v, and feed the display 5v.
 
Thanks for the reply. I do have VIN and VCC connected now. If this is a Teensy 3.5 device, are SCL/SDA 5v or 3.3v?

All outputs are 3.3v. The Teensy 3.5 will tolerate 5v inputs for digital pins. For the pins that have both analog input and digitial input/output (like A0), anything between 3.3v and 5v will register as 3.3v when doing an analogInput. If you put 5v on any of the analog only pins (A10, A11, etc.) is may damage your chip. Note, the Teensy 3.6, LC, and the original 3.0 were not 5v tolerant and you could damage the chip if a 5v input came in.

If you have VIN connected to an i2c device, it may work or it may not, depending on the devices design. Some devices have built-in level shifters that allow it to work at 3.3-5v. Some devices do not, and it depends on the device whether it regards 3.3v as a digital high value. If the device for instance regard anything 0.7 * VIN as high (which is somewhat common), then if VIN is 5v, then the 3.3v of the Teensy 3.5 might not register (5*0.7 is 3.5v).

Another problem with using Arduino devices is they might need a longer initialization time (since the original AVR was on the slow side), and adding a 1-3 second delay in setup before accessing the i2c device can let the device stabilize.
 
Thank you for the explanation, this is very helpful.

I bought a logic shifter and I'm having the same results...I2C scans find the LCD screen backpack at address 0x3F which seems to indicate the I2C portion of this is working. The screen lights, but has one solid bar.

At this point, I suspect my problems are all in code. My verbose output is as follows:
Code:
C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\dmanthei\Documents\Arduino\libraries -fqbn=teensy:avr:teensy35:usb=serial,speed=120,opt=o2std,keys=en-us -vid-pid=0X16C0_0X0483 -ide-version=10805 -build-path C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461 -warnings=none -build-cache C:\Users\dmanthei\AppData\Local\Temp\arduino_cache_843527 -verbose N:\Engineering\Measurement Equipment Program Files\Arduino\Arduino_Hardware_tests_examples\Teensy_3.5_with_I2C_Logic_Shifter\Teensy_3.5_with_I2C_Logic_Shifter.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\dmanthei\Documents\Arduino\libraries -fqbn=teensy:avr:teensy35:usb=serial,speed=120,opt=o2std,keys=en-us -vid-pid=0X16C0_0X0483 -ide-version=10805 -build-path C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461 -warnings=none -build-cache C:\Users\dmanthei\AppData\Local\Temp\arduino_cache_843527 -verbose N:\Engineering\Measurement Equipment Program Files\Arduino\Arduino_Hardware_tests_examples\Teensy_3.5_with_I2C_Logic_Shifter\Teensy_3.5_with_I2C_Logic_Shifter.ino
Using board 'teensy35' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr
Using core 'teensy3' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr
Detecting libraries used...
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w  -g -Wall -ffunction-sections -fdata-sections -nostdlib -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w  -g -Wall -ffunction-sections -fdata-sections -nostdlib -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w  -g -Wall -ffunction-sections -fdata-sections -nostdlib -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal\src" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w  -g -Wall -ffunction-sections -fdata-sections -nostdlib -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal\src" "-IC:\Users\dmanthei\Documents\Arduino\libraries\LiquidCrystal_I2C" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "nul"
Using cached library dependencies for file: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire\Wire.cpp
Using cached library dependencies for file: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire\WireKinetis.cpp
Using cached library dependencies for file: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire\utility\twi.c
Using cached library dependencies for file: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal\src\LiquidCrystal.cpp
Using cached library dependencies for file: C:\Users\dmanthei\Documents\Arduino\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp
Generating function prototypes...
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w  -g -Wall -ffunction-sections -fdata-sections -nostdlib -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal\src" "-IC:\Users\dmanthei\Documents\Arduino\libraries\LiquidCrystal_I2C" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\preproc\ctags_target_for_gcc_minus_e.cpp"
Compiling sketch...
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -c -O2 -g -Wall -ffunction-sections -fdata-sections -nostdlib -MMD -fno-exceptions -felide-constructors -std=gnu++14 -fno-rtti -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -D__MK64FX512__ -DTEENSYDUINO=141 -DARDUINO=10805 -DF_CPU=120000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal\src" "-IC:\Users\dmanthei\Documents\Arduino\libraries\LiquidCrystal_I2C" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp" -o "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp.o"
Compiling libraries...
Compiling library "Wire"
Using previously compiled file: C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\Wire.cpp.o
Using previously compiled file: C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\WireKinetis.cpp.o
Using previously compiled file: C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\utility\twi.c.o
Compiling library "LiquidCrystal"
Using previously compiled file: C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\LiquidCrystal\LiquidCrystal.cpp.o
Compiling library "LiquidCrystal_I2C"
Using previously compiled file: C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp.o
Compiling core...
Using precompiled core
Linking everything together...
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-gcc" -O2 -Wl,--gc-sections,--relax,--defsym=__rtc_localtime=1530269339 "-TC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3/mk64fx512.ld" -lstdc++  -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -o "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.elf" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\sketch\Teensy_3.5_with_I2C_Logic_Shifter.ino.cpp.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\Wire.cpp.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\WireKinetis.cpp.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\Wire\utility\twi.c.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\LiquidCrystal\LiquidCrystal.cpp.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp.o" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/..\arduino_cache_843527\core\core_teensy_avr_teensy35_usb_serial,speed_120,opt_o2std,keys_en-us_4939f5412a75a8560acb0f9e98268f02.a" "-LC:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461" -larm_cortexM4lf_math -lm
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.elf" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.eep"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-objcopy" -O ihex -R .eeprom "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.elf" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.hex"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/stdout_redirect" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.lst" "C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-objdump" -d -S -C "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.elf"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/stdout_redirect" "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.sym" "C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-objdump" -t -C "C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461/Teensy_3.5_with_I2C_Logic_Shifter.ino.elf"
"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/teensy_post_compile" "-file=Teensy_3.5_with_I2C_Logic_Shifter.ino" "-path=C:\Users\dmanthei\AppData\Local\Temp\arduino_build_856461" "-tools=C:\Program Files (x86)\Arduino\hardware\teensy/../tools/" "-board=TEENSY35"
Using library Wire at version 1.0 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire 
Using library LiquidCrystal at version 1.0.7 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\LiquidCrystal 
Using library LiquidCrystal_I2C at version 1.1.2 in folder: C:\Users\dmanthei\Documents\Arduino\libraries\LiquidCrystal_I2C 
Sketch uses 15500 bytes (2%) of program storage space. Maximum is 524288 bytes.
Global variables use 5220 bytes (2%) of dynamic memory, leaving 191388 bytes for local variables. Maximum is 196608 bytes.

At some point I'm just going to have to give up and go to plan B (transmitting serial data to a PC and presenting it in a GUI) which is already working. But the 3.5/3.6 have I2C and I have a pile of LCDs with I2C interfaces I wish I could use.

EDIT: I added a 3 second delay to the beginning and end of setup but no change in results.
 
Just to post my resolution, I ended up unsoldering the I2C backpack and just switching to the 16 pin connection shown here:
https://www.pjrc.com/teensy/td_libs_LiquidCrystal.html

Specifically, I followed the "Using 5 Volt LCDs with 3.3 Volt Teensy" section. The wiring is messy, but the code with the library becomes very simple and works well.

Ironically, after all this effort, I'm not sure I'm happy with the response time for my application. I'm either going to have to mask out my last digit (pressure transducer from 0-9000psi, so don't need the last digit really) or I ordered some 7-segment displays as a backup option.

Thanks for the help and suggestions though. I didn't have any luck with 5V/3.3V I2C and liquidcrystal, but I found another way that will work out.
 
Status
Not open for further replies.
Back
Top