Бибикать и не тормозить

Тема в разделе "Arduino & Shields", создана пользователем petypen, 3 окт 2016.

  1. save.l

    save.l Гик

    и что? она же глобально объявлена. И первый код почему тогда отрабатывает корректно.
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Этого мало. Нужно сказать компилятору, что она может быть неожиданно изменена вне контекста исполнения программы. Скажите всего одно волшебное слово и проблема уйдёт. Какое слово? Гугл в помощь. Переменная используется и в программе, и в обработчике прерывания. Вот по таким словам и ищите.
    Потому что такие ошибки приводят не к стабильной проблеме, а к непредсказуемому поведению и сработать или не сработать что-то может по 100500 причинам. Когда найдёт в гугле "волшебное слово", там будет и про это подробно написано.

    Я же тебе всё объяснил "используется в обработчике прерывания, а изменяется вне его. Она сама должна сообщать об этом компилятору?", Трудно поискать как надо сообщать? Или ты сюда поспорить пришёл?
     
    save.l нравится это.
  3. b707

    b707 Гуру

    этого недостаточно.

    Глобальные переменные - это переменные программы, а код в прерывании выполняется как бы "в ином мире", отдельно от программы с ее окружением.
    Для простоты можешь считать. что код в прерывании вообще не видит никаких переменных - ни локальных, ни глобальных. Переменная должна быть особым образом помечена, чтобы ее можно было менять в прерывании
     
    save.l нравится это.
  4. parovoZZ

    parovoZZ Гуру

    volatile добавь для исключения оптимизации (если используется оптимизация. А она используется, хоть ты об этом и не догадываешься) переменной.

    если что-то идет так, как задумано, то это совсем не значит, что оно идет по плану.
     
    save.l нравится это.
  5. Asper Daffy

    Asper Daffy Иксперд

    Пришёл поручик Ржевский, и весь педагогический процесс ...
     
    Andrey12 и DetSimen нравится это.
  6. save.l

    save.l Гик

    )) успел еще до поста исправить
    Код (C++):
    #include "TimerOne.h"

    volatile uint8_t  blink_mode = 0;

    void timerIsr()
    {
       static uint8_t  blink_loop = 0;
       if(  blink_mode & 1<<(blink_loop&0x07) ){
            digitalWrite(13, HIGH);
       } else {
                digitalWrite(13, LOW);
         }
       blink_loop++;  
    }

    void setup() {
      pinMode(13,OUTPUT);
      Timer1.initialize(125000);
      Timer1.attachInterrupt( timerIsr );
    }
     
    void loop() {
       blink_mode = 0B00001111; //Мигание по 0.5 сек
       delay(5000);
       blink_mode = 0B00000001; //Короткая вспышка раз в секунду
       delay(5000);
       blink_mode = 0B00000101; //Две короткие вспышки раз в секунду
       delay(5000);
       blink_mode = 0B00010101; //Три короткие вспышки раз в секунду
       delay(5000);
       blink_mode = 0B01010101;  //Частые короткие вспышки (4 раза в секунду)
       delay(5000);
    }
    СПАСИБО всем. Все четко!