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

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

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

Сообщение 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;
   }
}
}

:))
И все равно не работает :( , я так скоро до истерики дойду
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение romazan »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение Antifritz »

vitalik_1984 писал(а):Скажите я не знаю сюда ли вопрос, если что пинайте( только не сильно) в ту сторону куда спросить.
Тут решил запустить дисплей от винстара задал вопрос как правильно запускать на официальном сайте.
Мне отправили вот этот файл. теперь думаю как можно его прикошачить к меге 8 и аврстудии.Там я так понял для другого контроллера и в другом компиляторе.

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

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

Сообщение vitalik_1984 »

Antifritz писал(а):
vitalik_1984 писал(а):Скажите я не знаю сюда ли вопрос, если что пинайте( только не сильно) в ту сторону куда спросить.
Тут решил запустить дисплей от винстара задал вопрос как правильно запускать на официальном сайте.
Мне отправили вот этот файл. теперь думаю как можно его прикошачить к меге 8 и аврстудии.Там я так понял для другого контроллера и в другом компиляторе.

Так а в чем собственно вопрос? Рассказать как подключать дисплей? Кстати модель дисплея огласите, пожалуйста. Код таки да, непонятно для какого компилятора, но явно не для AVR-GCC.

Это точно дисплей WH1602D-YYH-CTK
нужно библиотеку, вроде в студии её нет.Что теперь переделывать библиотеку CVavr? долгое занятие по моему.

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

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

Сообщение Antifritz »

vitalik_1984 писал(а): к меге 8 и аврстудии

vitalik_1984 писал(а):Что теперь переделывать библиотеку CVavr?

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

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

Сообщение vitalik_1984 »

Antifritz писал(а):
vitalik_1984 писал(а): к меге 8 и аврстудии

vitalik_1984 писал(а):Что теперь переделывать библиотеку CVavr?

Что то я не понял, Вы на чем пишете asm, AVR-GCC(WinAVR) или CodeVision? У меня есть самоклепная библиотека для AVR-GCC, писалась по этой книжке, могу кинуть. А вообще здесь инфы по таким дисплеям (KS0066 он же HD44780) полно.

Я асм не пишу, пытаюся работать а Авр студии. просто я знаю что вроде как в CV есть готовые библиотеки под Жк
В поисках истины человек развивается.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

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

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

Сообщение avreal »

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

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

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

Сообщение shurikss123 »

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

Однако что это за задача, в которой хватает AVR, но не обойтись без плавающих чисел двойной точности?


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

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

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

shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)

Это всё можно перевести в целочисленную арифметику :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

Gudd-Head писал(а):
shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)

Это всё можно перевести в целочисленную арифметику :)

ну да можно ток фигня выходит у меня.
не получается, соображалка кончилась
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение 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)
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Gudd-Head писал(а):
shurikss123 писал(а):Для расчета температуры есть формула и получается так T = -40.7 + 0.01*14bit(значение);
Для влажности хуже RH = -2.0468 + 0.0367 * 12bit(Значение) + (-15955E-6)

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

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

Сообщение 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 и дальше все поплыло, он вообше числа с точкой не воспринимает
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

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


Экспоненциальная форма записи числа и наверное будет так -0.00000015955

пипец :kill: :facepalm:

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

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

Сообщение 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!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

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

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

char Buf[17];
sprintf(Buf,"RH=%f",1.5955);//humidity
LCDsendString(Buf);

на дисплей выводит RH=? По идеи должен его же и вывести так?
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение 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;

= ((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;

= ((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)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение 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)
Ответить

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