Газоразрядный термометр

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Газоразрядный термометр

Сообщение pirat777knj » 31 янв 2017, 19:31

Всем привет.
Решил сделать термометр на газоразрядниках.
Плата готова, все собрано. В программировании полный нуль!!!!
Начал вспоминать то, что забыл лет 5 назад. И похоже не очень получается.
С горем пополам заставил работать сами индикаторы и даже переключаться с температуры на влажность и обратно.
Но вот датчик не получается заставит работать(((
Кстати: Датчик DHT22, МК мега168. Пишу в CVAVR.
Прошу помощи в доведении до ума)))
1.c
(11.63 КиБ) Скачиваний: 444
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение loox » 31 янв 2017, 20:42

pirat777knj
Скажи в чем проблема, прочитать чужой код, сомнительного качества невозможно .... ПОМОГУ
loox
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45

Re: Газоразрядный термометр

Сообщение pirat777knj » 31 янв 2017, 21:16

Проблема в том, что этот код не реагирует на присутствие датчика вообще никак. Что есть, что нет.
Выглядит это безобразие так:https://youtu.be/qF1EXywnnkc
Притом, что если закоментировать код в цикле while(1), а в начале прописать переменным просто значения, то все работает отлично.
Никаких дерганий как на видео.
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Madf » 01 фев 2017, 13:23

Схему выложили бы, может кто бы и написал вам код/прошивку.)
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Газоразрядный термометр

Сообщение pirat777knj » 02 фев 2017, 09:51

Боюсь моя схема путаницу введёт. Не старался её в удобоваримом виде делать. Делал чисто чтоб плату развести. Получилась каша.
А вот в программе в шапке подключения описаны все. Индикация динамическая. Датчик один.
А может кто скинет 100500 рабочий код для dht22?
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Madf » 02 фев 2017, 12:39

Тогда нарисуйте нормальную схему подключения по ногам МК.
Я например, в вашем коде возится не собираюсь, ибо ничего там не понятно по мелочам.
И вам обязательно Си или чтобы работало?
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Газоразрядный термометр

Сообщение Dmitry__ » 02 фев 2017, 18:27

pirat777knj писал(а):Прошу помощи в доведении до ума)))

Вообще код эпичный.
В прерывании: "if (type-=0x44)"
Во-первых "type" должен быть "volatile", иначе компилятор его может выкинуть.
Во-вторых, вдумайся в "if (type-=0x44)" :shock:
Отнять 0x44 от type и если он "true" то что-то выполнить. True - любое значение кроме нуля. Сам type = "unsigned char". При вычитании из такого типа, когда новое значение будет отрицательным, байт просто пройдет через 0xff и опять станет >0. Шансов у переменной type, при вычитании 0х44, стать нулем - минимальный. Код после if будет исполняться практически всегда. И иногда будет исполнятся "else // Если датчика нет - отображать ошибку "
И вообще, что это за хитрое использование "{...}" ???
Код: Выделить всё
if (type-=0x44)
    {if (time<2500)
    {zoff;
     if (type==0x11)
        {mon;
        indicating(1);
        }

Это же надо иметь бинарное мышление как у компилятора, чтоб понять такой код.
Если ты для "if" используешь один оператор, то делай без фигурных скобок:
Код: Выделить всё
if (type-=0x44) бла-бла-бла;


Если в if используется несколько операторов, то:
Код: Выделить всё
if (type-=0x44)
{
    бла-бла-бла;
    бла-бла-бла;
    бла-бла-бла;
}

Но не так как у тебя...

И конечно заменить "if (type-=0x44)" на:
Код: Выделить всё
type-=0x44;
if (type > 0)
{
    бла-бла-бла;
    бла-бла-бла;
    бла-бла-бла;
}

Соответственно type должен быть не беззнаковым "unsigned char", а каким-нибудь "char", а лучше "byte" или каким-нибудь int_8, ну что прописано в заголовочных файлах типов переменных...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 02 фев 2017, 19:53

Ой Ой. Запинали :D
Мужики, я не программист и не когда на него не учился, написал как знаю...
Судя по ответу - лучше мне это дело забросить вообще(((
А так писал на С тока потому, что хоть какое то понимание происходящего есть)))
Люблю знаете посидеть и поломать голову над тем, а как это сделано.
Кстати, CVAVR не воспринимает int_8, int_16 и прочее. Пишет ошибку.
А схема вот
nixie_term.png


/*******************************************************************************************************************/
Я почему-то думал что
Код: Выделить всё
if (type-=0x44)

Будет значить не равно. А оказывается он его как вычитание воспринимает.... Не знал.
Попробовал заменить на
Код: Выделить всё
if ((type>0x44)&(type<0x44))

Теперь стабильно горит символ "n" как и положено.
Теперь собственно датчик....
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Dmitry__ » 02 фев 2017, 20:37

pirat777knj писал(а):Кстати, CVAVR не воспринимает int_8, int_16 и прочее. Пишет ошибку.

Хорошо, "signed char" есть? :wink:

pirat777knj писал(а):Я почему-то думал что "if (type-=0x44)" Будет значить не равно.

Не равно будет так: "!=". A "type-=0x44" - это краткая форма присвоения: "type = type - 0x44"

Добавлено спустя 4 минуты 35 секунд:
Как и:
Код: Выделить всё
type +=0x44 = type + 0x44
type ^=0x44 = type ^ 0x44
type &=0x44 = type & 0x44

И.т.д.

Добавлено спустя 4 минуты 20 секунд:
pirat777knj писал(а):Попробовал заменить на "if ((type>0x44)&(type<0x44))

Это тоже ошибка. Один "&" - значит сделать логический and. А если ты хотел условие: "если бла-бла-бла И бла-бла-бла, то надо 2 символа "&", т.е. "if ((type>0x44)&&(type<0x44))

Добавлено спустя 3 минуты 48 секунд:
Ой, и что это вообще за условие? :)
Код: Выделить всё
if ((type>0x44)&&(type<0x44))

Такого значения не существует в природе, число не может одновременно быть больше и меньше определенного значения :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 02 фев 2017, 20:41

Ой да. Что то я совсем не внимателен. Спасибо что терпите и объясняете)
А как будет не равно?
Стоп. А насчёт 0х44 все правильно.
Меньше 44 и больше 44. это значит, что не равно 44! Или я путаю?
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Dmitry__ » 02 фев 2017, 21:12

