Прошу помощи сообщества!
Я учксь программировать ATtiny13. Уже получилось написать первую программу, зашить ее и увидеть моргающий светодиод. Теперь надо получить данные от АЦП. Но что-то не выходит. Подскажите, пожалуйста, где сидит козявка!
АЦП запускается разово, обработка прерываний не используется. Ловим бит завершения цикла преобразования
Код
#include <avr/io.h>
#define BitSet(x,y) x|=(1 << y)
#define BitDrop(x,y) x&=~(1 << y)
char AAA;
void Delay_us(int US)
{
for (int i = 0; i<=US; ++i)
{
asm("nop");
}
}
void Delay_ms(int MS)
{
for (int i = 0; i<=MS; ++i)
{
Delay_us(900);
}
}
char BitTest(unsigned aValue, unsigned aNumber)
{
if( aValue & (1 << aNumber)) {return(1);} else {return(0);}
}
char ReadAnalog(char pin)
{
BitDrop(ADMUX,MUX0);
BitDrop(ADMUX,MUX1);
switch (pin)
{
case 1:
{
BitSet(ADMUX,MUX0);
}
break;
case 2:
{
BitSet(ADMUX,MUX1);
}
break;
case 3:
{
BitSet(ADMUX,MUX0);
BitSet(ADMUX,MUX1);
}
break;
}
BitDrop(ADMUX,REFS0); // Vref = Vcc
BitSet(ADCSRA,ADLAR); // форматирование выходных данных левое
BitDrop(ADCSRA,ADIE); // не используем прерывания
BitDrop(ADCSRA,ADATE); //
ADCSRA = (1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); // предделитель = 128
DIDR0 |= (1 << ADC3D); // запрещаем цифровой вход на ноге аналогового входа
BitSet(ADCSRA,ADEN); // включаем АЦП понеслась!
// Ждем окончания преобразования
while (BitTest(ADCSRA,ADSC) == 1);
char a = ADCH;
char b = ADCL;
BitDrop(ADCSRA,ADEN); // выключаем АЦП
return(a);
}
int main(void)
{
BitSet(DDRB,4); // выход данных
BitDrop(DDRB,3); // измеритель напряжения
while (1)
{
//моргаем светодиодом с частотой, пропорциональной данным от АЦП
AAA = ReadAnalog(3);
BitDrop(PORTB,4); // выкл светодиод
Delay_ms(AAA);
BitSet(PORTB,4); // вкл светодиод
Delay_ms(AAA);
}
}
часть строк пока отключена. Когда получится взять правильно данные, можно уже говорить и о правильном соединении двух байт в слово...