Jump to content

alxm

Members
  • Content Count

    5
  • Joined

  • Last visited

Everything posted by alxm

  1. Именно так. Невозможно все изучить и сразу, если только это не необходимость по профессии. Вы правы насчет костылей. Это скорее разовая проба пера. На Attine85 в гораздо более сложном для меня проекте - такой проблемы не возникло. А этот МК вряд ли я где еще смогу использовать ввиду его характеристик и сложности отладки. А помимо программирования ведь еще сложности с аппаратной частью возникают. В общем невозможно изучить все аспекты одномоментно, потихоньку и двигаюсь вперед. В конце концов моя цель процесс, а не прийти к финишу первым)) Про стиль написания принято. Буду обращать на это внимание. С регистровыми операциями надо разобраться. У меня знакомый системотехник убеждает меня сразу начать с STMных МК. Я посмотрел что как и мне показалось что "цена входа" там намного выше в плане необходимых знаний. Здесь попроще. Но кто знает, вдруг)) Сначала я начинал собирать конструктор из готовых китайских модулей, теперь потихоньку перехожу на отдельные элементы, щупаю голые МК. Благо интернет дает ответы на многие вопросы. И перед тем как что то спросить, стараюсь сам найти ответ. Еще раз, Вам огромное Спасибо! Благодаря таким людям хочется двигаться вперед и изучать что то новое для себя.
  2. Спасибо, Добрый человек! Я уж думал совсем потерян этот мир. Что за дурацкая привычка сразу отправлять читать даташит. Просто прочитать и осмыслить 100 листов англ.текста для простого хобби по вечерам, ну не знаю. Почему не подсказать в чем конкретно проблема и как просто ее решить, и без всего этого пафоса. Второй раз и спрашивать неохота. Так хочется самоутвердиться за счет того, для кого это просто хобби? Ну ладно, самоутверждайтесь! Теперь по делу.. Проблема была в millis(). Я посмотрел исходник, ничего не понял)) Немного покурил интернет, что подтвердило что с ней что то не то. В итоге подсчет времени сделал через delay() и вуаля, все заработало как надо.. Засыпает, потребление меньше 1 мкА, ниже мультиметр не дает. Просыпается по низкому фронту. Считаю число задержек по 200мс сколько мне нужно. На этом этапе потребление около 1-1.5мА в зависимости от V питания. И снова засыпаю с потреблением 1мкА. Все просто и работает так как мне нужно! Сделать простую сигнализацию открытой двери этого достаточно. Разбираться с числом тактов совсем не нужно для этого. Спасибо всем неравнодушным))
  3. Очень хорошо, что здесь собрались великие гуру. Можете дать практические советы, чтобы можно было развиваться дальше, а не кичиться своим эго. Спасибо!
  4. Куда смотреть не подскажите?
  5. Привет! Подскажите, в чем может быть проблема. Есть следующий код. Он работает. МК уходит в сон, по датчику просыпается, отрабатывает проверку состояния и снова в сон. #include <avr/sleep.h> // здесь описаны режимы сна #include <avr/interrupt.h> // работа с прерываниями #define LED 4 #define Button 1 ISR(INT0_vect) { } //------------------------------------------------------------------- void Beep(int16_t on, uint16_t off, byte num) { for(byte i = 0; i < num; i++) { digitalWrite(LED, HIGH); _delay_ms(on); digitalWrite(LED, LOW); _delay_ms(off); } } //------------------------------------------------------------------- void setup() { pinMode(LED, OUTPUT); pinMode(Button, INPUT); pinMode(0, OUTPUT); digitalWrite(0, LOW); pinMode(2, OUTPUT); digitalWrite(2, LOW); pinMode(3, OUTPUT); digitalWrite(3, LOW); Beep(200, 70, 3); } //------------------------------------------------------------------- void loop() { // уходим в сон.. GIMSK |= _BV(INT0); //ADCSRA &= ~_BV(ADEN); // отключить ADC; уменьшает энергопотребление ADCSRA &= ~(1 << ADEN); // Отключаем АЦП; ACSR |= (1 << ACD); // Откл. компаратор; sei(); // Общее разрешение прерываний set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable(); // разрешение режима сна sleep_cpu(); // активация режима сна cli(); // отключить прерывания; для безопасного отключения PCINT3 GIMSK &= ~_BV(INT0); sleep_disable(); // запретить режим сна; MCUSR &= ~_BV(SE); sei(); // Общее разрешение прерываний _delay_ms(10); // проснулись.. ControlDoor(); } //------------------------------------------------------------------- void ControlDoor() { uint32_t timer = 0; bool flag = false; timer = millis(); // фиксируем начало таймера для открытой двери while(digitalRead(Button) == 0) {// пока открыта дверь.. if((uint32_t)(millis() - timer) >= 10000) {// прошло ХХ сек, т.е. дверь открыта все это время.. flag = true; break; } } while(flag) {// дверь открыта, время таймера вышло, сигнализируем.. Beep(1000, 2000, 1); if(digitalRead(Button) == 1) // дверь закрыта.. break; } } Но есть нюанс) Если закомментировать вызов функции ControlDoor() и оставить все остальное, в активном режиме схема потребляем 1.5mA, во время сна - меньше 1мкА. Вроде так и должно быть. С функцией ControlDoor() в спящем режиме потребление становится примерно 400мкА. Пробовал отключать всю периферию светодиод и геркон, вставлял код частями - так и получилось выяснить что потребление начинается после добавления ControlDoor(). Почему так?
×
×
  • Create New...