arduino NG atmega8 как запустить SoftwareSerial на возможные 2,3 пины

slider
Offline
Зарегистрирован: 17.06.2014

для совершенно маленькой задачи решил воткнуть ардуину на базе atmega8a , но вот засада , SoftwareSerial.h не хочет работать на этом камне,

error: 'PCICR' was not declared in this scope

C:\Program Files\Arduino158\hardware\arduino\avr\variants\standard/pins_arduino.h:58:62: error: 'PCICR' was not declared in this scope
 #define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
                                                              ^
C:\Program Files\Arduino158\hardware\arduino\avr\libraries\SoftwareSerial\SoftwareSerial.cpp:399:9: note: in expansion of macro 'digitalPinToPCICR'
     if (digitalPinToPCICR(_receivePin))
 
погуглив, - это аппаратное различие от 168 и 328, что нельзя переназначать внешние прерывания.  

НО, на 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 готовых файла.

скетч для проверки

#include <SoftwareSerial.h>
 
SoftwareSerial port2(2, 3);
 
void setup()
{
  Serial.begin(9600);
  port2.begin(9600);
  Serial.println("Listening...");
}
 
void loop()
{
  while (port2.available()) {
    Serial.write(port2.read());
  }
}

 

slider
Offline
Зарегистрирован: 17.06.2014

с аппаратным тож не взлетает, походу либе DFPlayer_Mini_Mp3.h   ну очень необходимо общение с сериал на низком уровне :( 

импасбл мистер карабасов :)))

c  Serial.print(...,HEX);  тож не канает ,  для DFPlayer нужна комплексная команда с чек суммой , и видимо инитом вначале , короче забросил это гиблое дело.

1).For example, select the first song played, serial transmission section: 7E FF 06 03 00 00 01 FF E6 EF
7E --- START command
FF --- Version Information
06 --- Data length (not including parity)
03 --- Representative No.
00 --- If need to acknowledge [0x01: need answering, 0x00: do not need to return the response]
00 --- Tracks high byte [DH]
01 --- Tracks low byte [DL], represented here is the first song played
FF --- Checksum high byte
E6 --- Checksum low byte
EF --- End Command

жаль , прийдется atmega8 перепаять на atmega168  :(   , я уж было транзюк для обычного сериал монитора atmega8 поставил  на притягивание RX , чтоб при загрузке скетча , в модуль не лез мусор для него. и отпускание транзюка при начале работы нужного скетча.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

slider пишет:

с аппаратным тож не взлетает, походу либе DFPlayer_Mini_Mp3.h   ну очень необходимо общение с сериал на низком уровне :( 

И не стыдно такое писать?  Не ожидал от Вас такое.  Плееру никакие библы не нужны, ВООБЩЕ.  Достаточно просто бросать по UARTу  байты соответствующие командам (найти в даташите на плеер)  на скорости 9600 (если не изменяет память).

Proset
Offline
Зарегистрирован: 01.03.2016

правки из файла (по ссылке на статью выше) вносим в указанные файлы Используя  Notepad++(просто очень удобен)

Внимательно смотрим какая библиотека подгружается при компиляции и изменения вносим именно в нее

я так сделал у меня все работает нормально

UPD: компилируется нормально передача работает а прием нет(проблема с прерываниями не работают они в моих версиях библиотек(1.6.7)

Помогло это:https://github.com/MCUdude/MiniCore

заодно и размер кода уменьшился