Помогите решить проблему

Тема в разделе "Arduino & Shields", создана пользователем fiberline, 18 апр 2012.

  1. fiberline

    fiberline Нуб

    Ниже представлен скетч для работы с RFID метками, в принципе всё работает, но осталась одна проблема.
    В конце кода обрабатывается 1 считанная радио-метка и сравнивается шестью запрограммированными в коде, эта часть работает нормально, не получается сделать следующее:
    1. считали любой из 6 ключей на PIN14 на 2 сек. лог 1. затем обратно 0
    2. считали ещё раз любой из 6 ключей(необязательно тотже) на PIN15 на 2 сек. лог 1. затем обратно 0. Итак вне зависимости от того какой ключ из шести и в какой последовательности считали, пины 14 и 15 должны включаться строго по очереди.

    Код (Text):

    001    // Reader A  Pins 4 & 5
    002    #include "pins_arduino.h"
    003    /* Pin to interrupt map:
    004     * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2
    005     * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0
    006     * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1
    007     */
    008
    009    volatile uint8_t *port_to_pcmask[] = {
    010       &PCMSK0,
    011       &PCMSK1,
    012       &PCMSK2
    013    };
    014
    015    typedef void (*voidFuncPtr)(void);
    016
    017    volatile static voidFuncPtr PCintFunc[24] = {
    018      NULL };
    019
    020    volatile static uint8_t PCintLast[3];
    021
    022     void PCattachInterrupt(uint8_t pin, void (*userFunc)(void), int mode) {
    023      uint8_t bit = digitalPinToBitMask(pin);
    024      uint8_t port = digitalPinToPort(pin);
    025      uint8_t slot;
    026      volatile uint8_t *pcmask;
    027
    028      if (mode != CHANGE) {
    029        return;
    030      }
    031      if (port == NOT_A_PORT) {
    032        return;
    033      }
    034      else {
    035        port -= 2;
    036        pcmask = port_to_pcmask[port];
    037      }
    038      slot = port * 8 + (pin % 8);
    039      PCintFunc[slot] = userFunc;
    040      *pcmask |= bit;
    041      PCICR |= 0x01 << port;
    042    }
    043
    044    void PCdetachInterrupt(uint8_t pin) {
    045      uint8_t bit = digitalPinToBitMask(pin);
    046      uint8_t port = digitalPinToPort(pin);
    047      volatile uint8_t *pcmask;
    048
    049      if (port == NOT_A_PORT) {
    050        return;
    051      }
    052      else {
    053        port -= 2;
    054        pcmask = port_to_pcmask[port];
    055      }
    056
    057      *pcmask &= ~bit;
    058      if (*pcmask == 0) {
    059        PCICR &= ~(0x01 << port);
    060      }
    061    }
    062
    063    static void PCint(uint8_t port) {
    064      uint8_t bit;
    065      uint8_t curr;
    066      uint8_t mask;
    067      uint8_t pin;
    068
    069      curr = *portInputRegister(port+2);
    070      mask = curr ^ PCintLast[port];
    071      PCintLast[port] = curr;
    072      if ((mask &= *port_to_pcmask[port]) == 0) {
    073        return;
    074      }
    075      for (uint8_t i=0; i < 8; i++) {
    076        bit = 0x01 << i;
    077        if (bit & mask) {
    078        pin = port * 8 + i;
    079        if (PCintFunc[pin] != NULL) {
    080          PCintFunc[pin]();
    081        }
    082        }
    083      }
    084    }
    085
    086
    087    SIGNAL(PCINT2_vect) {
    088      PCint(2);
    089    }
    090
    091    volatile long reader1 = 0;
    092    volatile int reader1Count = 0;
    093
    094    void reader1One(void) {
    095      if(digitalRead(4) == LOW){
    096      reader1Count++;
    097      reader1 = reader1 << 1;
    098      reader1 |= 1;
    099      }
    100    }
    101
    102      void reader1Zero(void) {
    103      if(digitalRead(5) == LOW){
    104      reader1Count++;
    105      reader1 = reader1 << 1;
    106      }
    107    }
    108
    109    /*void reader2One(void) {
    110      if(digitalRead(6) == LOW){
    111      reader2Count++;
    112      reader2 = reader2 << 1;
    113      reader2 |= 1;
    114      }
    115    }
    116
    117    void reader2Zero(void) {
    118      if(digitalRead(7) == LOW){
    119      reader2Count++;
    120      reader2 = reader2 << 1;
    121      }
    122    }
    123
    124    void reader3One(void) {
    125      if(digitalRead(8) == LOW){
    126      reader3Count++;
    127      reader3 = reader3 << 1;
    128      reader3 |= 1;
    129      }
    130    }
    131
    132    void reader3Zero(void) {
    133      if(digitalRead(9) == LOW){
    134      reader3Count++;
    135      reader3 = reader3 << 1;
    136      }
    137    }
    138    */
    139
    140    void setup()
    141    {
    142      Serial.begin(9600);
    143
    144      PCattachInterrupt(4, reader1One, CHANGE);
    145      PCattachInterrupt(5, reader1Zero, CHANGE);
    146
    147      delay(10);
    148
    149      for(int i = 4; i<10; i++){
    150      pinMode(i, OUTPUT);
    151       digitalWrite(i, HIGH);
    152      digitalWrite(i, LOW);
    153      pinMode(i, INPUT);
    154      digitalWrite(i, HIGH);
    155      }
    156      delay(10);
    157
    158      reader1 = 0;
    159      reader1Count = 0;
    160    }
    161
    162    void loop() {
    163          if(reader1Count >= 26){
    164          Serial.print(" Reader 1 ");Serial.println(reader1,HEX);
    165                // Обработка полученного кода ключа
    166                if (reader1 == 0x1BD2421)
    167                               {
    168                               pinMode(14, OUTPUT);
    169                               digitalWrite(14,HIGH);
    170                               delay (2000);
    171                               digitalWrite(14,LOW);
    172                               }
    173                else if (reader1 == 0x16F3D32)
    174                                {
    175                               pinMode(14, OUTPUT);
    176                               digitalWrite(14,HIGH);
    177                               delay (2000);
    178                               digitalWrite(14,LOW);
    179                                }
    180                else if (reader1 == 0x0000000)
    181                                {
    182                               digitalWrite(13,HIGH);
    183                               delay (2000);
    184                               digitalWrite(13,LOW);
    185                                }
    186                else if (reader1 == 0x0000000)
    187                                {
    188                               digitalWrite(13,HIGH);
    189                               delay (2000);
    190                               digitalWrite(13,LOW);
    191                                }
    192                else if (reader1 == 0x0000000)
    193                                {
    194                               digitalWrite(13,HIGH);
    195                               delay (2000);
    196                               digitalWrite(13,LOW);
    197                                }
    198                 else if (reader1 == 0x0000000)
    199                                {
    200                               digitalWrite(13,HIGH);
    201                               delay (2000);
    202                               digitalWrite(13,LOW);
    203                                }
    204
    205                 else {
    206                      Serial.print(" key not registered in base ");
    207                      Serial.println();
    208                      }
    209         reader1 = 0;
    210         reader1Count = 0;
    211         }
    212    }
     
     
  2. Витя

    Витя Гик

    Логика плохая и поломанная (сравнение с нулями, включение 13 пина вместо 14 и 15). Не нужно делать много if'ов нужно все коды в массиве сохранить и в цикле его проверять. Пример:

    Код (Text):

    long RFID[6] = {1, 2, 3, 4, 5, 6}; // тут коды
    boolean isKnownRFID(long code)
    {
      for (byte n = 0; n < 6; n++)
        if (code == RFID[n])
          return true;
      return false;
    }
    Для чередования можно например завести логическую переменную которую менять как только что то распознали. Менять на противоположное значение. Пример:
    Код (Text):
    boolean isTo14orTo15;

    if (isKnownRFID(reader1))
    {
      isTo14orTo15 = !isTo14orTo15;
      digitalWrite(isTo14orTo15 ? 14 : 15, HIGH);
      delay(2000);
       digitalWrite(isTo14orTo15 ? 14 : 15, LOW);
    }
    И пины нужно в setup настроить один раз на ввод/вывод.
     
    fiberline нравится это.
  3. fiberline

    fiberline Нуб

    Спасибо за скорую помощь!!! На счёт сравнения с нулями, там потом будут нужные коды, вкл. 13 просто когда код сюда вставлял забыл экспериментальные части поправить, много if"фов согласен, пытался через switch case но там накладка вышла delay складывались, планировал все усовершенствования потом делать.
    Спасибо ещё раз, буду пробовать.
     
  4. fiberline

    fiberline Нуб

    Снова крик о помощи!!!
    Ща башка взарвётся.
    Ткните носом, где я туплю.
    Код (Text):
    // Reader A  Pins 4 & 5
    #include "pins_arduino.h"
    /* Pin to interrupt map:
     * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2
     * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0
     * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1
     */

    volatile uint8_t *port_to_pcmask[] = {
       &PCMSK0,
       &PCMSK1,
       &PCMSK2
    };

    typedef void (*voidFuncPtr)(void);

    volatile static voidFuncPtr PCintFunc[24] = {
      NULL };

    volatile static uint8_t PCintLast[3];

     void PCattachInterrupt(uint8_t pin, void (*userFunc)(void), int mode) {
      uint8_t bit = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin);
      uint8_t slot;
      volatile uint8_t *pcmask;

      if (mode != CHANGE) {
        return;
      }
      if (port == NOT_A_PORT) {
        return;
      }
      else {
        port -= 2;
        pcmask = port_to_pcmask[port];
      }
      slot = port * 8 + (pin % 8);
      PCintFunc[slot] = userFunc;
      *pcmask |= bit;
      PCICR |= 0x01 << port;
    }

    void PCdetachInterrupt(uint8_t pin) {
      uint8_t bit = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin);
      volatile uint8_t *pcmask;

      if (port == NOT_A_PORT) {
        return;
      }
      else {
        port -= 2;
        pcmask = port_to_pcmask[port];
      }

      *pcmask &= ~bit;
      if (*pcmask == 0) {
        PCICR &= ~(0x01 << port);
      }
    }

    static void PCint(uint8_t port) {
      uint8_t bit;
      uint8_t curr;
      uint8_t mask;
      uint8_t pin;

      curr = *portInputRegister(port+2);
      mask = curr ^ PCintLast[port];
      PCintLast[port] = curr;
      if ((mask &= *port_to_pcmask[port]) == 0) {
        return;
      }
      for (uint8_t i=0; i < 8; i++) {
        bit = 0x01 << i;
        if (bit & mask) {
        pin = port * 8 + i;
        if (PCintFunc[pin] != NULL) {
          PCintFunc[pin]();
        }
        }
      }
    }

    //SIGNAL(PCINT0_vect) {
    // PCint(0);
    //}
    //SIGNAL(PCINT1_vect) {
    //  PCint(1);
    //}
    SIGNAL(PCINT2_vect) {
      PCint(2);
    }

    volatile long reader1 = 0;     //,reader2 = 0, reader3 = 0;
    volatile int reader1Count = 0; //, reader2Count = 0,  reader3Count = 0;

    void reader1One(void) {
      if(digitalRead(4) == LOW){
      reader1Count++;
      reader1 = reader1 << 1;
      reader1 |= 1;
      }
    }

      void reader1Zero(void) {
      if(digitalRead(5) == LOW){
      reader1Count++;
      reader1 = reader1 << 1;
      }
    }

    /*void reader2One(void) {
      if(digitalRead(6) == LOW){
      reader2Count++;
      reader2 = reader2 << 1;
      reader2 |= 1;
      }
    }

    void reader2Zero(void) {
      if(digitalRead(7) == LOW){
      reader2Count++;
      reader2 = reader2 << 1;
      }
    }

    void reader3One(void) {
      if(digitalRead(8) == LOW){
      reader3Count++;
      reader3 = reader3 << 1;
      reader3 |= 1;
      }
    }

    void reader3Zero(void) {
      if(digitalRead(9) == LOW){
      reader3Count++;
      reader3 = reader3 << 1;
      }
    }
    */

    void setup()
    {
      Serial.begin(9600);
      // Attach pin change interrupt service routines from the Wiegand RFID readers
      PCattachInterrupt(4, reader1One, CHANGE);
      PCattachInterrupt(5, reader1Zero, CHANGE);
      //PCattachInterrupt(6, reader2One, CHANGE);
      //PCattachInterrupt(7, reader2Zero, CHANGE);
      //PCattachInterrupt(8, reader3One, CHANGE);
      //PCattachInterrupt(9, reader3Zero, CHANGE);
      delay(10);

      for(int i = 4; i<10; i++){
      pinMode(i, OUTPUT);
       digitalWrite(i, HIGH);
      digitalWrite(i, LOW);
      pinMode(i, INPUT);
      digitalWrite(i, HIGH);
      }
      delay(10);

      reader1 = 0; //reader2 = reader3 = 0;
      reader1Count = 0; // reader2Count =  reader3Count = 0;
    }
          void loop()
          if(reader1Count >= 26)
          {
          Serial.print(" Reader 1 ");Serial.println(reader1,HEX);
    // Обработка ключа
                long RFID[6] = {0x16F3D32, 0x0000001, 0x0000002,
                                0x0000003, 0x0000004, 0x0000005}; // тут коды
                boolean isKnownRFID (long code)
                {
                 for (byte n = 0; n < 6; n++)
                   if (code == RFID[n])
                    return true;
                    return false;
                      boolean isTo14orTo15;
                      if (isKnownRFID(reader1))
                      {
                      isTo14orTo15 = !isTo14orTo15;
                      pinMode(14, OUTPUT);
                      pinMode(15, OUTPUT);
                      digitalWrite(isTo14orTo15 ? 14 : 15, HIGH);
                      delay(2000);
                      digitalWrite(isTo14orTo15 ? 14 : 15, LOW);
                      }
         reader1 = 0;
         reader1Count = 0;
         }
    }
    ошибка: wiegand26_for_experiments:170: error: expected initializer before 'if'
     
  5. Витя

    Витя Гик

    Обявление функции isKnownRFID внутри другой функции. Так Си не умеет и еще она даже не закрыта. Там совсем все не правильно. Вам надо книжку по Си почитать это там самое начало.
     
  6. fiberline

    fiberline Нуб

    Уважаемые профи, помогите найти ошибку!
    RFID_reader_IF_ELSE_experiments_2:186: error: expected unqualified-id before 'if'
    Понимаю, что нехватает чего-то перед "
    if (isKnownRFID(StateKey))" , но если закоментить всё начиная с последнего
    ИФА то ошибок уже нет.

    Код (Text):
    // Reader A  Pins 4 & 5
    #include "pins_arduino.h"
    /* Pin to interrupt map:
    * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2
    * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0
    * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1
    */
     
    volatile uint8_t *port_to_pcmask[] = {
      &PCMSK0,
      &PCMSK1,
      &PCMSK2
    };
     
    typedef void (*voidFuncPtr)(void);
     
    volatile static voidFuncPtr PCintFunc[24] = {
      NULL };
     
    volatile static uint8_t PCintLast[3];
     
    void PCattachInterrupt(uint8_t pin, void (*userFunc)(void), int mode) {
      uint8_t bit = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin);
      uint8_t slot;
      volatile uint8_t *pcmask;
     
      if (mode != CHANGE) {
        return;
      }
      if (port == NOT_A_PORT) {
        return;
      }
      else {
        port -= 2;
        pcmask = port_to_pcmask[port];
      }
      slot = port * 8 + (pin % 8);
      PCintFunc[slot] = userFunc;
      *pcmask |= bit;
      PCICR |= 0x01 << port;
    }
     
    void PCdetachInterrupt(uint8_t pin) {
      uint8_t bit = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin);
      volatile uint8_t *pcmask;
     
      if (port == NOT_A_PORT) {
        return;
      }
      else {
        port -= 2;
        pcmask = port_to_pcmask[port];
      }
     
      *pcmask &= ~bit;
      if (*pcmask == 0) {
        PCICR &= ~(0x01 << port);
      }
    }
     
    static void PCint(uint8_t port) {
      uint8_t bit;
      uint8_t curr;
      uint8_t mask;
      uint8_t pin;
     
      curr = *portInputRegister(port+2);
      mask = curr ^ PCintLast[port];
      PCintLast[port] = curr;
      if ((mask &= *port_to_pcmask[port]) == 0) {
        return;
      }
      for (uint8_t i=0; i < 8; i++) {
        bit = 0x01 << i;
        if (bit & mask) {
          pin = port * 8 + i;
          if (PCintFunc[pin] != NULL) {
            PCintFunc[pin]();
          }
        }
      }
    }
     
     
    SIGNAL(PCINT2_vect) {
      PCint(2);
    }
     
    volatile long reader1 = 0;
    volatile int reader1Count = 0;
     
    void reader1One(void) {
      if(digitalRead(4) == LOW){
        reader1Count++;
        reader1 = reader1 << 1;
        reader1 |= 1;
        }
      }
     
    void reader1Zero(void) {
      if(digitalRead(5) == LOW){
        reader1Count++;
        reader1 = reader1 << 1;
        }
      }
    //-------------------------------------------
      //int RelayP14 = LOW;
      //int RelayP15 = LOW;
      //boolean LastStatePin14 = false;
      //boolean LastStatePin15 = false;
      //boolean LastStateKey = false;
      boolean isTo14orTo15; // = false;
      boolean isKnownRFID; // = false;
      boolean StateKey; // = false;
     
      void setup()
      {
      Serial.begin(9600);
      //-----------------------------------------
      //RelayP14 = 14;
      //RelayP15 = 15;
      //pinMode(RelayP14, OUTPUT);
      //pinMode(RelayP15, OUTPUT);
      //-----------------------------------------
      PCattachInterrupt(4, reader1One, CHANGE);
      PCattachInterrupt(5, reader1Zero, CHANGE);
      delay(10);
      for(int i = 4; i<10; i++){
        pinMode(i, OUTPUT);
        digitalWrite(i, HIGH);
          digitalWrite(i, LOW);
          pinMode(i, INPUT);
        digitalWrite(i, HIGH);
      }
      delay(10);
        reader1 = 0;
      reader1Count = 0;
      }
     
    void loop()
      {
      if(reader1Count >= 26)
      {
        Serial.print(" Reader 1 ");
        Serial.println(reader1,HEX);
      }
      // ---------------------------obrabotka klucha------------------
      if (reader1 == 0x1BD2421)
      {
        StateKey = true;
      }
      else if (reader1 == 0x16F3D32)
      {
        StateKey = true;
      }
      else if (reader1 == 0x2222220)
      {
        StateKey = true;
      }
      else if (reader1 == 0x0000000)
      {
        StateKey = true;
      }
      else if (reader1 == 0x0000000)
      {
        StateKey = true;
      }
      else if (reader1 == 0x0000000)
      {
        StateKey = true;
      }
     
      else {
        StateKey = false;
        Serial.print(" key not registered in base ");
        Serial.println();
          }
      reader1 = 0;
      reader1Count = 0;
      }
    //-----------------------------------------------------------      
     
      //boolean isKnownRFID;
     
      if (isKnownRFID(StateKey))
      {
      isTo14orTo15 = !isTo14orTo15;
      digitalWrite(isTo14orTo15 ? 14 : 15, HIGH);
      delay(2000);
      digitalWrite(isTo14orTo15 ? 14 : 15, LOW);
      }
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Вы в фигурных скобках запутались. Строго пользовались бы отступами, увидели как на ладони, что ваш if находится вне функции `loop`
     
    fiberline нравится это.
  8. fiberline

    fiberline Нуб

    Очень Вас прошу, ткните где поставить скобки, потому как я уже пробовал поместить if в loop , но компилятор ругается, что
    if (isKnownRFID(StateKey)) не может использоваться как функция, либо скобки не там ставлю, либо Х.З.
    Заранее спасибо!
     
  9. Rx

    Rx Нерд

    Код - хардкор, но со скобками всё в порядке.
     
    fiberline нравится это.
  10. nailxx

    nailxx Официальный Нерд Администратор

    Дык где ж в порядке: смотрите на последнюю `}` и бегите взглядом обратно, чтобы увидеть где она отрывается.

    Перенесите `{` перед последним `//-----------------------------------------------------------` В самый низ, на новую строку.
     
    fiberline нравится это.
  11. fiberline

    fiberline Нуб

    С первым согласен целиком и полностью, но ведь все когда-то начинали! А по скобкам и мне кажется, что всё в порядке, но видимо это не так раз IDE ругается.

    Перенёс скобку в самый низ на новую и получилось как я и уже писал выше RFID_reader_IF_ELSE_experiments_2:186: error: 'isKnownRFID' cannot be used as a function
     
  12. Rx

    Rx Нерд

    Что?

    Untitled-2.png
     
    fiberline нравится это.
  13. nailxx

    nailxx Официальный Нерд Администратор

    Дык не та пара. Ниже глядите, после reader1Count
     
  14. Rx

    Rx Нерд

    Посмотрел.

    Конец:
    Untitled-3.png

    Начало:
    Untitled-4.png

    Вроде, никто и не спорит на эту тему. Я, как и вы, только начинаю. Моя ошибка в том, что я привык к теории, а на практики боюсь что-то сделать не так. Поэтому, отсюда могут быть погрешности - ВЗРЫВ АРДУИНО КРОВЬ КИШКИ КВАРТИРА СГОРЕЛА.
     
    fiberline нравится это.
  15. fiberline

    fiberline Нуб

    Блин рано обрадовался, вроде обсуждение пошло поехало ну думаю ща парни просто скажут куда поставить запятую и я в шоколаде, анннет!! не тут-то было!!!
     
  16. Rx

    Rx Нерд

    И правда. Нормальные парни юзают Гугл. Хуже, когда им приходится изучать даташит.
     
  17. nailxx

    nailxx Официальный Нерд Администратор

    Doh!

    Код (Text):

    // Reader A  Pins 4 & 5
    #include "pins_arduino.h"
    /* Pin to interrupt map:
     * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2
     * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0
     * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1
     */
     
    volatile uint8_t *port_to_pcmask[] = {
        &PCMSK0,
        &PCMSK1,
        &PCMSK2
    };
     
    typedef void (*voidFuncPtr)(void);
     
    volatile static voidFuncPtr PCintFunc[24] = {
        NULL };
     
    volatile static uint8_t PCintLast[3];
     
    void PCattachInterrupt(uint8_t pin, void (*userFunc)(void), int mode) {
        uint8_t bit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        uint8_t slot;
        volatile uint8_t *pcmask;
     
        if (mode != CHANGE) {
            return;
        }
        if (port == NOT_A_PORT) {
            return;
        }
        else {
            port -= 2;
            pcmask = port_to_pcmask[port];
        }
        slot = port * 8 + (pin % 8);
        PCintFunc[slot] = userFunc;
        *pcmask |= bit;
        PCICR |= 0x01 << port;
    }
     
    void PCdetachInterrupt(uint8_t pin) {
        uint8_t bit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        volatile uint8_t *pcmask;
     
        if (port == NOT_A_PORT) {
            return;
        }
        else {
            port -= 2;
            pcmask = port_to_pcmask[port];
        }
     
        *pcmask &= ~bit;
        if (*pcmask == 0) {
            PCICR &= ~(0x01 << port);
        }
    }
     
    static void PCint(uint8_t port) {
        uint8_t bit;
        uint8_t curr;
        uint8_t mask;
        uint8_t pin;
     
        curr = *portInputRegister(port+2);
        mask = curr ^ PCintLast[port];
        PCintLast[port] = curr;
        if ((mask &= *port_to_pcmask[port]) == 0) {
            return;
        }
        for (uint8_t i=0; i < 8; i++) {
            bit = 0x01 << i;
            if (bit & mask) {
                pin = port * 8 + i;
                if (PCintFunc[pin] != NULL) {
                    PCintFunc[pin]();
                }
            }
        }
    }
     
     
    SIGNAL(PCINT2_vect) {
        PCint(2);
    }
     
    volatile long reader1 = 0;
    volatile int reader1Count = 0;
     
    void reader1One(void) {
        if(digitalRead(4) == LOW){
            reader1Count++;
            reader1 = reader1 << 1;
            reader1 |= 1;
        }
    }
     
    void reader1Zero(void) {
        if(digitalRead(5) == LOW){
            reader1Count++;
            reader1 = reader1 << 1;
        }
    }
    //-------------------------------------------
    //int RelayP14 = LOW;
    //int RelayP15 = LOW;
    //boolean LastStatePin14 = false;
    //boolean LastStatePin15 = false;
    //boolean LastStateKey = false;
    boolean isTo14orTo15; // = false;
    boolean isKnownRFID; // = false;
    boolean StateKey; // = false;
     
    void setup()
    {
        Serial.begin(9600);
        //-----------------------------------------
        //RelayP14 = 14;
        //RelayP15 = 15;
        //pinMode(RelayP14, OUTPUT);
        //pinMode(RelayP15, OUTPUT);
        //-----------------------------------------
        PCattachInterrupt(4, reader1One, CHANGE);
        PCattachInterrupt(5, reader1Zero, CHANGE);
        delay(10);
        for(int i = 4; i<10; i++){
            pinMode(i, OUTPUT);
            digitalWrite(i, HIGH);
            digitalWrite(i, LOW);
            pinMode(i, INPUT);
            digitalWrite(i, HIGH);
        }
        delay(10);
        reader1 = 0;
        reader1Count = 0;
    }
     
    void loop()
    {
        if(reader1Count >= 26)
        {
            Serial.print(" Reader 1 ");
            Serial.println(reader1,HEX);
        }
        // ---------------------------obrabotka klucha------------------
        if (reader1 == 0x1BD2421)
        {
            StateKey = true;
        }
        else if (reader1 == 0x16F3D32)
        {
            StateKey = true;
        }
        else if (reader1 == 0x2222220)
        {
            StateKey = true;
        }
        else if (reader1 == 0x0000000)
        {
            StateKey = true;
        }
        else if (reader1 == 0x0000000)
        {
            StateKey = true;
        }
        else if (reader1 == 0x0000000)
        {
            StateKey = true;
        }
     
        else {
            StateKey = false;
            Serial.print(" key not registered in base ");
            Serial.println();
        }
     
        reader1 = 0;
        reader1Count = 0;
     
        if (isKnownRFID(StateKey))
        {
            isTo14orTo15 = !isTo14orTo15;
            digitalWrite(isTo14orTo15 ? 14 : 15, HIGH);
            delay(2000);
            digitalWrite(isTo14orTo15 ? 14 : 15, LOW);
        }
    }
     
     
    fiberline нравится это.
  18. fiberline

    fiberline Нуб

    Думаете я не гуглил, ещё как, но всё, что находил так или иначе приводило к фигурным скобкам либо пропущенной точке - запятой!
    А вообще мне всегда казалось, что форум это как раз то место где можно и нужно спрашивать если сам не можешь, не умеешь, не хочешь и т.д. , хотя на деле чаще получается, что самая распространённая помощь это совет почитать книги по С++ !!!.
    С уважением.
     
  19. fiberline

    fiberline Нуб

    Так я уже пробовал, результат : RFID_reader_IF_ELSE_experiments_2:186: error: 'isKnownRFID' cannot be used as a function
     
  20. Rx

    Rx Нерд

    Не в обиду было сказано. Наверняка, меньше вас знаю. Поймите, что просто именно этот ресурс не особо распространён, как некоторые. Мало здесь тех, кто готов вам помочь реально, но я пытаюсь, а ещё и Nailxx, а ещё около 20-и гостей. Со временем эта проблема решится.
     
    fiberline нравится это.