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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 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.RU
 
Регистрация: 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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: АЦП на Атмега8 и УАРТ - помогите

AsSoul, Я бы попробовал так:
while(1) {
putchar(read_adc(x)››2);
delay_ms(10...100);
}
Двухбитовый сдвиг - убираем лишние.
При конфигурировании проекта визадом - разрешить прерывания Тх, сгенерируется в "рыбе" putchar().
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor на форуме  
Непрочитано 27.03.2013, 19:43  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
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, время: 23:42.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot