Easyelectronics.ru

Электроника для всех
Текущее время: 20 янв 2021, 22:09

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Проблема при чтении результата АЦП
СообщениеДобавлено: 31 янв 2010, 20:00 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Микроконтроллер 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 /* ïîðò äàíèõ ³íäèêàòîðà */
#define COLS PORTD /* ïîðò êåðóâàííÿ ³íäèêàòîðàìè */

#define t1 1 // 1 ms èçìèðåíèå
#define t2 250 // 250 ms îáíîâëåíèå ðåçóëüòàòà
#define t3 8 // 8 ms äèíàìè÷åñêàÿ èíäèêàöèÿ (1/8 ìñ)=125Ãö.!25/3=41Ãö
volatile unsigned char time1, time2, time3;
// Â ýòèõ ïåðåìåííûõ õðàíÿòñÿ öèôðû, êîòîðûå íóæíî îòîáðàçèòü
volatile unsigned char Disp0, Disp1, Disp2;
unsigned 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 initialize(void)
{
DDRB=0xFF; // 1111 1111
DDRD |= _BV(0)|_BV(1)|_BV(2);
PORTD|=_BV(D2); // ³í³ö³àë³ç. äèí. ³íäèêàö³¿
ADMUX=1<<ADLAR|1<<REFS0|1<<REFS1;
ADCSR=1<<ADEN|1<<ADPS2|ADPS1;
TIMSK=1<<OCIE1A;
OCR1AL=125;
TCCR1B =(_BV(WGM12)|_BV(CS11)|_BV(CS10));
TCNT1H=0x00 ;
TCNT1L=0x00 ;

}

// Ôóíêöèÿ âûäåëÿåò öèôðû èç òðåõçíà÷íîãî ÷èñëà Number
inline void Display(unsigned int volt)
{
unsigned char Num1, Num2, Num3;
Num1=Num2=0;
while (volt >= 100)
{
volt -= 100;
Num1++;
}
while (volt >= 10)
{
volt -= 10;
Num2++;
}
Num3 = volt;
Disp2 = Dig[Num1];
Disp1 = Dig[Num2];
Disp0 = Dig[Num3];

}

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

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


void task1() //èçìåðåíèå è îáðàáîòêà
{
volatile unsigned char Ain;
volatile unsigned char sample;
volatile unsigned 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()
{

Display(volt);
}

void task3() //äèíàìè÷åñêàÿ èíäèêàöèÿ
{
time3 = t3;
if (COLS &_BV(D2))
{
COLS &=~_BV(D2); //off "2"
COLS &=~_BV(D1); //off "1" "îäèíèö³"
COLS |=_BV(D0); //on "0"
ROWS=Disp0;
}
else if (COLS &_BV(D0))
{
COLS &=~_BV(D0); // off"0"
COLS &=~_BV(D2); // off"2" "äåñÿòêè"
COLS |=_BV(D1); // on ""
ROWS=Disp1;
}
else if (COLS &_BV(D1))
{
COLS &=~_BV(D1); // off "1"
COLS &=~_BV(D0); // off "0" "ñîòí³"
COLS |=_BV(D2); // on "2"
ROWS=Disp2 ;
}
}


Вложения:
task.zip [46.48 Кб]
Скачиваний: 213
task0.zip [30.57 Кб]
Скачиваний: 217
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема при чтении результата АЦП
СообщениеДобавлено: 01 фев 2010, 14:47 
Старожил
Аватара пользователя

Зарегистрирован: 01 фев 2010, 01:48
Сообщения: 263
Откуда: Харьков
ADCSR|=1<<ADCS;
while (ADCSR&ADCS);

бит называется ADSC
условие в while неправильное, надо так:
while (ADCSR & (1 << ADSC) ;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема при чтении результата АЦП
СообщениеДобавлено: 01 фев 2010, 22:59 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
hellraiser писал(а):
ADCSR|=1<<ADCS;
while (ADCSR&ADCS);

бит называется ADSC
условие в while неправильное, надо так:
while (ADCSR & (1 << ADSC) ;


Спасибо! на "while (ADCSR&ADCS);" компилятор даже не ругнулся-и очень трудно было найти в чем проблема!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB