АЦП. Разбор полётов
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
АЦП. Разбор полётов
Граждане, нуждаюс в Вашей помощчи. Мне надо, в целях саморазвития, запустить ЦАП в АТтини13. Он тама 10-битный. НО! Выход инфы у него через 2 регистра -- ADCL & ADCH. Как их читать. В дате сказано, что для низкой точности хватит и ADCH, а если надо точно, то тут уже и ADCL надо.
ВОПРОС: КАК МНЕ С ЭНТИХ РЕГИСТРОВ СЧИТАТЬ ИНФУ?!
ВОПРОС: КАК МНЕ С ЭНТИХ РЕГИСТРОВ СЧИТАТЬ ИНФУ?!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Может просто прочитать эти регистры ? Не пробовали ?
Re: АЦП. Разбор полётов
Там АЦП а не ЦАП. Чтение регистров АЦП в R16 и R17:
in R16, ADCL
in R17, ADCH
in R16, ADCL
in R17, ADCH
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Кхэм, я имел в виду, что в них должно быть число. Около 600-700. В зависимости от этого надо зажечь светодиодик -- 600 или 700 и пара промежуточных.
НО! Я препологаю, что надо написать типа:
А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.
С логикой дружу. С Си не очень. . .
НО! Я препологаю, что надо написать типа:
Код: Выделить всё
if (регистр>700) // Если насчитал больше 700, зажечь Красный светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.
Аlex писал(а):Может просто прочитать эти регистры ? Не пробовали ?
С логикой дружу. С Си не очень. . .
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Ну если бы дружили, то поняли бы, что старший байт - это каждое 256-ое значение, или в хексе = 0x0100. И Си тут не причёмС логикой дружу
Т.б. Старший байт нужно умножить на 256 (или на 0x100) и сложить с младшим.
Как умножать будете - Ваше право. Можно через сдвиг.
Это самый простой способ...
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Хм, то есть что-бы мне получить ОДНО число, надо старший умножит на 256 и прибавить младший.
Так можно?! А без х и у можно?! Что-то мне кажется я не то сделал. . .
Код: Выделить всё
x=ADCH*256
y=x+ADCL
if (y>700) // Если насчитал больше 700, зажечь Красный светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}
Так можно?! А без х и у можно?! Что-то мне кажется я не то сделал. . .
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Код: Выделить всё
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;
........
........
........
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Ага, значи всё таки можно в оду строку. Понял, пасиба.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Главное не количество строк исходника, а то, во что развернёт это всё компилятор.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Код: Выделить всё
#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 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
А если от 600 до 630 ?// Если хоть более 630, то Жёлтый
// А если менее 600, то Красный!
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Если эта самая грубая, то вроде всё норм. Только вот нервничаю по поводу запуска АЦП -- правильно ли я записал регистр. . .
- U235
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Вт фев 21, 2012 20:42:26
- Откуда: Санкт-Петербург, Россия, Земля
Re: АЦП. Разбор полётов
Разве ADC - это не имя регистра АЦП?
Код: Выделить всё
ADC = ADCH*256 + ADCL;А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Вроде там с добавками. НО! Ради антиреса можно дописать букаффку. Например ADCC!
- U235
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Вт фев 21, 2012 20:42:26
- Откуда: Санкт-Петербург, Россия, Земля
Re: АЦП. Разбор полётов
Посмотрел в WinAVR - ADC и ADCW - 16-и разрядный регистр данных АЦП.
В CodeVision - только ADCW.
В CodeVision - только ADCW.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Кстати, может быть. Возможно, он уже объявлен как 2-х байтная переменная по соотв. адресу, и компиль поймёт его.U235 писал(а):Разве ADC - это не имя регистра АЦП?
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Зависит от компилятора. Попробуйте, не объявляя эту переменную (ADC), поработать с ней. Если ошибок не будет, значит всё в порядке.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
И ещё, Вы забыли
while(1){
.....
.....
.....
}

