Список разделов Flyback.org.ru » не HV » Микроконтроллеры и всё, что с ними связано
Тему сейчас просматривают - зарегистрированных: 0, скрытых: 0 и гостей: 0
Зарегестрированные - Нет
Ответить с цитатой

N1X
 


А он точно на чтение работает? Частенько экраны только на запись...

Добавлено: Wed Jul 05, 2017 10:14 am
Ответить с цитатой

Денис
 


Судя по ДШ на все контроллеры, которые китайцы лепят в данные модули - они работают на чтение в том числе. В моем случае это скорее всего SPFD5408.

Добавлено: Wed Jul 05, 2017 11:05 pm
Ответить с цитатой

CLON
 


Всем привет.
Возникла такая маленькая проблемма.
Есть массив с набором из 3-х измерений (А-B-С) Int и нужно сделать фильтрацию вида
1. if A>B>C {Case = 1;}
2. if A>C>B {Case = 2;}
3. if B>A>C {Case = 3;}
4. if B>C>A {Case = 4;}
5. if C>A>B {Case = 5;}
6. if C>B>A {Case = 6;}
Вначале прописа код с 6 If с 2-мя AND (И) Т.е. тремя условиями if ( (A>B) and (A>C) and (B>C) ) {} - не работает.
Далее убрал одно условие: if ((A>B) and (B>C)) {} - не работает.
Заменил and на && - не работает.
Далее добавил переход ГОТО, если условие выполнилось, то выходим из оставшихся проверок - не работает.
Одним словом не знаю, где здесь косяк, но очень часто в место 1-го случая определяет 3,4 или 6. Вместо 2 - 4 и т.д. Т.е. берет не оба условия, а только последнее.
ЗЫ: точнее работает, но определяет случай не верно (причем не всегда).

Добавлено: Fri Jul 07, 2017 2:23 pm
Ответить с цитатой

Тёма
Больше не студент


Я бы сначала нашел индекс максимального значения в массиве. А потом тупо через IF THEN.

Mass[0..2] array of integer;
Index: integer;

{процедура поиска индекса максимального значения, индекс записывается в "Index"}

IF Index= 0 THEN
BEGIN
IF Mass[2] > Mass[3] THEN Case:= 1;
IF Mass[3] > Mass[2] THEN Case:= 2;
END;

IF Index= 1 THEN
BEGIN
IF Mass[1] > Mass[3] THEN Case:= 3;
IF Mass[3] > Mass[1] THEN Case:= 4;
END;

Ну и т.д.
(это типа delphi, в си я хуй знает)

Добавлено: Fri Jul 07, 2017 2:50 pm
Ответить с цитатой

Ivani
 


Не проще дерево построить?
Ттпа
Код:
A>B
      да C > A
                   да выход 5
                   нет B > C
                                да выход 1
                                нет выход 2
     нет .....


Добавлено: Fri Jul 07, 2017 4:00 pm
Ответить с цитатой

CLON
 


да дело в том, что код вида if ((A>B) and (B>C)) {}
используется во многих других частях программы.
И если он здесь не работает, то вопрос возможно программа не работает и в других местах как надо.

У меня есть сложные проверки из 3-5 сложных условий - в одном if с И и ИЛИ и т.д.

Ивани: дерево - попробую.

Добавлено: Fri Jul 07, 2017 11:12 pm
Ответить с цитатой

Ivani
 


Язык программирования какой, если ардуина то типы сравниваемых переменных и тем более констант должны быть одинаковы.

Добавлено: Fri Jul 07, 2017 11:21 pm
Ответить с цитатой

Behram
 


CLON писал(а):
да дело в том, что код вида if ((A>B) and (B>C)) {}
Код:

if ((A>B) && (B>C))
{
}

Не работает?


Добавлено: Fri Jul 07, 2017 11:48 pm
Ответить с цитатой

CLON
 


Ivani писал(а):
Язык программирования какой, если ардуина то типы сравниваемых переменных и тем более констант должны быть одинаковы.

Ivani Привет. Все одинаковы. Все Интегер Int. Да Контроллер Ардуиновский Нано в3.0. Ардуиновская среда.
Behram: да вот я об этом и говорю. Что очень странно.

