| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
АЦП atmega168
04.11.2011, 20:51
|
|
|
Частый гость
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
АЦП atmega168
Парни, доброго время суток. помогите с ацп атмеги 168. есть код рабочий для атмеги8 для работы с акселлерометром мма7260. но при переносе на 168 мегу код не рабочий значения показателя не те. пробывал менять параметры согласно даташиту но увы ничего.
на меге168 желательно использовать встроенную опорку в 1.1 а надо измерять до 2.5 с акселерометра.
код рабочей программы для атмеги 8
----------
|
Код:
|
#include ‹avr/io.h› //Стандартная библиотека ввода/вывода
#include ‹math.h.› //Библиотека математических операций
#define RS 2 //RS=PD2
#define E 3 //E=PD3
#define TIME 10
//Константа временной задержки для ЖКИ
//Частота тактирования 4МГц
#define ZERO_X 0x026c //Расчетная константа для координаты x
#define ZERO_Y 0x0258 //Расчетная константа для координаты y
#define ZERO_Z 0x029c //Расчетная константа для координаты z
int u=0; //Напряжение на ADC
int x,y,z; //ax,ay,az
//Программа задержки
void pause (unsigned int a)
{
unsigned int i;
for(i=a;i›0;i--);
}
//Программа передачи команды ЖКИ
void lcd_com (unsigned char lcd)
{
unsigned char temp;
temp=(lcd&~(1‹‹RS))|(1‹‹E); //RS=0 – это команда
PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1‹‹E); //Сигнал записи команды
temp=((lcd*16)&~(1‹‹RS))|(1‹‹E); //RS=0 – это команда
PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1‹‹E); //Сигнал записи команды
pause (10*TIME); //Пауза для выполнения команды
}
//Программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
unsigned char temp;
temp=(lcd|(1‹‹RS))|(1‹‹E); //RS=1 – это данные
PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1‹‹E); //Сигнал записи данных
temp=((lcd*16)|(1‹‹RS))|(1‹‹E); //RS=1 – это данные
PORTD=temp;n//Выводим на portD младшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1‹‹E); //Сигнал записи данных
pause(TIME); //Пауза для вывода данных
}
void lcd_init (void)//Иниализация ЖКИ
{
lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа
pause(100*TIME);
lcd_com(0x0c); //Показать изображение, курсор не показывать
pause(100*TIME);
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
pause (100*TIME);
}
unsigned int getADC(void) //Извелечения результата с АЦП
{
unsigned int v;
v=(ADCL+ADCH*256);
return v;
}
void write_full(int x, int y, int z)
{
double a,b;
unsigned char temp;
a=atan2(x,z)*180/M_PI;//Вычисляем углы
b=atan2(y,z)*180/M_PI;
lcd_com (0x80); //Пишем "тангаж"
lcd_dat (0xbf);
lcd_dat (0x61);
lcd_dat (0xbd);
lcd_dat (0xb4);
lcd_dat (0x61);
lcd_dat (0xb6);
lcd_dat ('=');
if (a_valid==1)
{
if (a‹0)
{//Пишем знак
a=-a;
lcd_dat('-');
}
else lcd_dat('+');
temp=a/100; //Пишем данные
a=a-temp*100;
lcd_dat(0x30+temp);
temp=a/10;
a=a-temp*10;
lcd_dat(0x30+temp);
lcd_dat(0x30+a);
lcd_dat(0xdf);
}
else
{
lcd_dat('N');
lcd_dat('/');
lcd_dat('a');
lcd_dat(' ');
lcd_dat(' ');
}
lcd_com (0xc0);//Пишем "крен"
lcd_dat (0xba);
lcd_dat (0x70);
lcd_dat (0x65);
lcd_dat (0xbd);
lcd_dat ('=');
if (b_valid==1)
{
if (b‹0) { //Пишем знак
b=-b;
lcd_dat('-');
}
else lcd_dat('+');
temp=b/100; //Пишем данные
b=b-temp*100;
lcd_dat(0x30+temp);
temp=b/10;
b=b-temp*10;
lcd_dat(0x30+temp);
lcd_dat(0x30+b);
lcd_dat(0xdf);
}
else {
lcd_dat('N');
lcd_dat('/');
lcd_dat('a');
lcd_dat(' ');
lcd_dat(' ');
}
}
int abs (int x)
{
if (x›=0) return x;
else return -x;
}
int main(void)
{ unsigned char i;
DDRD=0xfc;
pause(3000); //Пауза для включения ЖКИ
lcd_init(); //Инициализация ЖКИ
ADCSRA=(1‹‹ADEN)|(1‹‹ADPS1)|(1‹‹ADPS0); //Включить АЦП, прескаллер =/8
while(1)
{
x=y=z=0;
for (i=0;i‹30;i++)
{
ADMUX=(1‹‹REFS1)|(1‹‹REFS0)|(0‹‹MUX3)|(0‹‹MUX2)|(0‹‹MUX1)|(0‹‹MUX0);//Внутренний Vref=2,56, канал PC0
ADCSRA|=(1‹‹ADSC); //Начать преобразование
while ((ADCSRA&_BV(ADIF))==0x00) //Ждем окончания преобразования
;
u=getADC(); //Считать напряжение
x= x+(u-ZERO_X)*2.56/10.24*1.25; //Добавить в сумму x
ADMUX=(1‹‹REFS1)|(1‹‹REFS0)|(0‹‹MUX3)|(0‹‹MUX2)|(0‹‹MUX1)|(1‹‹MUX0);//Внутренний Vref=2,56, канал PC1
ADCSRA|=(1‹‹ADSC); //Начать преобразование
while ((ADCSRA&_BV(ADIF))==0x00) //Ждем окончания преобразования
;
u=getADC(); //Считать напряжение
y= y+(u-ZERO_Y)*2.56/10.24*1.25; //Добавить в сумму y
ADMUX=(1‹‹REFS1)|(1‹‹REFS0)|(0‹‹MUX3)|(0‹‹MUX2)|(1‹‹MUX1)|(0‹‹MUX0);//Внутренний Vref=2,56, канал PC2
ADCSRA|=(1‹‹ADSC); //Начать преобразование
while ((ADCSRA&_BV(ADIF))==0x00) //Ждем окончания преобразования
;
u=getADC(); //Считать напряжение
z= z+(u-ZERO_Z)*2.56/10.24*1.25; //Добавить в сумму z
}
a_valid=b_valid=1;
if ((abs(x/30)›85)&&(abs(y/30)‹30)) { //Вычисляем корректность данных
a_valid=1;
b_valid=0;
}
if ((abs(y/30)›85)&&(abs(x/30)‹30)) {
a_valid=0;
b_valid=1;
}
write_full (x,y,z); //Выводим результат на ЖКИ
pause(15000);
}
return 1;
} |
------
заранее спасибо. помогите разобраться
Последний раз редактировалось suhar666; 05.11.2011 в 00:53.
|
|
|
|
Сказали "Спасибо" suhar666
|
|
|
04.11.2011, 22:18
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: АЦП anmega168
У Atmega168 ADCSRA вместо ADCSR в ATMEGA8
Сообщение от suhar666
|
|
на меге168 желательно использовать встроенную опорку в 1.1 а надо измерять до 2.5 с акселерометра.
|
Интересно, почему?
Сообщение от suhar666
|
unsigned int getADC(void) //Извелечения результата с АЦП
{
unsigned int v;
v=(ADCL+ADCH*256);
return v;
}
|
А этот кусок работает правильно?
|
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
04.11.2011, 22:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: АЦП anmega168
Уже не в первый раз замечаю попытки решить свои проблемы путем выкладывания полного текста какой-то программы. Да еще без применения тегов. Не возникает желание ни читать, ни разбираться. Точно так же, как нет этого желания у спрашивающего. Похоже, подобная тема должна была бы прозвучать где-то так: "Вот вам код, разберитесь, где в нем нагажено, а мне выдайте такой, как мне надо!". Никакого уважения к форумчанам. Даже не прослеживается попытка собственного анализа кода, нахождения критического места, вопроса по существу. Просто и в лоб, как в том старом анекдоте про Фотошоп и нового русского. Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
|
|
|
|
04.11.2011, 22:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от ut1wpr
|
|
Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
|
Иллюстрация
|
|
|
|
04.11.2011, 23:09
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от suhar666
|
|
z= z+(u-ZERO_Z)*2.56/10.24*1.25
|
Вот еще место, где могут быть проблемы.
|
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
04.11.2011, 23:11
|
|
|
Частый гость
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от ut1wpr
|
Уже не в первый раз замечаю попытки решить свои проблемы путем выкладывания полного текста какой-то программы. Да еще без применения тегов. Не возникает желание ни читать, ни разбираться. Точно так же, как нет этого желания у спрашивающего. Похоже, подобная тема должна была бы прозвучать где-то так: "Вот вам код, разберитесь, где в нем нагажено, а мне выдайте такой, как мне надо!". Никакого уважения к форумчанам. Даже не прослеживается попытка собственного анализа кода, нахождения критического места, вопроса по существу. Просто и в лоб, как в том старом анекдоте про Фотошоп и нового русского. Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
|
я не хотел никого своим вопросом обидеть и не надеюсь на точто мне датут готовую программу, перед тем как написать я перепробывал кучу вариантов и прочитал даташит, но увы, ничего не выходит, а выложил ее чтобы видно было как бы суть ее. простите если кого обидел.
|
|
|
|
Сказали "Спасибо" suhar666
|
|
|
04.11.2011, 23:11
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: АЦП anmega168
|
|
|
|
04.11.2011, 23:22
|
|
|
Частый гость
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от nonamedov
|
|
У Atmega168 ADCSRA вместо ADCSR в ATMEGA8
|
так у меня и ADCSRA стоит на Atmega168 все верно
Сообщение от nonamedov
|
|
Интересно, почему?
|
Опорку на внутрений источник или на 5в (питания мк) желателен чтобы не проводить дополнительных паяний внешнего, если я не ошибаюсь.
А этот кусок работает правильно?
а что касается функции, то да на меге 8 значения
x=0.6
y=0.64
z=0.9
и могут изменяться в сторону увеличения и уменьшения, а на меге168
все значения 1.02 и изменяються и сторону уменьшения...
256 - это же битность ацп(8б) у меги168 оно 10??
Последний раз редактировалось suhar666; 04.11.2011 в 23:27.
|
|
|
|
Сказали "Спасибо" suhar666
|
|
|
04.11.2011, 23:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от suhar666
|
а что касается функции, то да на меге 8 значения
x=0.6
y=0.64
z=0.9
|
А как же это: int x,y,z ?!
Сообщение от suhar666
|
|
256 - это же битность ацп(8б) у меги168 оно 10??
|
Да что Вы говорите, и там и там оно десятибитное! Вы не поняли моего вопроса, там происходит преобразование типов, иногда бывают казусы.
|
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
04.11.2011, 23:42
|
|
|
Частый гость
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: АЦП anmega168
Сообщение от nonamedov
|
|
Да что Вы говорите, и там и там оно десятибитное! Вы не поняли моего вопроса, там происходит преобразование типов, иногда бывают казусы.
|
если казусы так почему с этими казусами мега8 хоть что-то правдоподобное показывает, а 168 отказывается- выставляет какойто потолок и все, изменяется в одну сторону.
и у меня нет никакого преобразования, а интеджер с запятой из-за этого
//Вывод данных на ЖКИ
temp=a/1000;
lcd_dat(0x30+temp); //Выводим данные до точки
lcd_dat('.'); //Выводим точку
a=a-temp*1000;
temp=a/100;
lcd_dat(0x30+temp); //Выводим данные после точки
a=a-temp*100;
temp=a/10;
lcd_dat(0x30+temp); //Выводим данные после точки
}
дописал что бы поточнее было.
Последний раз редактировалось suhar666; 04.11.2011 в 23:47.
|
|
|
|
Сказали "Спасибо" suhar666
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:53.
|
|