Atmega8 - vlastní rutina pro AD převodník

ahoj do uC jsem nahral tento program a podle simulatoru by mel fungovat. problem ale je ze nejede. nejsem si jisty, jestli mam spravne zapojeny napajeni prevodniku. Do AVCC mam pres tlumivku napajeni +5V a zaroven vyvod mam spojen pres kondenzator do GND. AREF mam pres kondenzator na GND. Kondenzatory jsem pouzil 1uF elektrolyt. keramickej nemam. Muze byt problem v tom kondenzatoru? Nebo v programu. Dik moc za rady.

[code]#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

#define LED_1_ON PORTD |= (1<<PD2) //LED 1 zapnout
#define LED_1_OFF PORTD &= ~(1<<PD2) //LED 1 vypnout
#define LED_2_ON PORTD |= (1<<PD3)
#define LED_2_OFF PORTD &= ~(1<<PD3)

#define SENSOR_REF sensor[0] // citlivost

#define SENSOR_L sensor[1] // levy senzor
#define SENSOR_C sensor[2] // stredni senzor
#define SENSOR_R sensor[3] // pravy senzor

#define NONE 0

#define READ_SENSORS read_sensors();

#define WAIT(x) _delay_ms(x)

volatile unsigned int sensor[4];

void read_sensors(void)
{
volatile int i;
for(i=0; i<4; i++)
{
ADMUX = i;
ADCSRA |= (1<< ADSC);
while(ADCSRA & 0x10)
;
ADCSRA |= (1<< ADIF);
sensor* = ADCW;
}

for(i=1; i < 4; i++)
{
  if(SENSOR_REF > sensor*)
	  sensor* = NONE;
}

}

int main(void)
{

ADMUX = 0;
ADCSRA |= (1<<ADEN) |(1 << ADPS1) |(1 << ADPS0);

DDRB |= (1 << DDB1) |(1 << DDB2);
DDRD |= (1 << DDD2) |(1 << DDD3) |(1 << DDD6) |(1 << DDD7);

while(1)
{

	read_sensors();
	if(SENSOR_R > 0) 
		LED_2_ON;
	else 
		LED_2_OFF;

	if(SENSOR_L > 0)
		LED_1_OFF;
	else 
		LED_1_ON;

}

return 0;
}
[/code]

:arrow_right: administrator: přejmenováno z “Atmega8 - AD prevodnik”***

Zápisem ADMUX = i říkáš krom výběru vstupu také to, že má být použita externí reference. Podle popisu tam ovše žádnou nemáš.
REFS1:0=00 “REF, Internal Vref turned off”

to znamena ze na AREF mam pripojit +5V ?

Nemusíš, stačí to nastavit na interní referenci.

[code]#include <avr/io.h>
//#include <util/delay.h>
// FCPU = 1MHz

#define LED_1_ON PORTD |= (1<<PD2) //LED 1 zapnout
#define LED_1_OFF PORTD &= ~(1<<PD2) //LED 1 vypnout
#define LED_2_ON PORTD |= (1<<PD3)
#define LED_2_OFF PORTD &= ~(1<<PD3)

unsigned int senzory[4];

void readSenzors(unsigned int senz)
{
//
unsigned char i;
for(i=0; i<4; i++)
{
ADMUX &= 0xF0; // zachovat nastavení reference, ostatní smazat
ADMUX |= i; // vybrat vstup
ADCSRA |= (1 << ADSC); // start konverze
while(!(ADCSRA & (1<<ADIF))); // počkat na dokončení konverze
ADCSRA |= (1<<ADIF); // vynulovat flag (nuluje se zápisem “1”)
senz
= ADC;
}
for(i=1; i<4; i++)
{
if(senz* < senz[0]) senz* = 0;
}
}

void main(void)
{
ADMUX = (1<<REFS1) | (1<<REFS0); // vybran vstup 0, interní reference 2.56V
// doporučená Fadc <50, 200> kHz. 1MHz/200kHz = 5 -> minimální dělička je 8
ADCSRA |= (1<<ADEN) | (1 << ADPS1) | (1 << ADPS0);

DDRD |= (1 << DDD2) |(1 << DDD3);

for(;;)
{
	readSenzors(senzory); 
	if(senzory[1]) LED_2_ON; 
	else LED_2_OFF; 

	if(senzory[3]) LED_1_OFF; 
	else LED_1_ON; 
}

}
[/code]
V simulátoru to chodí.***