Супер замок

Тема в разделе "Arduino & Shields", создана пользователем TebEnkov2222, 11 июн 2018.

  1. TebEnkov2222

    TebEnkov2222 Гик

    Добрый день. У меня такая проблема с кодовым замком.. Я не знаю как оптимизировать... У меня имеется вход по карточке, по кнопке и по кодовому замку ( из 4 кнопок).
    Так вот.. Когда я отключаю вход по карточке, программа работает великолепно, никаких лагов, фризов ( и подобных тормозящих терминов). Но стоит мне подключить определение карточки.. Так все начинает сходить с ума:
    1. Лампочка начинает явно гореть больше чем 0,5 с
    2. при нажатии на кнопку дуина сперва немного подумает, и только потом начинает открывать двери.. (а может и вообще не открыть)
    3. Кодовый замок тоже начинает тупить (нужно нажать какую нибудь кнопку что бы сделать вход по замку).
    В общем как то странно это все работает.
    в старых версиях моего замка (у меня их много: чисто карточка, чисто кодовый, карточка и кнопка, все вместе, и упрощенная, без Serial.print,) все работало хоть как то более менее, с кнопки сразу открывалась дверь, но лампочка все равно фризила..
    Так вот, может мне кто нибудь помочь с моей проблемой?

    Не пугайтесь такому большому коду :)
    программа сюды не поместилась)))
     

    Вложения:

    • Zamok_v3.0.ino
      Размер файла:
      18,6 КБ
      Просмотров:
      717
    NikitOS нравится это.
  2. Daniil

    Daniil Гуру

    Попробуйте посмотреть эту тему, может, у вас похожая проблема.
     
  3. TebEnkov2222

    TebEnkov2222 Гик

    В принципе.. Случай то мой.. Только как я библиотеку изменю? Вся суть то в этом и заключается.. Я же не могу свой код вставить в библиотеку (могу вернее, но только не известно, как на ней это скажется). Грузит дуину библиотека.. Может есть где нибудь скеч без нее?. Я бы глянул, попробовал..
     
  4. parovoZZ

    parovoZZ Гуру

    Из библиотеки дёрни функции и в свой код вставь. Если в коде запутался - начни с алгоритма работы. Любая программа работает по алгоритму.
     
  5. TebEnkov2222

    TebEnkov2222 Гик

    Попробую.. Только вот вопрос.. Код в библиотеке совпадает с кодом дуины? Я не пробовал делать библиотеки.. И можно ли просто скопировав от туда код, вставить его в мою программу?
     
  6. parovoZZ

    parovoZZ Гуру

    Ну просто не получится, придётся под свой код подправить.
     
  7. TebEnkov2222

    TebEnkov2222 Гик

    Я умру пока буду рассматривать код (2к строчек), особенно когда с английским не очень дружишь))) Но попробовать стоит.. Я кстати нашел очень интересную закономерность.. когда подводишь руку или любой другой токо проводящий предмет к 10-13 пинам (без модуля), дуина начинает адекватно работать)
     
  8. parovoZZ

    parovoZZ Гуру

    Тогда перелезай на профессиональные IDE и там симулируй.

    Ну или вставляй метки для дебага. Кроме тебя, тут никто не знает, как ты хочешь чтобы работала программа.
     
  9. TebEnkov2222

    TebEnkov2222 Гик

    Хах, вы правы)

    Это как? Иль что? Не встречал.. первое время я пользовался arduino IDE Оригинальной.. Мне она не очень понравилась.. И решил перейти на Visual Studia Code..
     
  10. parovoZZ

    parovoZZ Гуру

    Visual Studio Code штука хорошая - сам ей всё в подряд смотрю, те же ino файлы, ибо абдурино просит их куда-то переместить при открытии. Но для симуляции лучше использовать IDE, которые предназначены для embedded программирования. Я использую родную для AVR Atmel Studio. В ней свои приколы, особенно симуляция _delay_us(), но такой конструкцией я пользуюсь всё реже и реже.
     
  11. parovoZZ

    parovoZZ Гуру

    Чтобы было понятно, о чем я:

    Код (C++):
        //... Прерывание от трансивера
    ISR(EXT_INT0_vect)
    {
        uint8_t status;

        nRF_STOP();                        // Что либо писать в регистры можем только в StandBy или в PowerDown
    SPI_ReadByte(212);//del
    nRF_SELECT();

        //SPI_WriteByte(nRF_RD_REG(nRF_STATUS));
       
    status = SPI_ReadByte(nRF_NOP);            // Запрашиваем регистр статуса
    nRF_DESELECT();

    SPI_ReadByte(status);

        status = 0x70;
       
        SPI_WriteArray(nRF_WR_REG(nRF_STATUS), 1, &status);        // Сбрасываем все прерывания

        //

        ADC_Start_Conversion(ADC3);  
    }

        //... Прерывание при переполнении таймера 0
    ISR(TIM0_OVF_vect)
    {

    SPI_ReadByte(239);//del
    }

        //... Прерывание от компаратора A таймера 0
    ISR(TIM0_COMPA_vect)
    SPI_ReadByte(212);//del
    Это, собственно, и есть метки для дебага. А дальше по меткам смотрел ход выполнения программы попутно читая значения регистров. Это attiny44 и nRF24L01.
     
  12. TebEnkov2222

    TebEnkov2222 Гик

    Ну вот, разобрал я не много библиотеку.. нашел интересный код..
    Код (C++):
    bool MFRC522::PICC_IsNewCardPresent() {
        byte bufferATQA[2];
        byte bufferSize = sizeof(bufferATQA);

        // Reset baud rates
        PCD_WriteRegister(TxModeReg, 0x00);
        PCD_WriteRegister(RxModeReg, 0x00);
        // Reset ModWidthReg
        PCD_WriteRegister(ModWidthReg, 0x26);

        MFRC522::StatusCode result = PICC_RequestA(bufferATQA, &bufferSize);
        return (result == STATUS_OK || result == STATUS_COLLISION);
    } // End PICC_IsNewCardPresent()

    /**
    * Simple wrapper around PICC_Select.
    * Returns true if a UID could be read.
    * Remember to call PICC_IsNewCardPresent(), PICC_RequestA() or PICC_WakeupA() first.
    * The read UID is available in the class variable uid.
    *
    * @return bool
    */

    bool MFRC522::PICC_ReadCardSerial() {
        MFRC522::StatusCode result = PICC_Select(&uid);
        return (result == STATUS_OK);
    } // End
    И нашел, что то в роде распознавания метки..
    Код (C++):
    void MFRC522::PCD_Init() {
        bool hardReset = false;

        // Set the chipSelectPin as digital output, do not select the slave yet
        pinMode(_chipSelectPin, OUTPUT);
        digitalWrite(_chipSelectPin, HIGH);
     
        // If a valid pin number has been set, pull device out of power down / reset state.
        if (_resetPowerDownPin != UINT8_MAX) {
            // Set the resetPowerDownPin as digital output, do not reset or power down.
            pinMode(_resetPowerDownPin, OUTPUT);
     
            if (digitalRead(_resetPowerDownPin) == LOW) {    // The MFRC522 chip is in power down mode.
                digitalWrite(_resetPowerDownPin, HIGH);        // Exit power down mode. This triggers a hard reset.
                // Section 8.8.2 in the datasheet says the oscillator start-up time is the start up time of the crystal + 37,74μs. Let us be generous: 50ms.
                delay(50);
                hardReset = true;
            }
        }

        if (!hardReset) { // Perform a soft reset if we haven't triggered a hard reset above.
            PCD_Reset();
        }
     
        // Reset baud rates
        PCD_WriteRegister(TxModeReg, 0x00);
        PCD_WriteRegister(RxModeReg, 0x00);
        // Reset ModWidthReg
        PCD_WriteRegister(ModWidthReg, 0x26);

        // When communicating with a PICC we need a timeout if something goes wrong.
        // f_timer = 13.56 MHz / (2*TPreScaler+1) where TPreScaler = [TPrescaler_Hi:TPrescaler_Lo].
        // TPrescaler_Hi are the four low bits in TModeReg. TPrescaler_Lo is TPrescalerReg.
        PCD_WriteRegister(TModeReg, 0x80);            // TAuto=1; timer starts automatically at the end of the transmission in all communication modes at all speeds
        PCD_WriteRegister(TPrescalerReg, 0xA9);        // TPreScaler = TModeReg[3..0]:TPrescalerReg, ie 0x0A9 = 169 => f_timer=40kHz, ie a timer period of 25μs.
        PCD_WriteRegister(TReloadRegH, 0x03);        // Reload timer with 0x3E8 = 1000, ie 25ms before timeout.
        PCD_WriteRegister(TReloadRegL, 0xE8);
     
        PCD_WriteRegister(TxASKReg, 0x40);        // Default 0x00. Force a 100 % ASK modulation independent of the ModGsPReg register setting
        PCD_WriteRegister(ModeReg, 0x3D);        // Default 0x3F. Set the preset value for the CRC coprocessor for the CalcCRC command to 0x6363 (ISO 14443-3 part 6.2.4)
        PCD_AntennaOn();                        // Enable the antenna driver pins TX1 and TX2 (they were disabled by the reset)
    } // End PCD_Init()
     
  13. TebEnkov2222

    TebEnkov2222 Гик

    И еще на каком-то форуме нашел такой код:
    Код (C++):
    void MFRC522_init (void)
    {
       MFRC522_write_register(MFRC522_REG_COMMAND, 0x0F); // RESET
     
       MFRC522_write_register(MFRC522_REG_T_MODE, 0x8D);
       MFRC522_write_register(MFRC522_REG_T_PRESCALER, 0x3E);
       MFRC522_write_register(MFRC522_REG_T_RELOAD_L, 30);        
       MFRC522_write_register(MFRC522_REG_T_RELOAD_H, 0);
       MFRC522_write_register(MFRC522_REG_RF_CFG, 0x70);
       MFRC522_write_register(MFRC522_REG_TX_AUTO, 0x40);
       MFRC522_write_register(MFRC522_REG_MODE, 0x3D);

       if (!(MFRC522_read_register(MFRC522_REG_TX_CONTROL) & 0x03)) {MFRC522_set_bits_of_register(MFRC522_REG_TX_CONTROL, 0x03);} // Antenna ON
    }