# disabling internal pullups on D0 && D1 on AT90USB1286

Can anyone just verify quickly for me that this:

cbi(PORTD, 0);
cbi(PORTD, 1);


will disable the internal pullups on the AT90USB1286? I'm trying to avoid damaging some 3.3V components that I'm communicating w/over i2c. Thanks in advance.

-

First of all, the cbi/sbi(PORT,PIN) macros are deprecated. I advice using

PORT &= ~(1<<PIN);   //Clear
PORT |= (1<<PIN);    //Set


The AT90USB128 datasheet states that:

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when reset condition becomes active, even if no clocks are running.

So, if the pins are configured as inputs, your command will disable the internal pull-ups.

Having said that, your setup will most likely not work unless your 3.3V devices are 5V-tolerant. I would recommend using a simple bi-directional level shifter, explained in the popular NXP/Philips appnote found here. It only requires one N-ch FET and two pull-up resistors per bus line.

Alternatively, if you have access to the 3.3V power supply you could use this to power the MCU by cutting the connection between VBUS and UVCC/AVCC/VCC (datasheet Fig. 21-5).

-