реклама на сайте
подробности

 
 
> ОДнократное преобразование в ATMEGA8
virtuality
сообщение May 18 2006, 14:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Вот пример программы:
Код
char lcd_buffer[33];    
int temp=0;

#asm
    .equ __lcd_port=0x18
#endasm
#include<lcd.h>
#include<stdio.h>
#include <90s8535.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x00

interrupt [ADC_INT] void adc_isr(void)
{
temp=ADCW;
delay_ms(20);
ADCSR|=0x40;
     lcd_clear();
     sprintf(lcd_buffer,"%imV",(temp*5-temp/10));
     lcd_puts(lcd_buffer);    
}

void main(void)
{


ADCSR=0x8E;
#asm("sei")
ADMUX=0;

ADCSR|=0x40;
lcd_init(16);
    while (1)
       {
       }
      
}



В принципе все понятно, но как мне сделать однократное преобразование по команде ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
virtuality
сообщение May 18 2006, 19:42
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Сделал. Компилятор не ругается. Но в ходе отладки установлено, что программа виснет в цикле while ( ADCSRA & (1 << ADIF) );

Стал я дальше ковырять.
Ну вот это мне совсем не понятно...
Залез я в генератор кода в CodeVision. Сгенерировал.
Установил источником опорного напряжения AVCC.
В коде появилась такая строчка : #define ADC_VREF_TYPE 0x40

ОДнако ниже есть еще вот что: ADMUX=ADC_VREF_TYPE;

Что же это получается.... Я думал что ADMUX - это номер канала ADC0,
ADC1... То есть тот пин, куда подается измеряемое напряжение.

Так... надо подучить матчасть. Почитал я все что нашел на эту тему,
некоторые моменты остались непонятны. Если несложно проясните их для меня.


1. Для чего необходима установка частоты АЦП? Правильно ли я думаю, чтоэ
АЦП работает как отдельный блок, помещая результат в регистр, из которого мы читаем впоследсвии?
Или же АЦП спит, а когда мы ставим бит в ADSC он включается, конвертирует, возвращает результат?
ТОгда в этом случает непонятно для чего нужен этот параметр - частота.

2. Источник опорного напряжения. Что надо сделать? Подключить к плюсу AREF и AVCC? И что лучше выбрать потом - AREF или внутренний опорник?


P.S. ПРошу прощения, если кому мои вопросы покажутся глупыми.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 18 2006, 20:43
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(virtuality @ May 18 2006, 22:42) *
Сделал. Компилятор не ругается. Но в ходе отладки установлено, что программа виснет в цикле while ( ADCSRA & (1 << ADIF) );

Прошу прощения, ошибся:

while ( (ADCSRA & (1 << ADIF))==0 ) ;


Цитата
ОДнако ниже есть еще вот что: ADMUX=ADC_VREF_TYPE;



ADC_VREF_TYPE = 0x0; // ARef
ADC_VREF_TYPE = 0x40; // AVcc
ADC_VREF_TYPE = 0xC0; // internal ref

Вам сгодится последний 0xC0 (при этом Pin ARef нужно оставить неподключенным),
про ADMUX написано на стр. 202-203.

Цитата
1. Для чего необходима установка частоты АЦП?

Для того чтобы обеспечить оптимальное время преобразования взависимости от кварца.
Если установить частоту преобразования сильно низкую, то за время одиночного преобразования сигнал на входе может многократно измениться и результат преобразования получится недостоверным. Если же частоту преобразования поставить сильно высокую, АЦП также даст неверный результат. Необходимо подбирать предделитель, который задается битами ADPS2..0 регистра ADCSRA так, чтобы частота преобразования была в районе 100-150 khz (10-15ksps).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016