Обсуждаем контроллеры компании Atmel.
Ответить

АЦП. Разбор полётов

Пн авг 13, 2012 18:15:35

Граждане, нуждаюс в Вашей помощчи. Мне надо, в целях саморазвития, запустить ЦАП в АТтини13. Он тама 10-битный. НО! Выход инфы у него через 2 регистра -- ADCL & ADCH. Как их читать. В дате сказано, что для низкой точности хватит и ADCH, а если надо точно, то тут уже и ADCL надо.
ВОПРОС: КАК МНЕ С ЭНТИХ РЕГИСТРОВ СЧИТАТЬ ИНФУ?!

Re: АЦП. Разбор полётов

Пн авг 13, 2012 18:31:15

:facepalm:

Может просто прочитать эти регистры ? Не пробовали ?

Re: АЦП. Разбор полётов

Пн авг 13, 2012 18:38:14

Там АЦП а не ЦАП. Чтение регистров АЦП в R16 и R17:
in R16, ADCL
in R17, ADCH

Re: АЦП. Разбор полётов

Пн авг 13, 2012 19:08:21

Кхэм, я имел в виду, что в них должно быть число. Около 600-700. В зависимости от этого надо зажечь светодиодик -- 600 или 700 и пара промежуточных.
НО! Я препологаю, что надо написать типа:
Код:
if (регистр>700)   // Если насчитал больше 700, зажечь Красный светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}

А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.

Аlex писал(а):Может просто прочитать эти регистры ? Не пробовали ?

С логикой дружу. С Си не очень. . .

Re: АЦП. Разбор полётов

Пн авг 13, 2012 19:15:35

С логикой дружу
Ну если бы дружили, то поняли бы, что старший байт - это каждое 256-ое значение, или в хексе = 0x0100. И Си тут не причём :)
Т.б. Старший байт нужно умножить на 256 (или на 0x100) и сложить с младшим.
Как умножать будете - Ваше право. Можно через сдвиг.
Это самый простой способ...

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:01:21

Хм, то есть что-бы мне получить ОДНО число, надо старший умножит на 256 и прибавить младший.
Код:
x=ADCH*256
y=x+ADCL
if (y>700)   // Если насчитал больше 700, зажечь Красный светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}

Так можно?! А без х и у можно?! Что-то мне кажется я не то сделал. . .

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:28:32

Код:
unsigned int ADC;
ADC = ADCH*256 + ADCL;

Код:
unsigned int ADC;
ADC = (unsigned int)ADCH<<8 | ADCL;

Код:
unsigned int ADC;
*((unsigned char*)&ADC)=ADCL;
*((unsigned char*)&ADC+1)=ADCH;

Код:
unsigned int ADC;
unsigned char *p_b = (unsigned char *)&ADC;
*p_b++ = ADCL;
*p_b  = ADCH;

........
........
........

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:32:45

Ага, значи всё таки можно в оду строку. Понял, пасиба.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:42:13

Главное не количество строк исходника, а то, во что развернёт это всё компилятор.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:44:06

Код:
#define F_CPU 8000000 // Инициализация
#include <io.h>
#include <delay.h>

// Declare your global variables here

void main (void)
{
DDRB=0b011011;
PORTB=0b10010;
ADMUX=00000001;
#asm("sei");
{
ADCSRA=11000000;
unsigned int ADC;
ADC = ADCH*256 + ADCL;
if (ADC>700)   // Если насчитал больше 700, зажечь Синий светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}
else if (ADC>670)   // Если более 670, то Зелёный
{
PORTB=000010;
delay_ms(2000);
PORTB=000000;
}
else if (ADC>630)  // Если хоть более 630, то Жёлтый
{
PORTB=010000;
delay_ms(2000);
PORTB=000000;
}
else if (ADC<630)  // А если менее 600, то Красный!
{
PORTB=001000;
delay_ms(2000);
PORTB=000000;
}
}
}

Вотъ, что вышло. Есть грубые ошибки?! А не очень?!
Последний раз редактировалось просто КОТ Пн авг 13, 2012 21:50:43, всего редактировалось 1 раз.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:48:04

// Если хоть более 630, то Жёлтый
// А если менее 600, то Красный!
А если от 600 до 630 ? :))

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:51:46

Если эта самая грубая, то вроде всё норм. Только вот нервничаю по поводу запуска АЦП -- правильно ли я записал регистр. . .

Re: АЦП. Разбор полётов

Пн авг 13, 2012 21:59:35

Разве ADC - это не имя регистра АЦП?
Код:
ADC = ADCH*256 + ADCL;

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:03:08

Вроде там с добавками. НО! Ради антиреса можно дописать букаффку. Например ADCC!

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:08:56

Посмотрел в WinAVR - ADC и ADCW - 16-и разрядный регистр данных АЦП.
В CodeVision - только ADCW.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:10:27

U235 писал(а):Разве ADC - это не имя регистра АЦП?
Кстати, может быть. Возможно, он уже объявлен как 2-х байтная переменная по соотв. адресу, и компиль поймёт его.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:12:28

Так что, оставлять?!

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:15:04

Зависит от компилятора. Попробуйте, не объявляя эту переменную (ADC), поработать с ней. Если ошибок не будет, значит всё в порядке.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:16:02

О.К.

Re: АЦП. Разбор полётов

Пн авг 13, 2012 22:17:54

И ещё, Вы забыли
while(1){
.....
.....
.....
}
Ответить