CASE = 0; // CASE initial state of misatke estimation && = end
// 1st CASE: Tr3 > Tr2 > Tr1 - IDEAL measurements: Tr3-? or Tr1+?
if ( Trot3>Trot2 && Trot2>Trot1 ) { CASE = 1; goto CheckEnd; }
// 2nd CASE: Tr3 > Tr1 > Tr2 - Mistake in Tr2+ or Tr1-
if ( Trot3>Trot1 && Trot1>Trot2 ) { CASE = 2; goto CheckEnd; }
// 3rd CASE: Tr2 > Tr3 > Tr1 - Mistake in Tr3+ or Tr2-
if ( Trot2>Trot3 && Trot3>Trot1 ) { CASE = 3; goto CheckEnd; }
// 4th CASE: Tr2 > Tr1 > Tr3 - Mistake in Tr3++
if ( Trot2>Trot1 && Trot1>Trot3 ) { CASE = 4; goto CheckEnd; }
// 5th CASE: Tr1 > Tr2 > Tr3 - 2 x Mistakes!!!
if ( Trot1>Trot2 && Trot2>Trot3 ) { CASE = 5; goto CheckEnd; }
// 6th CASE: Tr1 > Tr3 > Tr2 - Mistake in Tr1--
if ( Trot1>Trot3 && Trot3>Trot2 ) { CASE = 6; goto CheckEnd; }
CheckEnd:

XXX; Trot1; Trot2; Trot3; CASE;
101; 04490; 04587; 04629; 003;
102; 04465; 04472; 04600; 001;
103; 04240; 04392; 04427; 003;
104; 03305; 03200; 03329; 006;
105; 03420; 03242; 03424; 006;
106; 03190; 02831; 03167; 002;
107; 02848; 03267; 03139; 003;
108; 03034; 02993; 03117; 002;
109; 04043; 04067; 04195; 001;
110; 03784; 03755; 03861; 002;
111; 02641; 02712; 02795; 001;
112; 02793; 02944; 02941; 003;

Добавлено: Sat Jul 08, 2017 8:20 am
Ответить с цитатой

CLON
 


Первая строка 101: Тр3 больше Тр2 и Тр2 больше Тр1 - должен быть 1 ый случай. Но нет дает 3ий! И т.д.
Вторая строка 102: - ОК.
Третья строка 103: - опять Тр3 больше Тр2 и Тр2 больше Тр1 - должен быть 1 ый случай. Но нет дает 3ий!
Четвертая строка 104: должен быть 2-ой случай, а дает 6 ой.
И т.д.

Behram: да вот я об этом и говорю. Что очень странно. Пробовал условия разделять скобками и через И, как у тебя, не работает как надо.
Потом посмотрел примеры в них без скобок и с && переписал код, но всеравно не работает как надо.
Потом добавил переход ГОТО, но это тоже не помогло. Одним словом я не могу понять где косяк.
Вроде бы все правильно, но эта часть алгоритма не работает (точнее работает с ошибками, которые я должен был в этой части уменьшить).

ЗЫ: Это результаты физического процесса (периоды оборота),
который происходит с торможением, поэтому при правильном замере периодов должно быть Тр3 больше Тр2, и Тр2 больше Тр1.

Добавлено: Sat Jul 08, 2017 8:24 am
Ответить с цитатой

Ivani
 


Это
if ((400 < test3) && (test3 < 600))
работает нормально 3 штуки

Добавлено: Sat Jul 08, 2017 12:13 pm
Ответить с цитатой

Ivani
 


а это
if ((ph_type > slph * 1000) && ((millis() - ph_millis) > (wph * 1000)))
заработало только после
float slph;
float ph_type = 0;
ph_type = round(1000 * ph_type / nm);
Притом первое аналогичное изначально работало, 2 следующих с точно такими-же переменными не работали…

Сообщения разделены потому, что в 1 сообщении сносит крышу форуму.

Добавлено: Sat Jul 08, 2017 12:14 pm
2017-07-08_11-53-48.png (28.79 Кб)

Ответить с цитатой

Денис
 


Денис писал(а):
Мужики, хелп. У кого есть LCD-модуль типа такого?

Уже третий день бьюсь, не могу просто прочитать ID чипа. И вообще прочитать хоть содержимое какого-то регистра. Опишите кому не в лом пошаговый алгоритм, как это сделать. У меня какая-то херь получается. Даже поставил ненавистную Arduino IDE, чтобы проверить экран. Подошла библиотека для граф.контроллера SPFD5408, дисплей заработал. Как вручную (на си) прочитать ИД чипа - не догоню.


Итак, прошло пять дней в попытках просто считать ID микры-драйвера дисплейного модуля от китайцев (facepalm). Можно подумать, что это брак. Но, как известно, плохому танцору яйца мешают, и потом - с ардуиновской библиотекой под контроллер SPFD5408 оно таки рисует картинки.

Вчера уже хотел забить на него совсем, а сегодня от нефиг делать написал сканер вообще всех регистров дисплейного контроллера, от 0x0 до 0xFF, выводящий в порт все ненулевые считанные значения. Цель - посмотреть, считается ли хоть что-то, и будет ли цифра, похожая на ID популярных LCD-драйверов. Картинка кликабельна.



