Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

АЦП на Атмега8 и УАРТ - помогите

Непрочитано 27.03.2013, 17:36  
AsSoul
Частый гость
 
Регистрация: 27.03.2013
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AsSoul на пути к лучшему
Печаль АЦП на Атмега8 и УАРТ - помогите

Дорогие знатоки, помогите чем можете. А откровенно говоря спасайте.
Преподаватель поставил такую задачу:
Есть МК атмега8 (16 МГц), к РС2 подключен потенциометр (переменный резистор на 10 кОм), необходимо инициировать внутр АЦП микроконтроллера провести преобразование и отправить результат в ком порт(для этого используем УАРТ скорость 9600 бод). Результаты должны пересылаться постоянно с некоторой задержкой (10-100 мс). В идеале нужно, чтобы все это происходило по прерыванию.

Я попыталась написать программу (прилагаю ее ниже). Но она не корректно выводит данные. (Начала изучать CodeVision недели 2 назад(((( )
Выдает на терминальнике где-то от 120 до 140. А должна от 0 до 255.
Помогите. Очень прошу. Спасите. Я в отчаянии.....


#include ‹mega8.h›
#include ‹delay.h›
// Standard Input/Output functions
#include ‹stdio.h›

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here


// Port B initialization (Все ножки - вход)
PORTB=0x00;
DDRB=0x00;

// Port C initialization (Все ножки - вход)
PORTC=0x00;
DDRC=0xFF;
//DDRC=0x70;

// Port D initialization (PD1 - выход)
PORTD=0x02;
DDRD=0x02;

// Timer/Counter 0 initialization
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

/* USART initialization Communication Parameters: 8 Data, 1 Stop, No Parity
USART Receiver: Off USART Transmitter: On
USART Mode: Asynchronous USART Baud Rate: 9600
*/
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// Only the 8 most significant bits of
// the AD conversion result are used
//ADMUX=ADC_VREF_TYPE & 0xff;
//ADCSRA=0x84;
ADMUX = 0b01000010; // 1-2.REFS1=0, REFS0=1 - выбор ИОН, 3.ADLAR=0 - выравнивание рез-та вправо, 4.зарезервировано=0, 5-8.MUX3...0 - выбор канала АЦП - MUX=0010 - ADC2(РС2)
ADCSRA=0xAF; // 1010 1111 (1.ADEN=1 -разрешение АЦП, 2.ADSC=0 - запуск преобр-я, 3.ADFR - выбор режима АЦП, 4.ADIF=0 - флаг прерывания компаратора, 5.ADIE=1 - разрешение прерывания от компаратора, остальные 3 - выбор частоты преобраз-я)

while (1)
{
unsigned int ad;
delay_ms(30);
ADCSRA |= (1 ‹‹ ADSC); //Начинаем преобразование
while ((ADCSRA&(1 ‹‹ ADIF))== 0); //Ждем флага окончания преобразования

//ad = (unsigned char) (ADCW);
ad = (ADCL|ADCH ‹‹ ; // Считываем ADC
//delay_ms(30); //задержка
while(!(UCSRA&1‹‹(UDRE)));
UDR=ad;
//UDR='a';
delay_ms(60);


};
}



Пы.Сы.: программу писала с помощью визарда, поэтому там куча не нужного кода еще по идее(((((
Вложения:
Тип файла: rar adc_usart.rar (16.0 Кб, 51 просмотров)
Реклама:
AsSoul вне форума  
Непрочитано 27.03.2013, 18:06  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от AsSoul Посмотреть сообщение
Дорогие знатоки, помогите чем можете. А
while (1)
{
unsigned int ad;
delay_ms(30);
ADCSRA |= (1 ‹‹ ADSC); //Начинаем преобразование
while ((ADCSRA&(1 ‹‹ ADIF))== 0); //Ждем флага окончания преобразования

//ad = (unsigned char) (ADCW);
ad = (ADCL|ADCH ‹‹ ; // Считываем ADC
//delay_ms(30); //задержка
while(!(UCSRA&1‹‹(UDRE)));
UDR=ad;
//UDR='a';
delay_ms(60);


};
}


я

Результат преобразования - друхбайтовое число от 0 до 1023 (unsigned short). Вы в уарт передаёте только 1 байт (младший наверное) - UDR=ad;.
Если хотите чтобы был один байт результата - настройте АЦП соответственно (ADLAR=1) и читайте старший байт результата.
Код:
unsigned char ad=ADCH;
UDR0=ad;
_Артём_ вне форума  
Непрочитано 27.03.2013, 18:31  
AsSoul
Частый гость
 
Регистрация: 27.03.2013
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AsSoul на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от _Артём_ Посмотреть сообщение
я

Результат преобразования - друхбайтовое число от 0 до 1023 (unsigned short). Вы в уарт передаёте только 1 байт (младший наверное) - UDR=ad;.
Если хотите чтобы был один байт результата - настройте АЦП соответственно (ADLAR=1) и читайте старший байт результата.
Код:
unsigned char ad=ADCH;
UDR0=ad;
дело в том, что когда ставила ADLAR=1, то в терминальнике показывались вообще только первые(последние) два бита и все.

не пойму почему значения у меня приходят только от 120 до 140
AsSoul вне форума  
Непрочитано 27.03.2013, 18:47  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от AsSoul Посмотреть сообщение
не пойму почему значения у меня приходят только от 120 до 140
У вас сом-порт вместо двух байт передаётся один. И что вы ожидаете увидеть тогда?
_Артём_ вне форума  
Непрочитано 27.03.2013, 19:23  
AsSoul
Частый гость
 
Регистрация: 27.03.2013
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AsSoul на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от _Артём_ Посмотреть сообщение
У вас сом-порт вместо двух байт передаётся один. И что вы ожидаете увидеть тогда?
А как же отправить два?!
AsSoul вне форума  
Непрочитано 27.03.2013, 19:37  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

AsSoul, Я бы попробовал так:
while(1) {
putchar(read_adc(x)››2);
delay_ms(10...100);
}
Двухбитовый сдвиг - убираем лишние.
При конфигурировании проекта визадом - разрешить прерывания Тх, сгенерируется в "рыбе" putchar().
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 27.03.2013, 19:43  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от AsSoul Посмотреть сообщение
А как же отправить два?!
Код:
UDR=ad&0xFF;
UDR=ad››8;
_Артём_ вне форума  
Непрочитано 27.03.2013, 19:47  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

AsSoul, а зачем два?? От 0 до 255 - один байт!
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 27.03.2013, 19:54  
AsSoul
Частый гость
 
Регистрация: 27.03.2013
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AsSoul на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

Сообщение от _Артём_ Посмотреть сообщение
Код:
UDR=ad&0xFF;
UDR=ad››8;
Сообщение от akegor Посмотреть сообщение
AsSoul, Я бы попробовал так:
while(1) {
putchar(read_adc(x)››2);
delay_ms(10...100);
}
Двухбитовый сдвиг - убираем лишние.
При конфигурировании проекта визадом - разрешить прерывания Тх, сгенерируется в "рыбе" putchar().
Спасибо! Я попробую!


Сообщение от akegor Посмотреть сообщение
AsSoul, а зачем два?? От 0 до 255 - один байт!
Ну мне ранее, в сообщении №4 посоветовали два отправлять.

У меня почему-то в терминальнике выдает значения (при изменении сопротивления резистора от мин до макс) - от 120 до 140, а должен бы от 0 до 255. Как же тогда это исправить, если не два байта отправлять?!(
AsSoul вне форума  
Непрочитано 27.03.2013, 20:06  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

AsSoul, "У меня почему-то в терминальнике выдает значения (при изменении сопротивления резистора от мин до макс) - от 120 до 140, а должен бы от 0 до 255. Как же тогда это исправить, если не два байта отправлять?!(" - Поконкретней можно исходное задание? Отправлять нужно 0...255 или 0...1023, в бинарном или ASCII, в десятичном или hex виде? Честно говоря, не хочется вникать в "120...140". Так, как я написал - будет выводить в терминал один байт (бинарный).
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
 

Метки
атмега8, ацп, уарт
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с АЦП putmannn Электроника - это просто 5 19.09.2011 20:43
Несчастный УАРТ jakuchma Микроконтроллеры, АЦП, память и т.д 52 10.02.2011 17:36
Кто по дзс1768 поможет? уарт не пашет индюк Микроконтроллеры, АЦП, память и т.д 0 14.01.2011 02:31
[Решено] Помогите опознать АЦП ? sh2cer Информация по радиокомпонентам 2 08.12.2009 17:12
Proteus 7.1sp4 и АТмега8 ARM7TDMI Микроконтроллеры, АЦП, память и т.д 1 26.03.2008 16:52


Часовой пояс GMT +4, время: 00:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.