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.