Page 1 of 1

AtTiny45 port PB1

Posted: Sun Sep 13, 2009 8:21 pm
by saltuka
Hi,

I have a strage problem. I am working on a board similar to data logger but not using the HID mode. I am using open source win usb lib. Project web site is this .
http://www.harbaum.org/till/i2c_tiny_usb/index.shtml

When I connect the board to PC usb input , usb detection is OK. Device is working. When I pull down PB1 (port 6) of the Tiny45. USB comminication is broken.

PB1 port is just reading in main loop. It does not do anything else.When I make the same test with PB5 (pin1) it is OK. However I need that port as ADC so I have to use PB1 as input pin. I also use external crystal so only solution is to solve this isue.

Any idea is very appricated.

I am programming Tiny45 in High voltage programming mode fuse bits are as below.
high fuse: 01111111
low fuse: 11101000


//POWER STATE DEFINE
#define UPS_PORT PORTB
#define UPS_PIN PINB
#define UPS_DDR DDRB
#define UPS_POWER_LEVEL _BV(5)
#define UPS_POWER_STATE _BV(1)

static void keyPoll(void)
{
if (UPS_PIN & UPS_POWER_STATE)
{
//todo
}
else
{
//todo
}
}

static void timerInit(void)
{
/* select clock: 16.5M/1k -> overflow rate = 16.5M/256k = 62.94 Hz */
TCCR1 = 0x0b;

TCCR0A &= ~(0xC0);//PWM COMPARATOR OUTPUT DISABLE FOR PIN 6 (PB1)
}


int main(void) {
wdt_enable(WDTO_1S);

/* clear usb ports */
USB_CFG_IOPORT &= (uchar)~((1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT));

/* make usb data lines outputs */
USBDDR |= ((1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT));

/* USB Reset by device only required on Watchdog Reset */
_delay_loop_2(40000); // 10ms

/* make usb data lines inputs */
USBDDR &= ~((1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT));

timerInit();
usbInit();

//PCMSK &=~(UPS_POWER_STATE);
PCMSK =0x00;

ACSR &= ~(0x08); //disable analog interrupt
ACSR |= 0x80; //analog comparator disable
UPS_DDR &= ~(UPS_POWER_STATE); // port is input
/* make UPS_POWER_LEVEL outputs */
UPS_PORT &= ~(UPS_POWER_STATE); // disable pullup
GIMSK &= ~0x20; //disable pin interrupt

sei();

for(;;) { /* main event loop */
wdt_reset();
usbPoll();
keyPoll();
}

return 0;