Перейти к содержанию

alxm

Members
  • Постов

    5
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные alxm

  1. 1 час назад, El-Shang сказал:

    Да пожалуйста. Все с чего-то начинают. Хвала в небесам в школах и в институтах еще не посылают сразу в учебники, как только у учащихся вопросы возникают. А то совсем худо было бы.

    Именно так. Невозможно все изучить и сразу, если только это не необходимость по профессии. 

    2 часа назад, El-Shang сказал:

    Это странно, ибо говорит о том, что прерывание таймера выводит контроллер изо сна, а значит, что режим энергосбережения не "Power Down", а "IDLE" - это режим в котором останавливается только тактирование процессора и флеш-памяти, все остальное продолжает работат в штатном режиме. Как-то это не согласуется с тем что у Вас в коде написано. Надо смотреть в отладчике, что же на самом деле туда записывается, а то это догадки на кофейной гуще получаются. А вот Ваше решение есьм "костыль", коих нужно избегать всем приличным технарям (любителям тоже). Лучше разобраться в природе явления и в будущем подоходить к решению подобных проблем осознанно. B)

    Вы правы насчет костылей. Это скорее разовая проба пера. На Attine85 в гораздо более сложном для меня проекте - такой проблемы не возникло. А этот МК вряд ли я где еще смогу использовать ввиду его характеристик и сложности отладки. А помимо программирования ведь еще сложности с аппаратной частью возникают. В общем невозможно изучить все аспекты одномоментно, потихоньку и двигаюсь вперед. В конце концов моя цель процесс, а не прийти к финишу первым))

    Про стиль написания принято. Буду обращать на это внимание. С регистровыми операциями надо разобраться. 

    У меня знакомый системотехник убеждает меня сразу начать с STMных МК. Я посмотрел что как и мне показалось что "цена входа" там намного выше в плане необходимых знаний. Здесь попроще. Но кто знает, вдруг)) Сначала я начинал собирать конструктор из готовых китайских модулей, теперь потихоньку перехожу на отдельные элементы, щупаю голые МК. Благо интернет дает ответы на многие вопросы. И перед тем как что то спросить, стараюсь сам найти ответ.

    Еще раз, Вам огромное Спасибо! Благодаря таким людям хочется двигаться вперед и изучать что то новое для себя. 

  2. 45 минут назад, El-Shang сказал:

    Но что-то автор сей ветки куда-то запропастился. :ph34r: Может быть даже навсегда и мы никогда не узнаем, что же у него там приключилось на самом деле.

    Спасибо, Добрый человек! Я уж думал совсем потерян этот мир. Что за дурацкая привычка сразу отправлять читать даташит. Просто прочитать и осмыслить 100 листов англ.текста для простого хобби по вечерам, ну не знаю. Почему не подсказать в чем конкретно проблема и как просто ее решить, и без всего этого пафоса. Второй раз и спрашивать неохота. Так хочется самоутвердиться за счет того, для кого это просто хобби? Ну ладно, самоутверждайтесь!

    Теперь по делу.. Проблема была в millis(). Я посмотрел исходник, ничего не понял)) Немного покурил интернет, что подтвердило что с ней что то не то. В итоге подсчет времени сделал через delay() и вуаля, все заработало как надо.. Засыпает, потребление меньше 1 мкА, ниже мультиметр не дает. Просыпается по низкому фронту. Считаю число задержек по 200мс сколько мне нужно. На этом этапе потребление около 1-1.5мА в зависимости от V питания. И снова засыпаю с потреблением 1мкА. Все просто и работает так как мне нужно! 

    Сделать простую сигнализацию открытой двери этого достаточно. Разбираться с числом тактов совсем не нужно для этого. Спасибо всем неравнодушным)) 

  3. Привет! Подскажите, в чем может быть проблема. Есть следующий код. Он работает. МК уходит в сон, по датчику просыпается, отрабатывает проверку состояния и снова в сон.

    #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(). Почему так?

×
×
  • Создать...