Есть вот такая схема и программа, на Atmega8 порт В нормально работал, но здесь,на Atmega32A, почему-то не реагирует, подскажите где ошибка. При изменении на фоторезисторе на порту В должен появляться сигнал, но там как есть логически 0 так и остается, меняй не меняй значение.На порт РВ0 подключал светодиод, при изменении, в протеусе, значения фоторезистора, светодиод загорался - это было на 8, а вот на 32А не хочет, даже по ножкам видно, что на порту постоянно 0, не включается 1, а мне на ПК нужно как раз ловить значения или 0 или 1.
CODE: #define F_CPU 12000000
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
void presets()
{
DDRB=0xFF;
PORTB=0x00;
//Настройка АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействование АЦП
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //установка делителя 128, т.е. равно 64кГц
//ADMUX
ADMUX |= (1<<REFS1) | (1<<REFS0); //выбор внутреннего опорного напряжения 2.56В
}
int readADC(unsigned int ch)
{
unsigned char set_admux=ADMUX;
set_admux &= ~ ((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0)); //выбор вывода ADC0 путём записи 0 в 4 бита
switch(ch)
{
case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0)); break;
default: break;
}
ADMUX = set_admux;
_delay_ms(10);
int foo = 0;
for(int i=0;i<40;i++)
{
ADCSRA |= (1<<ADSC); //Запуск преобразования
while ((ADCSRA&(1<<ADSC))); //ожидание окончания преобразования
foo += ADC;
}
return foo/40;
}
int main(void)
{
presets();
while(1)
{
//TODO:: Please write your application code
int tmp=readADC(0);
if(tmp<=600)
{
PORTB=0x00;
_delay_ms(200);
}
else
{
PORTB=0xFF;
_delay_ms(200);
}
int tmp1=readADC(1);
if(tmp1<=600)
{
PORTB=0x00;
_delay_ms(200);
}
else
{
PORTB=0xFF;
_delay_ms(200);
}
}
} Прикреплено изображение
|