Страница 1 из 13
АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 18:15:35
просто КОТ
Граждане, нуждаюс в Вашей помощчи. Мне надо, в целях саморазвития, запустить ЦАП в АТтини13. Он тама 10-битный. НО! Выход инфы у него через 2 регистра -- ADCL & ADCH. Как их читать. В дате сказано, что для низкой точности хватит и ADCH, а если надо точно, то тут уже и ADCL надо.
ВОПРОС: КАК МНЕ С ЭНТИХ РЕГИСТРОВ СЧИТАТЬ ИНФУ?!
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 18:31:15
Аlex
Может просто прочитать эти регистры ? Не пробовали ?
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 18:38:14
Ser60
Там АЦП а не ЦАП. Чтение регистров АЦП в 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
Аlex
С логикой дружу
Ну если бы дружили, то поняли бы, что старший байт - это каждое 256-ое значение, или в хексе = 0x
0100. И Си тут не причём
Т.б. Старший байт нужно умножить на 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
Аlex
Код: Выделить всё
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
Аlex
Главное не количество строк исходника, а то, во что развернёт это всё компилятор.
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;
}
}
}
Вотъ, что вышло. Есть грубые ошибки?! А не очень?!
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 21:48:04
Аlex
// Если хоть более 630, то Жёлтый
// А если менее 600, то Красный!
А если от 600 до 630 ?

Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 21:51:46
просто КОТ
Если эта самая грубая, то вроде всё норм. Только вот нервничаю по поводу запуска АЦП -- правильно ли я записал регистр. . .
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 21:59:35
U235
Разве ADC - это не имя регистра АЦП?
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:03:08
просто КОТ
Вроде там с добавками. НО! Ради антиреса можно дописать букаффку. Например ADCC!
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:08:56
U235
Посмотрел в WinAVR - ADC и ADCW - 16-и разрядный регистр данных АЦП.
В CodeVision - только ADCW.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:10:27
Аlex
U235 писал(а):Разве ADC - это не имя регистра АЦП?
Кстати, может быть. Возможно, он уже объявлен как 2-х байтная переменная по соотв. адресу, и компиль поймёт его.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:12:28
просто КОТ
Так что, оставлять?!
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:15:04
Аlex
Зависит от компилятора. Попробуйте, не объявляя эту переменную (ADC), поработать с ней. Если ошибок не будет, значит всё в порядке.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:16:02
просто КОТ
О.К.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:17:54
Аlex
И ещё, Вы забыли
while(1){
.....
.....
.....
}