Добрый день. У меня такая проблема с кодовым замком.. Я не знаю как оптимизировать... У меня имеется вход по карточке, по кнопке и по кодовому замку ( из 4 кнопок). Так вот.. Когда я отключаю вход по карточке, программа работает великолепно, никаких лагов, фризов ( и подобных тормозящих терминов). Но стоит мне подключить определение карточки.. Так все начинает сходить с ума: 1. Лампочка начинает явно гореть больше чем 0,5 с 2. при нажатии на кнопку дуина сперва немного подумает, и только потом начинает открывать двери.. (а может и вообще не открыть) 3. Кодовый замок тоже начинает тупить (нужно нажать какую нибудь кнопку что бы сделать вход по замку). В общем как то странно это все работает. в старых версиях моего замка (у меня их много: чисто карточка, чисто кодовый, карточка и кнопка, все вместе, и упрощенная, без Serial.print,) все работало хоть как то более менее, с кнопки сразу открывалась дверь, но лампочка все равно фризила.. Так вот, может мне кто нибудь помочь с моей проблемой? Не пугайтесь такому большому коду программа сюды не поместилась)))
В принципе.. Случай то мой.. Только как я библиотеку изменю? Вся суть то в этом и заключается.. Я же не могу свой код вставить в библиотеку (могу вернее, но только не известно, как на ней это скажется). Грузит дуину библиотека.. Может есть где нибудь скеч без нее?. Я бы глянул, попробовал..
Из библиотеки дёрни функции и в свой код вставь. Если в коде запутался - начни с алгоритма работы. Любая программа работает по алгоритму.
Попробую.. Только вот вопрос.. Код в библиотеке совпадает с кодом дуины? Я не пробовал делать библиотеки.. И можно ли просто скопировав от туда код, вставить его в мою программу?
Я умру пока буду рассматривать код (2к строчек), особенно когда с английским не очень дружишь))) Но попробовать стоит.. Я кстати нашел очень интересную закономерность.. когда подводишь руку или любой другой токо проводящий предмет к 10-13 пинам (без модуля), дуина начинает адекватно работать)
Тогда перелезай на профессиональные IDE и там симулируй. Ну или вставляй метки для дебага. Кроме тебя, тут никто не знает, как ты хочешь чтобы работала программа.
Хах, вы правы) Это как? Иль что? Не встречал.. первое время я пользовался arduino IDE Оригинальной.. Мне она не очень понравилась.. И решил перейти на Visual Studia Code..
Visual Studio Code штука хорошая - сам ей всё в подряд смотрю, те же ino файлы, ибо абдурино просит их куда-то переместить при открытии. Но для симуляции лучше использовать IDE, которые предназначены для embedded программирования. Я использую родную для AVR Atmel Studio. В ней свои приколы, особенно симуляция _delay_us(), но такой конструкцией я пользуюсь всё реже и реже.
Чтобы было понятно, о чем я: Код (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.
Ну вот, разобрал я не много библиотеку.. нашел интересный код.. Спойлер: 1 код Код (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 И нашел, что то в роде распознавания метки.. Спойлер: 2 код Код (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()
И еще на каком-то форуме нашел такой код: Спойлер: Код Код (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 }