Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва

Сообщение romazan »

Энкодер подключен к земле, выводы а и б через 10КоМ на +, и конденсаторы 0.1 на землю.

ИМХО изврат:

Код: Выделить всё

uchar encoder(void)
{
uchar *newV;
uchar  newZ;
newV[0] = (PINB & 0x03);
_delay_ms(5);
newV[1] = (PINB & 0x03);
_delay_ms(5);
newV[2] = (PINB & 0x03);
if((newV[1]==newV[0])||(newV[1]==newV[2]))	newZ=newV[1];
if(newV[0]==newV[2])						newZ=newV[0];
else										return 0;

if(oldZ==newZ) return 0;
if((oldZ==0)||(oldZ==3))
{
	if(!((newZ==2)||(newZ==1))) return 0;
	if(oldZ==0)
	{
		if((oldZ=newZ)==1)	return RIGHT;
		else				return LEFT;
	}
	if(oldZ==3)
	{
		if((oldZ=newZ)==2)	return RIGHT;
		else				return LEFT;
	}
}
if((oldZ==1)||(oldZ==2))
{
	if(!((newZ==0)||(newZ==3))) return 0;
	if(oldZ==1)
	{
		if((oldZ=newZ)==3)	return RIGHT;
		else				return LEFT;
	}
	if(oldZ==2)
	{
		if((oldZ=newZ)==0)	return RIGHT;
		else				return LEFT;
	}
}
}
:))
И все равно не работает :( , я так скоро до истерики дойду
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва

Сообщение romazan »

Щас разобрал энкодер, почистил контакты, и РАБОТАЕТ :shock: с этим кодом :)))
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Скажите я не знаю сюда ли вопрос, если что пинайте( только не сильно) в ту сторону куда спросить.
Тут решил запустить дисплей от винстара задал вопрос как правильно запускать на официальном сайте.
Мне отправили вот этот файл. теперь думаю как можно его прикошачить к меге 8 и аврстудии.Там я так понял для другого контроллера и в другом компиляторе.
Вложения
KS0066_4BIT.zip
(1.52 КБ) 168 скачиваний
В поисках истины человек развивается.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

vitalik_1984 писал(а):Скажите я не знаю сюда ли вопрос, если что пинайте( только не сильно) в ту сторону куда спросить.
Тут решил запустить дисплей от винстара задал вопрос как правильно запускать на официальном сайте.
Мне отправили вот этот файл. теперь думаю как можно его прикошачить к меге 8 и аврстудии.Там я так понял для другого контроллера и в другом компиляторе.
Так а в чем собственно вопрос? Рассказать как подключать дисплей? Кстати модель дисплея огласите, пожалуйста. Код таки да, непонятно для какого компилятора, но явно не для AVR-GCC.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Antifritz писал(а):
vitalik_1984 писал(а):Скажите я не знаю сюда ли вопрос, если что пинайте( только не сильно) в ту сторону куда спросить.
Тут решил запустить дисплей от винстара задал вопрос как правильно запускать на официальном сайте.
Мне отправили вот этот файл. теперь думаю как можно его прикошачить к меге 8 и аврстудии.Там я так понял для другого контроллера и в другом компиляторе.
Так а в чем собственно вопрос? Рассказать как подключать дисплей? Кстати модель дисплея огласите, пожалуйста. Код таки да, непонятно для какого компилятора, но явно не для AVR-GCC.
Это точно дисплей WH1602D-YYH-CTK
нужно библиотеку, вроде в студии её нет.Что теперь переделывать библиотеку CVavr? долгое занятие по моему.

Контроллер дисплея KS0066
В поисках истины человек развивается.
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

vitalik_1984 писал(а): к меге 8 и аврстудии
vitalik_1984 писал(а):Что теперь переделывать библиотеку CVavr?
Что то я не понял, Вы на чем пишете asm, AVR-GCC(WinAVR) или CodeVision? У меня есть самоклепная библиотека для AVR-GCC, писалась по этой книжке, могу кинуть. А вообще здесь инфы по таким дисплеям (KS0066 он же HD44780) полно.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Antifritz писал(а):
vitalik_1984 писал(а): к меге 8 и аврстудии
vitalik_1984 писал(а):Что теперь переделывать библиотеку CVavr?
Что то я не понял, Вы на чем пишете asm, AVR-GCC(WinAVR) или CodeVision? У меня есть самоклепная библиотека для AVR-GCC, писалась по этой книжке, могу кинуть. А вообще здесь инфы по таким дисплеям (KS0066 он же HD44780) полно.
Я асм не пишу, пытаюся работать а Авр студии. просто я знаю что вроде как в CV есть готовые библиотеки под Жк
В поисках истины человек развивается.
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

