Ви не увійшли.
Пин в AVR может быть в четырех состояниях:
1. на вход, без подтяжки - если он подключен к входам других устройств, где тоже нет подтяжки, то он будет как антенна ловить случайные состояния
2. на вход, с подтяжкой - подключается резистор между пином и питанием, делает его состоянием "по умолчанию" лог. 1
3. на выход, логический 0
4. на выход, логическая 1
Изучите библиотечные функции, как там меняется состояние пина ADS1220_CS_PIN и какое остается после выхода из функции.
Т.е. при обращении к ADC устанавливается CS_ADC=LOW, CS_FLASH=HIGH, а при обращении к флеш - CS_ADC=HIGH, CS_FLASH=LOW ? И во втором случае ADC воспринимает данные, предаваемые по SPI и как-то меняет свои настройки? Или у Вас CS_ADC не равно HIGH (подтяжка есть?), или в ADC бага. Попробуйте представить, что в ADC реально есть бага и Вам это необходимо показать производителю ADC - напишите минимальную программу только с МК и ADC, где бага четко проявляется. По мере написания придет более глубокое понимание, Вы скорее всего найдете ошибку в своей программе. Но не исключено, что докажете багу. Я обычно поступаю по такому алгоритму, так интереснее)
Возможные причины такого поведения:
- Ваш пин A0 висит в воздухе (никуда не подтянут), возможно после отпускания кнопки программа отключает подтяжку
- Сам ADC неправильно настроен, например меряет относительно пина AREF, который сам висит в воздухе, еще возможно не подключено питание к AVCC
Локализовать проблему помог бы мультиметр - проверить напряжение на A0 и проверить сопротивление между A0 и питанием до и после отпускания кнопки
На всякий случай спрошу, вывод AVCC у Вас подключен к питанию?
а потом сыпет разными уровнями сопротивлений без остановки
Вольтметр при этом на пине, где выполняется ADC, показывает стабильное напряжение или тоже прыгает?
Я тему открыл для того, чтобы увлекающиеся люди, у которых возникает задача "как снять показания со счетчиков в системах умный дом?", знали, что есть еще и такое решение, могли подсказать его другим. Уверен, что многие будут благодарны.
Барыжат те, кто покупает готовое устройство в Китае и перепродает его тут. В данном случае это устройство - полностью мой проект, я его программировал и паял.
Kaka, судя по вашим комментариям на этом форуме в других темах, Вы здесь занимаетесь не тем, что делитесь наработками с коллегами, а занимаетесь троллингом.
Kaka, если Вы хотите бесплатно, то найдите на гитхабе по запросу owslave, выберите понравившуюся реализацию и переделайте под себя. Если Вы хотите кошерно, то купите на али оригинальную микросхему, компараторы, закажите плату и спаяйте, схем полно. Я могу Вам предложить только уже готовое свое устройство по бюджету, в который обойдется второй вариант.
Зарезервированный комментарий, сюда буду переносить важную информацию для быстрого доступа, если тема разрастется.
Буду рад ответить на вопросы связанные с подключением и настройкой счетчика.
UPD:
Счетчик импульсов уже можно приобрести в магазине arduino.ua
https://arduino.ua/prod4180-schetchik-i … -v-ykraine
В этой теме хочу рассказать про проект, который изначально делался просто для себя, но решение получилось удачным и теперь я готов поделиться с другими.
TL;DR: исходников в теме не будет
Примерно лет 10 назад ко мне попали датчики температуры DS18B20, работающие по протоколу 1-wire, наставил их везде, и в квартире, и на улице, и на стояки холодной и горячей воды. Мне очень понравился протокол: всего два провода (данные и земля), питание по линии данных (паразитное), к одному мастеру подключается куча устройств. Почитал, какие еще устройства работают по этому протоколу, из полезных для умного дома оказалось не так много: ADC, GPIO, Counter. ADC - незаменимая штука для работы с аналоговыми датчиками, например на нем собрал схему с датчиком влажности от Honeywell, GPIO - позволяет как подключать реле, так и работать на вход, Counter - с его помощью можно было бы снимать показания со счетчиков электроэнергии, воды, отопления. Почему можно было бы? Микросхему (DS2423) в то время я нигде достать не смог, позже узнал, что она уже не производится. Сейчас на али ее можно заказать по цене от 100грн, вероятно это из старых запасов.
Не так давно я увлекся AVR и как-то случайно нашел программную реализацию подчиненного устройства 1-wire (кому нужны подробности, называется owslave3d), в которой был пример реализации DS2423. Естественно все было скомпилировано и запущено, устройство определилось как DS2423! Но, как и оригинальная микросхема, оно требовало на счетном входе цифровой сигнал, а для аналоговых датчиков, того же фототранзистора, нужно городить схему с компараторами и делителями на подстроечных резисторах. Во-торых, ток потребления был порядка 1мА, от батарейки надолго не оставишь работать, нужно хотя-бы 10мкА. И в третьих, были глюки в работе - устройство отвечало ровно через раз. Поэтому я решил написать с нуля свою реализацию с блэкджеком и ... короче с вышеперечисленными фишечками.
Примерно полгода с первой реализации примерно вот такое устройство считало импульсы с моего счетчика ээ, периодически допиливал прошивку и несколько раз менял схему, каждый раз убирая из нее "лишнее". В результате из обвязки МК осталось 4 детали, включая батарейку:
Вот так выглядит страничка конфигурирования устройства
Подключение счетных датчиков, в том числе аналоговых, также по принципу минимизации обвязки: фототранзистор, инфракрасный отражатель - напрямую к выводам GND,A,B,PWR. Энергопотребления, даже с подключенными потребляющими датчиками, удалось достичь 5-15мкА.
Реализация, на мой взгляд, получилась удачная. Читая в различных статьях по умному дому, как люди ищут способ снимать показания со счетчиков, перечисляют несколько решений и выбирают подходящее для себя, понял, что мое устройство вполне могло бы конкурировать с другими решениями. Заказал в Китае печатные платы и сейчас устройство приобрело товарный вид.
Для начала посмотрю, будет ли пользоваться спросом, если да, то у меня появилось куча новых идей для новых устройств, например по 1-wire с МК можно по ИК (как с пульта ДУ) управлять различными домашними устройствами. У меня дома стоит счетчик отопления Multical, у него есть UART интерфейс, можно было бы для него сделать плату расширения (там предусмотрено подключение плат расширения) и по 1-wire читать с него данные напрямую.
#define button1 10 // кнопка1
#define button2 11 // кнопка2
#define relay1 12 // реле1
#define relay2 13 // реле2
int state;
void setup() {
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
state = 0;
}
void loop() {
switch (state) {
case 0:
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
if (digitalRead(button1) == LOW) {
state = 1;
break;
}
if (digitalRead(button2) == LOW) {
state = 2;
break;
}
break;
case 1:
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
if (digitalRead(button2) == LOW) {
state = 2;
break;
}
break;
case 2:
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
if (digitalRead(button2) == HIGH) {
state = 0;
break;
}
break;
}
}
Внешние резисторы подтяжки не нужны - использованы встроенные.
Защита от дребезга - конденсатор от 100нФ между входом и землей.
В привате отвечу, куда слать шоколадку)