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
заодно и размер кода уменьшился