Actualmente estoy trabajando en un sistema basado en un microcontrolador, el problema al que me enfrento es que mis pines de entrada 40 y 39 de atmega32 se están elevando internamente, Pin40 muestra 2.5 voltios y Pin39 muestra 5 voltios en mi voltímetro. Por lo que entiendo, los pines se están poniendo altos debido al código, pero lo he comprobado varias veces, pero todavía no puedo resolver el problema con mi código. Incluyo el diagrama y el código del circuito también. ¿Puede alguien indicar cómo mis pines de entrada muestran voltajes?
#ifndefF_CPU#defineF_CPU16000000UL//16MHzclockspeed#endif#defineD0eS_PORTD0#defineD1eS_PORTD1#defineD2eS_PORTD2#defineD3eS_PORTD3#defineD4eS_PORTD4#defineD5eS_PORTD5#defineD6eS_PORTD6#defineD7eS_PORTD7#defineRSeS_PORTC6#defineENeS_PORTC7#include<avr/io.h>#include<util/delay.h>#include"lcd.h"
void Init_ADC(void)
{
ADMUX|=(1<<REFS0);
ADMUX&=~((1<<REFS1)|(1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3)|(1<<MUX4));
// SELECTING CHANNEL0
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);
// NORMAL CONVERSION WITHOUT INTERRUPT
ADCSRA&=~((1<<ADSC)|(1<<ADATE)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS1));
// CLOCK/32 SPEED
}
unsigned int Read_ADC(uint8_t ch)
{
ADMUX&=0b11111000;
ch=ch&0b00000111;
ADMUX|=ch;
//Start Single Conversion
ADCSRA|= (1<<ADSC);
// Wait for conversion to complete
while(ADCSRA & (1<<ADSC));
// Clear ADIF by writing one to it
//ADCSRA|=(1<<ADIF);
return(ADCW);
}
void Wait()
{
uint8_t i;
for(i=0;i<20;i++)
_delay_loop_2(0);
}
int main(void)
{
int v,v1,v2,vref;
vref = 409;
DDRD = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
Init_ADC();
Lcd8_Init();
while(1)
{
v2 = Read_ADC(1);
if(v2>=900)
{
Lcd8_Set_Cursor(1,1);
vref = Read_ADC(0);
Lcd8_Write_String(" Ref. Set");
_delay_ms(2000);
Lcd8_Clear();
}
else
{
Lcd8_Set_Cursor(1,1);
v1=Read_ADC(0);
if(v1>=1.05*vref)
{
v=0x01;
Lcd8_Write_String(" HIGH");
}
else if(v1<=0.95*vref)
{
v=0x01;
Lcd8_Write_String(" LOW");
}
else
{
v=0x00;
Lcd8_Write_String(" OK");
}
PORTB=v;
//Wait();
_delay_ms(2000);
Lcd8_Clear();
}
}
}
¡Gracias a todos por adelantado!