pirat777knj писал(а):Стоп. А насчёт 0х44 все правильно.
Меньше 44 и больше 44. это значит, что не равно 44! Или я путаю?

Ну так ты русским языком повтори строчку:
"if ((type>0x44)&&(type<0x44))"
Если type больше 0x44 И type меньше 0x44, то :). T.e. type должен быть одновременно и больше и меньше.
Наверно ты хотел:
Если type больше 0x44 ИЛИ type меньше 0x44. Или = ||
"if ((type>0x44)||(type<0x44))"
А проще "не равно", т.е.:
"if (type != 0x44)"
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 02 фев 2017, 21:39

:lol:
А ведь в самом начале я так и написал. Тока просто|, а потом подумал что фигня выйдет и написал type-=0x44.
Но суть не в этом. Вы наверно поняли что я хотел просто флаг сделать. Как объявить флаг, ну т.е. 1 бит?
Иииии.... фигня в релультате, но хоть перестало дергаться. Датчик по прежнему не видит. И ему без разницы подключен тот или нет.
Притом почему то после примерно 3-4х секунд начинает дублировать цифры 7 и 6 на все индикаторы.
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Dmitry__ » 02 фев 2017, 22:01

Ну со мной можно на ты, а то мне придется переходить на Вы :)
А код тяжело смотреть, ты бы его причесал и положил опять в первое сообщение. Я встрял в разговор, увидев косяки, которые сразу бросились в глаза, а так надо моск морщить...
Отформатируй текст. Каждая открывающая фигурная скобочка должна отделятся от начала строки табуляцией. И соотв. каждая закр. скобочка должна быть на уровне соотв. открывающей скобочки. Иначе это читать невозможно.
Т.е. не так рандомно:
Код: Выделить всё
  if(bla-bla-bla)
  {
  {
     }
       }

А так:
Код: Выделить всё
  if(bla-bla-bla)
  {
       {

       }
  }
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 03 фев 2017, 00:18

Собственно вот:
1.c
(12.29 КиБ) Скачиваний: 428
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Madf » 03 фев 2017, 12:51

Не хочу показаться занудой, но глядя на эту схему (порядок), сразу становится понятно, почему в коде такая неразбериха. ;)
Ну хоть и то хлеб...

С фюзвми уже знакомы в МК?
Какой частоты у вас там импульсник на лампы? Они вообще какую частоту динамики выдержат?
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8