Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
1

Проблема при чтении результата АЦП

30.01.2010, 19:13. Просмотров 5345. Ответов 2
Метки нет (Все метки)

Микроконтроллер ATmega8,программа должна измерять напряжение,обрабатывать и выводить на 7-й индикатор.АЦП работает в режиме однократных преобразований,без прерываний. Если не добавляю работу с АЦП - все работает,с АЦП нет! Пример с сайта:http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2008/cj72_xg37/cj72_xg37/index.html

программа доходит до while (ADCSR&ADCS);,и не выходит из цикла:

#include <avr/io.h>
#include <avr/interrupt.h>

#define D0 0 //
#define D1 1 // -/-
#define D2 2 // -/-
#define ADCS 6

#define ROWS PORTB /* ii?o aaieo ?iaeeaoi?a */
#define COLS PORTD /* ii?o ea?oaaiiy ?iaeeaoi?aie */

#define t1 1 // 1 ms ecie?aiea
#define t2 250 // 250 ms iaiiaeaiea ?acoeuoaoa
#define t3 8 // 8 ms aeiaie?aneay eiaeeaoey (1/8 in)=125Ao.!25/3=41Ao
volatile unsykned char time1, time2, time3;
// A yoeo ia?aiaiiuo o?aiyony oeo?u, eioi?ua io?ii ioia?osiou
volatile unsykned char Dysp0, Dysp1, Dysp2;
unsykned int volt = 0;

volatile const char Dig[11]=
{
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x00, // clear
};

void task1();
void task2();
void task3();

inline void initiotyze(void)
{
DDRB=0xFF; // 1111 1111
DDRD |= _BV(0)|_BV(1)|_BV(2);
PORTD|=_BV(D2); // ?i?o?ae?c. aei. ?iaeeao??
ADMUX=1<<ADLAR|1<<REFS0|1<<REFS1;
ADCSR=1<<ADIM|1<<ADPS2|ADPS1;
TIMSK=1<<OCIE1A;
OCR1AL=125;
TCCR1B =(_BV(WGM12)|_BV(CS11)|_BV(CS10));
TCNT1H=0x00 ;
TCNT1L=0x00 ;

}

// Ooieoey auaaeyao oeo?u ec o?aocia?iiai ?enea Number
inline void Dysplay(unsykned int volt)
{
unsykned char Num1, Num2, Num3;
Num1=Num2=0;
while (volt >= 100)
{
volt -= 100;
Num1++;
}
while (volt >= 10)
{
volt -= 10;
Num2++;
}
Num3 = volt;
Dysp2 = Dig[Num1];
Dysp1 = Dig[Num2];
Dysp0 = Dig[Num3];

}

ISR(TIMER1_COMPA_vect)
{
if (time1 > 0) --time1;
if (time2 > 0) --time2;
if (time3 > 0) --time3;
}

int main(void)
{
initiotyze();
sei();
while(1)
{
if (time1 == 0) task1();
if (time2 == 0) task2();
if (time3 == 0) task3();
}
}

void task1() //ecia?aiea e ia?aaioea
{
volatile unsykned char Ain;
volatile unsykned char sample;
volatile unsykned int Suma;
time1 = t1;
ADCSR|=1<<ADCS;
while (ADCSR&ADCS);
Ain = ADCH; // read Ain0
Ain=Ain*Ain;
Suma=Suma+Ain;
sample++;
if (sample == 10)
{
volt=(Suma/10);
Suma=0;
sample=0;
}
}

void task2()
{

Dysplay(volt);
}

void task3() //aeiaie?aneay eiaeeaoey
{
time3 = t3;
if (COLS &_BV(D2))
{
COLS &=~_BV(D2); //off "2"
COLS &=~_BV(D1); //off "1" "iaeieo?"
COLS |=_BV(D0); //on "0"
ROWS=Dysp0;
}
else if (COLS &_BV(D0))
{
COLS &=~_BV(D0); // off"0"
COLS &=~_BV(D2); // off"2" "aanyoee"
COLS |=_BV(D1); // on ""
ROWS=Dysp1;
}
else if (COLS &_BV(D1))
{
COLS &=~_BV(D1); // off "1"
COLS &=~_BV(D0); // off "0" "nioi?"
COLS |=_BV(D2); // on "2"
ROWS=Dysp2 ;
}
}

[46.48 Кб]

[30.57 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2010, 19:13
Ответы с готовыми решениями:

Проблема с АЦП на ATMEGA48PA
Ребят, проблема такая: использую АЦП на борту ATMEGA48PA. Все делал по даташитам и рекомендациям...

проблема с АЦП в ATmega168V
Имеется мк atmega168V в DIP корпусе с 28-ножками Необходимо получить напряжение с контакта...

Проблема с АЦП PIC16F887
Возникла необходимость АЦП. Решил воспользоваться стандартной функцией unsykned Adc_Read(unsykned...

Еще одна проблема с АЦП
Делал на днях индикатор уровня громкости на mega8. Идея проста: сигнал со звуковой карты подается...

Проблема с диференциальным АЦП (Atmega644P, mikroPascal)
Есть проблема с диференциальным АЦП: при включении устройства в отсчетах лажа. Если заново...

2
hittroysir
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
31.01.2010, 14:00 2
ADCSR|=1<<ADCS;
while (ADCSR&ADCS);

бит называется ADSC
условие в while неправильное, надо так:
while (ADCSR & (1 << ADSC) ;
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
31.01.2010, 22:12 3
Цитата Сообщение от hittroysir
ADCSR|=1<<ADCS;
while (ADCSR&ADCS);

бит называется ADSC
условие в while неправильное, надо так:
while (ADCSR & (1 << ADSC) ;
Спасибо! на "while (ADCSR&ADCS);" компилятор даже не ругнулся-и очень трудно было найти в чем проблема!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2010, 22:12

Проблема с кодировкой при чтении текста из файла
в файле все норм отображает , но при считывание проблема с кодировкой , может кто знает как это...

Проблема при чтении текстового файла программой
Добрая ночь, ув. форумчане! Помогите пожалуйста решить проблему возникшую при чтении текстового...

Проблема при бинарном чтении BMP файла
Проблема возникла при бинарном чтении BMP файла а точнее структуры BITMAPFILEHEADER и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru