Странное поведение Ардуино с аппаратными прерываниями

Тема в разделе "Arduino & Shields", создана пользователем Secret Cipher, 6 авг 2017.

  1. Secret Cipher

    Secret Cipher Нуб

    Я сделал программу (по книге, но по памяти), которая работает с аппаратными прерываниями (кнопки, триггер Шмитта, конденсатор, меняющий цвет светодиод и т. д). Программа не меняла цвет светодиода и не слала сообщения в порт.

    Код (C++):
    int i;
    volatile int col = 11;
    void setup() {
      Serial.begin(9600);
    pinMode(11,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(9,OUTPUT);
    attachInterrupt(0,ch,RISING);
    }
    void ch(){
      Serial.println("1");
      digitalWrite(col,0);
    col-- ;
    if (col == 8) col = 11;
    }

    void loop() {
    for (i=0;i<256;i++){
      analogWrite(col,i);
      delay(2);
    }
    for (i=254;i>0;i--){
      analogWrite(col,i);
      delay(2);
    }
    }
    После пересборки схемы, ничего не изменилось. Я скачал программу отсюда http://www.exploringarduino.com/content/ch12/ и она заработала.
    После часа попыток установить проблему, я вспомнил, что программа с сайта работает для Leonardo, а для моего Uno нужно поставить в прерывании пин 2 или 3. Я тут же поставил пин 0 в свою программу и она заработала. Это при том, что провод от кнопки подключён к пину 2.
    Если это важно, плата китайская, микросхема не в DIP корпусе.
     
    Последнее редактирование: 6 авг 2017
  2. rkit

    rkit Гуру

    digitalPinToInterrupt где?
     
  3. Secret Cipher

    Secret Cipher Нуб

    О таком в книге не упоминалось. Но вот что написано на http://wiki.amperka.ru/конспект-arduino:перетягивание-каната:

    В setup() прописывается инструкция attachInterrupt(interrupt, action, event), где interrupt может принимать значения INT0 или INT1 для портов 2 и 3 соответственно. Можно задать эти значения и с помощью функции digitalPinToInterrupt(pin), где вместо pin указать номер пина.

    Так что, похоже, это не обязательно.
     
  4. rkit

    rkit Гуру

    Вы не внимательно прочитали отрывок текста, который процитировали. Попробуйте еще раз, и сравните с тем. что у вас в коде.
     
  5. Secret Cipher

    Secret Cipher Нуб

    Я понял: INT0 - пин 2. Теперь всё понятно. Но можно ли с digitalPinToInterrupt заставить работать пины, отличные от 2 и 3?
     
  6. rkit

    rkit Гуру

    Нет. Прерывания на других пинах есть, но в среде ардуино они не задекларированы. Нужно лезть в низкоуровневое управление микроконтроллером, и это довольно мудрено для начинающих программистов. Называется pcint