приветик всем юзаю Eclipse + gcc-avr не подскажите как включить поддержку float double, при много благодарен буду
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Никак.
Сейчас в avr-gcc float и double -- одно и то же, и там, и там 32 бита.

Однако что это за задача, в которой хватает AVR, но не обойтись без плавающих чисел двойной точности?
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

avreal писал(а):Никак.
Сейчас в avr-gcc float и double -- одно и то же, и там, и там 32 бита.

Однако что это за задача, в которой хватает AVR, но не обойтись без плавающих чисел двойной точности?
Плохо, датчик температуры и влажности SHT10,
Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)
Это всё можно перевести в целочисленную арифметику :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

Gudd-Head писал(а):
shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)
Это всё можно перевести в целочисленную арифметику :)
ну да можно ток фигня выходит у меня.
не получается, соображалка кончилась
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула

Сообщение IfoR »

Ну первое тривиально
100*T = 14bit(значение) - 4070;

А вот со вторым можно сделать интереснее (ради интереса): использовать только сложение/вычитание и побитовые сдвиги:

Вот только это что: (-15955E-6) ? Типа -0.015955?

Ну тогда:
RH = 0.0367 * 12bit(Значение) - 2,062755
=0.0367 * (12bit(Значение) - 56,205858310626702997275204359673)
=0.0367/16 * (16 * 12bit(Значение) - 899,29373297002724795640326975477)
=0.0367 * ((16 * 12bit(Значение) - 899)/16);

Пусть: A = ((16 * 12bit(Значение) - 899)/16);
Тогда:
RH = 0.0367 * A;
Что можно представить так:
100*RH = 3,67 * A = 4*A - A/4 - A/16 - A/64 - A/512

Посчитаем погрешность измерений на максимальном входном значении (4095):
По исходной формуле:
100*RH = 100*(0.0367 * 12bit(Значение) - 2,062755) = 14822,3745
По полученной:
A = ((16 * 12bit(Значение) - 899)/16) = 4038
100*RH = 4*A - A/4 - A/16 - A/64 - A/512 = 16152 - 1009 - 252 - 63 - 7 = 14821
Отсюда погрешность 14821 - 14822,3745 = -1,3745. Для RH это будет -0,01

Конечно, вычисляться будет долго из-за количества операций (хоть и элементарных), зато без дробей. :)
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Gudd-Head писал(а):
shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)
Это всё можно перевести в целочисленную арифметику :)
Согласен. Можно унести, если экономить код и время.
Можно и не уносить, у 32-битового float точность около семи десятичных знаков, а тут во всех константах и переменных не больше пяти и по порядку числа отличаются мало. И самих операций мало. Т.е. обычного 32-битового float за глаза, его хватает в гораздо более сложных рассчётах. Потому-то я и удивился желанию иметь double.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

IfoR писал(а):Ну первое тривиально
100*T = 14bit(значение) - 4070;

А вот со вторым можно сделать интереснее (ради интереса): использовать только сложение/вычитание и побитовые сдвиги:

Вот только это что: (-15955E-6) ? Типа -0.015955?

Ну тогда:
RH = 0.0367 * 12bit(Значение) - 2,062755
=0.0367 * (12bit(Значение) - 56,205858310626702997275204359673)
=0.0367/16 * (16 * 12bit(Значение) - 899,29373297002724795640326975477)
=0.0367 * ((16 * 12bit(Значение) - 899)/16);

Пусть: A = ((16 * 12bit(Значение) - 899)/16);
Тогда:
RH = 0.0367 * A;
Что можно представить так:
100*RH = 3,67 * A = 4*A - A/4 - A/16 - A/64 - A/512

Посчитаем погрешность измерений на максимальном входном значении (4095):
По исходной формуле:
100*RH = 100*(0.0367 * 12bit(Значение) - 2,062755) = 14822,3745
По полученной:
A = ((16 * 12bit(Значение) - 899)/16) = 4038
100*RH = 4*A - A/4 - A/16 - A/64 - A/512 = 16152 - 1009 - 252 - 63 - 7 = 14821
Отсюда погрешность 14821 - 14822,3745 = -1,3745. Для RH это будет -0,01