И что же, блядь, мы тут видим?! По адресу 0xD3 пидорски закрался 0x9341, идем в инет - у контроллера ILI9341 ID чипа находится по адресу 0xD3.
ID чипа в 0xD3, КАРЛ! Причем ID идет ТРЕТЬИМ и ЧЕТВЕРТЫМ байтами в этом регистре. Если сканить регистры только по двум байтам - получишь 0!

Внимание вопрос: что курили разработчики??!

Добавлено: Sat Jul 08, 2017 5:24 pm
Ответить с цитатой

Ivani
 


В ардуино работвют и такие конструкции:
Код:
 if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }


А где найти расшифровку этого?
Код:
celsius = (float)raw / 16.0;


Нашел, это преобразование типов, в данном случае raw преобразуется, недавно искал - не было.
Было float(x) и работало не всегда, в чем разница?


Объясните пожалуйста нахуя "return" напихали в код?
Код:
  if ( !ds.search(addr)) {
    lcd.println("No more addresses.");
    lcd.println();
    ds.reset_search();
    delay(250);
    return;
  }
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
      lcd.println("CRC is not valid!");
      return;
  }


Добавлено: Mon Jul 10, 2017 11:49 am
Ответить с цитатой

CLON
 


У кого нибудь из форумчан есть опыт использования плат микроконтроллеров от PJRC: Teensy++2.0 (8 бит) или Teensy3.2 (32 бит) или других из их семейства?

Каковы впечатления и в чем отличиие от Ардуиносвких?

Добавлено: Fri Jul 14, 2017 10:56 am
Ответить с цитатой

Николай
 


>Объясните пожалуйста нахуя "return" напихали в код?

1 функция без ретурна дает варнинг при компиляции. впринципе похуй, но как-то "не аккуратненько". я тоже леплю, когда окончательно код причесываю. чтобы окошко компиляции было чистое.
2 для данного кода не актуально, ибо он медленный шопиздец, но вобще выкинуть из функции по выполнении условия, не проверяя следующее - значит сэкономить процессорное время, которое бы потратилось на проверку второго, заведомо не выполняемого условия.
3 если оба условия могут выполниться, но нам нужно чтобы если выполнилось первое - второе пропустить в любом случае, тогда логичней ретурном прервать функцию, чтобы не проверять второе

Добавлено: Sat Jul 15, 2017 2:57 pm
Ответить с цитатой

Ivani
 


Дошло, return там void loop рестартит.
Код:
void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
 
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }


Добавлено: Sat Jul 15, 2017 5:40 pm
Ответить с цитатой

Денис
 


Николай писал(а):
если оба условия могут выполниться, но нам нужно чтобы если выполнилось первое - второе пропустить в любом случае, тогда логичней ретурном прервать функцию, чтобы не проверять второе
В этом случае логичнее else.

Добавлено: Sat Jul 15, 2017 11:00 pm
Ответить с цитатой

Николай
 


ну как сказать я просто по объему оптимизирую всегда код. а return вкомпилится в банальный ret тобишь в одну инструкцию

а что там компилятор понапридумывает с конструкцией
if....
else if ....

хрензнает :D

Добавлено: Sun Jul 16, 2017 6:58 pm
Ответить с цитатой

Ivani
 


Китайская ATmega128a - обязателен конденсатор на AREF при использовании внутреннего опорника для внутреннего АЦП.

Добавлено: Wed Oct 04, 2017 12:08 pm
Ответить с цитатой

SilverRay
 


Китайская -- в смысле, с али?

Добавлено: Wed Oct 04, 2017 12:36 pm
Ответить с цитатой

Ivani
 


С ебея.

Добавлено: Wed Oct 04, 2017 12:52 pm
Ответить с цитатой

Seriyvolk
Бездельник


И что? В даташите про это написано.

Добавлено: Wed Oct 04, 2017 12:59 pm
Ответить с цитатой

Ivani
 


Я заебался искать это, в инете доступные схемы на ней почти все без этой емкости.
В даташите нашел только после того как поставил кондер и заработало, емкость его вообще нигде не описана.

Добавлено: Wed Oct 04, 2017 5:37 pm
Ответить с цитатой

Анна
 


http://www.atmel.com/Images/Atmel-2521-AVR-Hard...onNote_AVR042.pdf

Добавлено: Wed Oct 04, 2017 6:48 pm
Список разделов Flyback.org.ru » не HV » Микроконтроллеры и всё, что с ними связано
На страницу Пред.  1, 2, 3 ... 106, 107, 108 ... 150, 151, 152  След.     Просмотр темы целиком



Лицензионное соглашение

(c)Flyback.org.ru
Российское общество любителей высоких напряжений.
Использование материалов с данного сайта и форума возможно только с разрешения администрации.