arduino NG atmega8 как запустить SoftwareSerial на возможные 2,3 пины
- Войдите на сайт для отправки комментариев
для совершенно маленькой задачи решил воткнуть ардуину на базе atmega8a , но вот засада , SoftwareSerial.h не хочет работать на этом камне,
error: 'PCICR' was not declared in this scope
НО, на atmega8 же есть все же INT0 INT1 , они выходят на digital pin 2 и 3 , получается что все же есть аппаратная возможность использования SoftwareSerial на этих пинах
погуглив нашел статейку https://bobcopeland.com/blog/2015/11/software-serial-on-the-arduino-ng/
там предлагается патч
diff -urp arduino-dist/hardware/arduino/variants/standard/pins_arduino.h arduino/hardware/arduino/variants/standard/pins_arduino.h --- arduino-dist/hardware/arduino/variants/standard/pins_arduino.h 2015-11-11 22:27:31.264441477 -0500 +++ arduino/hardware/arduino/variants/standard/pins_arduino.h 2015-11-11 22:33:18.192432506 -0500 @@ -55,10 +55,17 @@ static const uint8_t A5 = 19; static const uint8_t A6 = 20; static const uint8_t A7 = 21; +#if defined(__AVR_ATmega8__) +#define digitalPinToPCICR(p) ((uint8_t *) 0) +#define digitalPinToPCICRbit(p) (0) +#define digitalPinToPCMSK(p) ((uint8_t *) 0) +#define digitalPinToPCMSKbit(p) (0) +#else #define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) #define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) #define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) +#endif #ifdef ARDUINO_MAIN diff -urp arduino-dist/libraries/SoftwareSerial/SoftwareSerial.cpp arduino/libraries/SoftwareSerial/SoftwareSerial.cpp --- arduino-dist/libraries/SoftwareSerial/SoftwareSerial.cpp 2015-11-12 08:13:47.219531874 -0500 +++ arduino/libraries/SoftwareSerial/SoftwareSerial.cpp 2015-11-13 09:44:34.905156815 -0500 @@ -301,6 +301,11 @@ inline void SoftwareSerial::handle_inter } } +static void isr() +{ + SoftwareSerial::handle_interrupt(); +} + #if defined(PCINT0_vect) ISR(PCINT0_vect) { @@ -401,6 +406,11 @@ void SoftwareSerial::begin(long speed) *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin)); *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin)); } + else if (_receivePin == 2 || _receivePin == 3) + { + // direct interrupts + attachInterrupt(_receivePin >> 2, isr, LOW); + } tunedDelay(_tx_delay); // if we were low this establishes the end }
но как его запустить ? Внедрение вручную в pins_arduino.h вроде прошло , а в SoftwareSerial.cpp не увенчалось успехом, прут ошибки, что то не соображу как правильно его изменить.Если кто столкнется с этим, черкните пожалуйста или лучше выложите 2 готовых файла.
скетч для проверки
с аппаратным тож не взлетает, походу либе DFPlayer_Mini_Mp3.h ну очень необходимо общение с сериал на низком уровне :(
импасбл мистер карабасов :)))
c Serial.print(...,HEX); тож не канает , для DFPlayer нужна комплексная команда с чек суммой , и видимо инитом вначале , короче забросил это гиблое дело.
жаль , прийдется atmega8 перепаять на atmega168 :( , я уж было транзюк для обычного сериал монитора atmega8 поставил на притягивание RX , чтоб при загрузке скетча , в модуль не лез мусор для него. и отпускание транзюка при начале работы нужного скетча.
с аппаратным тож не взлетает, походу либе DFPlayer_Mini_Mp3.h ну очень необходимо общение с сериал на низком уровне :(
И не стыдно такое писать? Не ожидал от Вас такое. Плееру никакие библы не нужны, ВООБЩЕ. Достаточно просто бросать по UARTу байты соответствующие командам (найти в даташите на плеер) на скорости 9600 (если не изменяет память).
правки из файла (по ссылке на статью выше) вносим в указанные файлы Используя Notepad++(просто очень удобен)
Внимательно смотрим какая библиотека подгружается при компиляции и изменения вносим именно в нее
я так сделал у меня все работает нормально
UPD: компилируется нормально передача работает а прием нет(проблема с прерываниями не работают они в моих версиях библиотек(1.6.7)
Помогло это:https://github.com/MCUdude/MiniCore
заодно и размер кода уменьшился