Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Цифровой акселерометр MMA7260Q и ATmega8

Ср фев 22, 2017 13:24:30

Здравствуйте, уважаемые КОТЫ! Захотелось собрать себе в машину вот такое устройство: https://avrlab.com/node/122. Я не программист, поэтому прошу помощи, как перевести исходник в НЕХ?

Re: Цифровой акселерометр MMA7260Q и ATmega8

Чт окт 05, 2017 17:05:54

А в ответ тишина...
Тогда поставлю вопрос так: можно ли из этого сделать HEX?
#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;
}

Re: Цифровой акселерометр MMA7260Q и ATmega8

Чт окт 05, 2017 17:27:30

можно.

http://microsin.net/programming/avr/avr ... -file.html

в аттаче для меги88, хз какая у вас.

ЗЫ не надо такие портянки постить. прячьте в спойлер, или лучше прикладывайте файл.
Вложения
someprog.zip
(5.37 KiB) Скачиваний: 222

Re: Цифровой акселерометр MMA7260Q и ATmega8

Чт окт 05, 2017 17:55:28

В заголовке: MEGA8

Добавлено after 12 minutes 9 seconds:
Хотелось бы подробнее.

Re: Цифровой акселерометр MMA7260Q и ATmega8

Чт окт 05, 2017 18:24:35

для меги8
Вложения
someprog.hex
(7.64 KiB) Скачиваний: 515

Re: Цифровой акселерометр MMA7260Q и ATmega8

Пт окт 06, 2017 01:33:09

Но как?

Re: Цифровой акселерометр MMA7260Q и ATmega8

Пт окт 06, 2017 07:27:43

при помощи компилятора

Re: Цифровой акселерометр MMA7260Q и ATmega8

Сб окт 07, 2017 18:46:11

для меги8

Залил эту прошивку, ничего не работает.
А компиляторы есть на Русском языке?

Добавлено after 20 minutes 34 seconds:
Хочу попробовать сам разобраться.

Re: Цифровой акселерометр MMA7260Q и ATmega8

Сб окт 07, 2017 18:50:38

andrei913 писал(а):А компиляторы есть на Русском языке?

Я о}{..ваю ! Насколько позволяет судить мой скромный опыт, их нет ни на русском, ни на китайском, ни на древне-зулусском. Входной язык у компилятора - выбранный язык программирования, на выходе - бинарник или .hex - файл.

Re: Цифровой акселерометр MMA7260Q и ATmega8

Сб окт 07, 2017 19:05:28

andrei913 писал(а):А компиляторы есть на Русском языке?

Я о}{..ваю ! Насколько позволяет судить мой скромный опыт, их нет ни на русском, ни на китайском, ни на древне-зулусском. Входной язык у компилятора - выбранный язык программирования, на выходе - бинарник или .hex - файл.

Я вроде нормально спрашиваю. Неужели нельзя нормально ответить.

Re: Цифровой акселерометр MMA7260Q и ATmega8

Сб окт 07, 2017 19:50:04

на такие вопросы сложно отвечать нормально. Ну совсем ведь базовые понятия :dont_know: Откройте любую книжку по С и почитайте несколько первых глав.

В исходном виде прошивка не собирается, я там правил опечатки по собственному разумению, особо не разбираясь.
"ничего не работает" - дык погода на марсе к этому не располагает. Какое конкретно ничего не работает?

там в комментариях кстати чего-то про частоту в 4МГц. Нужные фьюзы выставили?

Re: Цифровой акселерометр MMA7260Q и ATmega8

Сб окт 07, 2017 19:58:35

Просто я в программировании полный ноль. Я практик. Могу спаять, прошить микроконтроллер но не более. Так что извините за тупые вопросы. Фьюзы выставил правильно.
Ответить