Конечно, вычисляться будет долго из-за количества операций (хоть и элементарных), зато без дробей. :)
С температурой получилось а вот с влажностью косяк 100*RH = 3,67 * A = 4*A - A/4 - A/16 - A/64 - A/512 число 3,67 превратил сразу в 2 и дальше все поплыло, он вообше числа с точкой не воспринимает
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

shurikss123 писал(а):Вот только это что: (-15955E-6) ? Типа -0.015955?
Экспоненциальная форма записи числа и наверное будет так -0.00000015955

пипец :kill: :facepalm:

UPD: Запускал в протеусе думал гонит заразя но, и в устройсве температура на 1.5 градуса верно врет!
Последний раз редактировалось shurikss123 Пт авг 19, 2011 18:33:22, всего редактировалось 1 раз.
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

У меня вопрос:
Решил использовать массив во флеше.
Сделал так:

Код: Выделить всё

#include <avr\io.h>
#include <util\delay.h>
#include <avr\pgmspace.h>

const char b[] PROGMEM = {128,64,32,16,8,4,2,1};

int main(void)
{
	char buffer[8];
	DDRB=0xFF;
	strcpy_P(buffer, b);
	for(int j =0;j<sizeof(buffer);j++)
	{
		PORTB = buffer[j];
		_delay_ms(500);
	}
	for(;;);
}
Но заметил, что нужно использовать буфер в ОЗУ, чтобы работать с массивом из FLASH.
Можно ли вытаскивать данные из массива непосредственно в порт, минуя ОЗУ?
Прошу не бить, я только осваиваю WinAVR. (АСМ я уже знаю)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

Еше вопрос делаю вот так

Код: Выделить всё

char Buf[17];
sprintf(Buf,"RH=%f",1.5955);//humidity
LCDsendString(Buf);
на дисплей выводит RH=? По идеи должен его же и вывести так?
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула

Сообщение IfoR »

shurikss123 писал(а):С температурой получилось а вот с влажностью косяк 100*RH = 3,67 * A = 4*A - A/4 - A/16 - A/64 - A/512 число 3,67 превратил сразу в 2 и дальше все поплыло, он вообше числа с точкой не воспринимает
Я недорассказал в прошлый раз. Операции *4, *2, /4, /512 и пр. - это побитовые сдвиги. Т.е. как будет выглядить расчёт на Си:
(PIN - входящее значение)

Код: Выделить всё

int PIN=1000;
int A, RH100;

A = ((PIN<<4) - 899) >> 4;
RH100 = (A<<2) - (A>>2) - (A>>4) - (A>>6) - (A>>8);
 
Экспоненциальная форма записи числа и наверное будет так -0.00000015955
Просто меня смутило отсутствие запятой. Ну раз так, то это число, по всей видимости, слишком мало, даже если умножить на 100. Что бы такую точность организовать тут нужно использовать 32-битное число.

Если не учитывать это число, то алгоритм вычисления будет немного другой (другое число A):
A = (16*12bit(Значение) - 892) /16

Код: Выделить всё

int PIN=1000;
int A, RH100;

A = ((PIN<<4) - 892) >> 4;
RH100 = (A<<2) - (A>>2) - (A>>4) - (A>>6) - (A>>8);
 
на дисплей выводит RH=? По идеи должен его же и вывести так?
До умолчанию printf не поддерживает дробные числа. Это надо включать в компиляторе, вместе с дробными числами. Это значительно увеличит вес прошивки.
И, как уже говорили, лучше везти вычисления в целочисленной форме. Потом RH100 можно вывезти, например, так:

Код: Выделить всё

sprintf(Buf, "RH=%i,%i", RH100/100, abs(RH100%100)); 
Последний раз редактировалось IfoR Пт авг 19, 2011 21:03:41, всего редактировалось 5 раз.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула

Сообщение IfoR »

DX168B, я, наверно, не совсем в теме, но может быть так:

Код: Выделить всё

#include <avr\io.h>
#include <util\delay.h>
#include <avr\pgmspace.h>

const char b[] = {128,64,32,16,8,4,2,1};

int main(void)
{
    DDRB=0xFF;

    for(int j =0;j<sizeof(b);j++)
    {
        PORTB = b[j];
        _delay_ms(500);
    }
    for(;;);
}
 
:dont_know:
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»