ATMega32 controllare valore dei pin

Ciao a tutti,
sto facendo un po di esperimenti con un ATMega32 e Atmel Studio 6 e sto avendo un problemino, ho connesso un dip switch a 3 pin della PORTB del mio Atmega32 e in base allo specifico switch (setto sempre e solo uno switch alla volta) settato leggere valore alto sul pin e quindi settare una variabile, che è diversa in base al fatto che sia settato alto il pinb1, pinb2 o pinb3.

Ho scritto il codice ma mi accade una cosa che io reputo inspiegabile, appena programmato il micro tramite Atmel Studio 6 + STK500 tutto funziona perfettamente, ma se spengo e riaccendo il tutto, il micro setta automaticamente il valore PINB a 0b11111111, valore che io leggo tramite connessione seriale al pc.

Di seguito il codice

int main( void ) {
    DDRB = 0b00000000;
    	
	//Avvio la comunicazione USART
	usart_init (MYUBRR);
	//Scrivo sulla seriale delle scritte all'accensione del circuito
	usart_printString("SERIALE PRONTA!\n\r");
	
	/* Inizializzo la comunicazione i2C */
	initI2C();
	
	//Inizializzo l'accelerometro settando tutti i vari registri opportunamente
	initAccelerometer();

	while(true) {
	   .....
	}
}

/* Metodo che setta i registri per il corretto funzionamento dell'accelerometro */
void initAccelerometer() {
	uint8_t THRESHOLD_MOTION;

	uint8_t pin = PINB;
	char temp2[8];
	itoa(pin, temp2, 2);
	usart_printString("********************** Valore PINB prima dei controlli:      ");
	usart_printString(temp2);
	usart_printString("\r");	
	
	//Setto come default soglia alta
	THRESHOLD_MOTION = 0b11111111;
	
		//Setto il valore del registro FF_MT_THS in base al valore letto sul deepswitch
		if ((pin & 0x08) == 0x08) 
		{
			//Setto la soglia alta
			THRESHOLD_MOTION = 0b11111111;
			usart_printString("***SOGLIA ALTA DIP SWITCH 3");
			usart_printString("\r");
		} else if ((pin & 0x0c) == 0x04)
		{
			//Setto la soglia media
			THRESHOLD_MOTION = 0b00001111;
			usart_printString("**SOGLIA MEDIA DIP SWITCH 2");
			usart_printString("\r");	
		} else if ((pin & 0x0a) == 0x02)
		{
			//Setto la soglia bassa
			usart_printString("*SOGLIA BASSA DIP SWITCH 1");
			usart_printString("\r");
			THRESHOLD_MOTION = 0b00000000;		
		}
	
	usart_printString("SOGLIA da scrivere: ");
	char soglia[8];
	itoa(THRESHOLD_MOTION, soglia, 2);
	usart_printString(soglia);
	usart_printString("\r");
	writeRegister(FF_MT_THS, THRESHOLD_MOTION);

}

Qualcuno sa dirmi perchè mi accade questa cosa?
Io vorrei semplicemente che una volta spento e riacceso il circuito il micro facesse i controlli come da codice.

Grazie.

debug86:
il micro setta automaticamente il valore PINB a 0b11111111, valore che io leggo tramite connessione seriale al pc.

Questo valore è aggiornato? Ti chiedo questo perché nel tuo codice dichiari una variabile pin che incorpora al suo interno il volere istantaneo di PINB, questo va bene se l'utilizzo è immediato, se invece lo vuoi usare come puntatore è un metodo errato.

uint8_t *pin = &PINB;//pin si riferisce all'indirizzo dove è disponibile il valore PINB, al variare di PINB anche *pin varia
uint8_t p = *pin;//p contiene il valore di PINB nel momento in cui viene dichiarato

Questo è l'unico dubbio che mi fa sorgere il tuo codice. Hai dato veramente troppi pochi dettagli, è difficile capire dove si trovi il problema. Inoltre dai per scontato dati che noi non possiamo verificare. Con dai l'allusione che questo valore sia altamente improbabile. Ma se il problema non stesse direttamente nell'AVR?

Mi dispiace ma senza ulteriori informazioni è difficile dire quale sia il problema.