Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

АЦП atmega168

Непрочитано 04.11.2011, 20:51  
suhar666
Частый гость
 
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
suhar666 на пути к лучшему
По умолчанию АЦП 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 вне форума  
Сказали "Спасибо" suhar666
warel (28.06.2019)
Непрочитано 04.11.2011, 22:18  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" nonamedov
warel (28.06.2019)
Непрочитано 04.11.2011, 22:22  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: АЦП anmega168

Уже не в первый раз замечаю попытки решить свои проблемы путем выкладывания полного текста какой-то программы. Да еще без применения тегов. Не возникает желание ни читать, ни разбираться. Точно так же, как нет этого желания у спрашивающего. Похоже, подобная тема должна была бы прозвучать где-то так: "Вот вам код, разберитесь, где в нем нагажено, а мне выдайте такой, как мне надо!". Никакого уважения к форумчанам. Даже не прослеживается попытка собственного анализа кода, нахождения критического места, вопроса по существу. Просто и в лоб, как в том старом анекдоте про Фотошоп и нового русского. Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (28.06.2019)
Непрочитано 04.11.2011, 22:57  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: АЦП anmega168

Сообщение от ut1wpr Посмотреть сообщение
Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
Иллюстрация
niXto вне форума  
Сказали "Спасибо" niXto
warel (28.06.2019)
Непрочитано 04.11.2011, 23:09  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: АЦП anmega168

Сообщение от suhar666 Посмотреть сообщение
z= z+(u-ZERO_Z)*2.56/10.24*1.25
Вот еще место, где могут быть проблемы.
nonamedov вне форума  
Сказали "Спасибо" nonamedov
warel (28.06.2019)
Непрочитано 04.11.2011, 23:11  
suhar666
Частый гость
 
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
suhar666 на пути к лучшему
По умолчанию Re: АЦП anmega168

Сообщение от ut1wpr Посмотреть сообщение
Уже не в первый раз замечаю попытки решить свои проблемы путем выкладывания полного текста какой-то программы. Да еще без применения тегов. Не возникает желание ни читать, ни разбираться. Точно так же, как нет этого желания у спрашивающего. Похоже, подобная тема должна была бы прозвучать где-то так: "Вот вам код, разберитесь, где в нем нагажено, а мне выдайте такой, как мне надо!". Никакого уважения к форумчанам. Даже не прослеживается попытка собственного анализа кода, нахождения критического места, вопроса по существу. Просто и в лоб, как в том старом анекдоте про Фотошоп и нового русского. Пришел на фирму покупать Фотошоп. Ему показывают фильтры, кнопки... А он говорит: "Мне не такой нужен. Мне нужет с одной кнопкой - нажал, и ШОБ ВСЕ БЫЛО КРАСИВО!!!"
я не хотел никого своим вопросом обидеть и не надеюсь на точто мне датут готовую программу, перед тем как написать я перепробывал кучу вариантов и прочитал даташит, но увы, ничего не выходит, а выложил ее чтобы видно было как бы суть ее. простите если кого обидел.
suhar666 вне форума  
Сказали "Спасибо" suhar666
warel (28.06.2019)
Непрочитано 04.11.2011, 23:11  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: АЦП anmega168

Сообщение от niXto Посмотреть сообщение
Иллюстрация
Многабукафф!!! Ниасилил!!! Но в теме, этакруто!!!
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (28.06.2019)
Непрочитано 04.11.2011, 23:22  
suhar666
Частый гость
 
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
suhar666 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" suhar666
warel (28.06.2019)
Непрочитано 04.11.2011, 23:35  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: АЦП anmega168

Сообщение от suhar666 Посмотреть сообщение
а что касается функции, то да на меге 8 значения
x=0.6
y=0.64
z=0.9
А как же это: int x,y,z ?!

Сообщение от suhar666 Посмотреть сообщение
256 - это же битность ацп(8б) у меги168 оно 10??
Да что Вы говорите, и там и там оно десятибитное! Вы не поняли моего вопроса, там происходит преобразование типов, иногда бывают казусы.
nonamedov вне форума  
Сказали "Спасибо" nonamedov
warel (28.06.2019)
Непрочитано 04.11.2011, 23:42  
suhar666
Частый гость
 
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
suhar666 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" suhar666
warel (28.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
stm32f373 16 битный ацп не работает на 50 ksps Alex_golubev ARM 0 27.04.2018 16:21
Помогите с АЦП ATmega168 r0st Микроконтроллеры, АЦП, память и т.д 18 28.05.2012 23:51
АЦП AT91sam7s256 Uragan90 Микроконтроллеры, АЦП, память и т.д 10 25.04.2011 13:30
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 03:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.