AltSoftSerial für Nano Every erweitern

Hallo Zusammen,

grundsätzlich benötige ich eigentlich AltSoftSerial für den Nano Every, weil AltSoftSerial auch parity even kann. GitHub - lausdahl/AltSoftSerial at parity

Leider fehlt mir das KnowHow das weitere Board und Timer hinzu zu fügen.

Zu SoftwareSerial habe ich zwar eine Lösung gefunden, aber nach dem Senden gibts kein Echo, was ich aber für meine Zweck unbedingt brauche. GitHub - ljbeng/SoftwareSerialParity: This is an Arduino Library for defining Software Serial pins and adding parity to the serial protocol
Hat von euch vllt. jeand mehr ahnung von den datasheets oder weiß wie man das Echo?

Edit:

  1. was hat man (Sketch und Hardware):
  • Es soll das gesendete Byte überprüft werden und zwar mittels timeout und bytevergleich.
  1. was SOLL es machen:
  • Das gleiche möchte ich auch mit dem Nano Every ermöglichen, aber dafür gibt es nur SoftwareSerial, was das nicht kann. AltSoftSerial kann es, aber eben nicht auf dem Every.
  1. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...):
  • das gesendete Byte wird nicht gegengelesen mit SoftwareSerial.
  1. Eine Frage stellen bzw. erklären was man erwartet:
  • a Hilfestellung wie man AltSoftSerial erweitert (bevorzugt) Durch hinzufügen der Boardparameter, Register und Timer.
  • b Hilfestellung zur Realisierung mit SoftwareSerial. Gibt es alternativen zu SoftwareSerial, die mit dem Every funktionieren?

Mein Testprogramm sieht dazu so aus. Pin8+9 sind für mit einem Kabel verbunden.:

/*
Serial Echo Test
*/

#define RX_PIN 8
#define TX_PIN 9
  
#include <SoftwareSerial.h>
SoftwareSerial SerialS(RX_PIN, TX_PIN); // RX, TX

//#include <AltSoftSerial.h>
//AltSoftSerial SerialS(RX_PIN, TX_PIN); //RX, TX

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  SerialS.begin(9600);
  
  Serial.println(F("Startup"));
}


void loop() {
    
  if (Serial.available()) {
    byte write_buffer = byte(Serial.read());
    
    SerialS.write(write_buffer);
    
    unsigned long last_tx = millis();
    bool timeout_passed = true;
    
    while (!SerialS.available()) {   // WAIT FOR ECHO
      if (millis() - last_tx > 20) { //timeout 20
        Serial.println(F("WRITE TIMEOUT"));
        timeout_passed = false;
        break;
      }
    }
    if (timeout_passed) {
      if (write_buffer != byte(SerialS.read())) { // WRITE ERROR
        Serial.println(F("CHAR MISSMATCH"));
      } else {
        Serial.print(F("GREAT:0x"));
        Serial.print(write_buffer, HEX);
        Serial.println(F(" WAS SENT."));
      }
    }
  }
}

Brauchst Du wirklich den NANO EVERY?
Grüße Uwe

ja, weil ich mit dem nomalen nano relativ an der speichergrenze bin.
klar ich könnte auch einen mega nehmen, aber der passt nicht auf mein pcb, da müsste ich die ganze avr geschichte drauf platzieren. auf dieses dann doch micro-löten habe ich eigentlich keine lust.

Gib uns mal den gesamten Sketch.
Wahrscheinlich können wir Dir beim Speichersparen helfen.
Es gibt den ATmega2560 auch auf einer kleinen Platine.
Grüße Uwe

ich schick dir ne pn, da der zeitliche aufwand und knowhow, der drin steckt, nicht so schnell veröffentlicht werden soll.

Mit einer solchen Einstellung outest Du Dich als Schmarozer und solltest keine Hilfe bekommen.

Gruß Tommy

harryberlin:
ja, weil ich mit dem nomalen nano relativ an der speichergrenze bin.

wenn ich mir deinen Mustersketch anschaue und so etwas lese

Serial.println("Startup");

dann wundert mich das nicht.

Heh, Vorsicht mit euren Äußerungen!

Habe sehr viel Zeit damit verbracht und auch Geld rein gesteckt, was in meinem Programm steckt.
Ich habe kein Problem damit das Ergebnis zu teilen, aber die Source aktuell nicht für Jedermann zugänglich.

Schade dass man auf sein Testsketch reduziert wird, weil F() fehlt. @noiasca: Oder was möchtest du mir sagen?

harryberlin:
Schade dass man auf sein Testsketch reduziert wird, weil F() fehlt. @noiasca: Oder was möchtest du mir sagen?

Klar reduziere ich deine Fähigkeiten auf das, das was du zeigst. Mehr sehe ich ja nicht.
"Geheimer" Code passt nicht zu einem Forum.

Hier investiert jeder sehr viel Zeit/Geld in die Programmierung, Hardware und Hilfestellung für Probleme Anderer, daher wenn dir geholfen werden soll, spiel mit offenen Karten!

Ich pfeife normalerweise auf die Karmapunkte, aber vielleicht sagen 0 Punkte nach 100 Posts doch etwas über das vorherige Verhalten aus... :wink:

Ganz nebenbei, wenn du nur überprüfen willst, ob SoftwareSerial verfügbar ist, nutze .isListening(), .available() konnte ich mit SoftwareSerial nicht nutzen. Die Libs sind übrigens kein Geheimnis, sondern werden mit allen geteilt und sind auch für dich einsehbar, dafür schreiben viele Entwickler so ein-zwei Kommentare in die Libs.

Hab euch PNs geschickt um meine Code mit euch zu teilen.
Was ein Forum ist und heißt weiß ich natürlich. Helfen tue ich hier genauso, wenn ich was zu beitragen kann. Dass es nicht heraussticht, mag daran liegen, dass ich kein Profi bin.

Mal vom großen Ganzen ab, zurück zum Teilziel hier:

  1. was hat man (Sketch und Hardware):
  • Es soll das gesendete Byte überprüft werden und zwar mittels timeout und bytevergleich.
  1. was SOLL es machen:
  • Das gleiche möchte ih auch mit dem Nano Every ermöglichen, aber dafür gibt es nur SoftwareSerial, was das nicht kann. AltSoftSerial kann das, aber eben nicht auf dem Every.
  1. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
  • das gesendete Byte wird nicht gegengelesen mit SoftwareSerial.
  1. Eine Frage stellen bzw. erklären was man erwartet
  • a Hilfestellung wie man AltSoftSerial erweitert (bevorzugt) Durch hinzufügen der Boardparameter, Register und Timer.
  • b Hilfestellung zur Realisierung mit SoftwareSerial. Gibt es alternativen zu SoftwareSerial, die mit dem Every funktionieren?

Auf dem Nano 3.0 schaut das ganze so aus:

/*
Serial Echo Test
*/

#define RX_PIN 8
#define TX_PIN 9
  
#include <SoftwareSerial.h>
SoftwareSerial SerialS(RX_PIN, TX_PIN); // RX, TX

//#include <AltSoftSerial.h>
//AltSoftSerial SerialS(RX_PIN, TX_PIN); //RX, TX

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  SerialS.begin(9600);
  
  Serial.println("Startup");
}


void loop() {
    
  if (Serial.available()) {
    byte write_buffer = byte(Serial.read());
    
    SerialS.write(write_buffer);
    
    unsigned long last_tx = millis();
    bool timeout_passed = true;
    
    while (!SerialS.available()) {   // WAIT FOR ECHO
      if (millis() - last_tx > 20) { //timeout 20
        Serial.println(F("WRITE TIMEOUT"));
        timeout_passed = false;
        break;
      }
    }
    if (timeout_passed) {
      if (write_buffer != byte(SerialS.read())) { // WRITE ERROR
        Serial.println(F("CHAR MISSMATCH"));
      } else {
        Serial.print(F("GREAT:0x"));
        Serial.print(write_buffer, HEX);
        Serial.println(F(" WAS SENT."));
      }
    }
  }
}

https://blog.arduino.cc/2019/05/31/getting-started-with-the-new-arduino-nano-every/:
the new peripheral set, which includes a second serial port, will finally allow communicating at the same time with a PC and with peripherals

Ist da was dran oder ist das genauso nur Marketing wie das "backwards compatible" ?

Was hat nun dein Problem genau mit Parity zu tun?
In der dokumentierten Nano-Variante sehe ich da nichts.

Was siehst du, wenn du im CHAR MISSMATCH - Zweig gesendetes und empfangenes Byte in der Fehlermeldung anzeigst? (Und wie erwartest du einen Parity Fehler bei 8 bit Nutzdaten?)

Mag schon sein, dass der Every nen zweiten Uart hat, aber ich brauchs an den pin8+9.
1:1 compatible zum nano 328P ist er nicht.

Mit Parity hat es nichts zu tun. Ich nutze die AltSoftSerial Library, weil ich sie gut finde.

Im Fall SoftwareSerial kommt es gar nicht erst zum char mismatch, weil gar kein char zurück kommt. die timeout schleife würde ewig weiterlaufen, wenn das timeout nicht drin wäre.

Da ist ein generelles Problem mit SoftwareSerial und local loopback.
Z.B. hier

https://forum.arduino.cc/index.php?topic=214848.0#msg1572427

Ist das etwa auch dein Problem?

ja, so in etwa scheint das zu sein.
heißt das, erst im nächsten loop könnte man lesen, wenn vorher geschrieben wurde? muss ich mal ausprobieren...

Aber da mit SoftwareSerial wohl keine Lösung möglich sein wird, wäre die Erweiterug von AltSoftSerial vllt. ein Weg.

Im nächsten Loop kommt auch nichts an.
Reaktionen auf die PNs blieb bisher aus.

Kann mir Jemand erklären, was bei den Timern und Bord Infos erwartet wird?
Am Beispiel der 328P.

Boards:

#define ALTSS_USE_TIMER1
#define INPUT_CAPTURE_PIN 8 // receive
#define OUTPUT_COMPARE_A_PIN 9 // transmit
#define OUTPUT_COMPARE_B_PIN 10 // unusable PWM

Timers:

#define CONFIG_TIMER_NOPRESCALE() (TIMSK1 = 0, TCCR1A = 0, TCCR1B = (1<<ICNC1) | (1<<CS10))
#define CONFIG_TIMER_PRESCALE_8() (TIMSK1 = 0, TCCR1A = 0, TCCR1B = (1<<ICNC1) | (1<<CS11))
#define CONFIG_TIMER_PRESCALE_256() (TIMSK1 = 0, TCCR1A = 0, TCCR1B = (1<<ICNC1) | (1<<CS12))
#define CONFIG_MATCH_NORMAL() (TCCR1A = TCCR1A & ~((1<<COM1A1) | (1<<COM1A0)))
#define CONFIG_MATCH_TOGGLE() (TCCR1A = (TCCR1A & ~(1<<COM1A1)) | (1<<COM1A0))
#define CONFIG_MATCH_CLEAR() (TCCR1A = (TCCR1A | (1<<COM1A1)) & ~(1<<COM1A0))
#define CONFIG_MATCH_SET() (TCCR1A = TCCR1A | ((1<<COM1A1) | (1<<COM1A0)))
#define CONFIG_CAPTURE_FALLING_EDGE() (TCCR1B &= ~(1<<ICES1))
#define CONFIG_CAPTURE_RISING_EDGE() (TCCR1B |= (1<<ICES1))
#define ENABLE_INT_INPUT_CAPTURE() (TIFR1 = (1<<ICF1), TIMSK1 = (1<<ICIE1))
#define ENABLE_INT_COMPARE_A() (TIFR1 = (1<<OCF1A), TIMSK1 |= (1<<OCIE1A))
#define ENABLE_INT_COMPARE_B() (TIFR1 = (1<<OCF1B), TIMSK1 |= (1<<OCIE1B))
#define DISABLE_INT_INPUT_CAPTURE() (TIMSK1 &= ~(1<<ICIE1))
#define DISABLE_INT_COMPARE_A() (TIMSK1 &= ~(1<<OCIE1A))
#define DISABLE_INT_COMPARE_B() (TIMSK1 &= ~(1<<OCIE1B))
#define GET_TIMER_COUNT() (TCNT1)
#define GET_INPUT_CAPTURE() (ICR1)
#define GET_COMPARE_A() (OCR1A)
#define GET_COMPARE_B() (OCR1B)
#define SET_COMPARE_A(val) (OCR1A = (val))
#define SET_COMPARE_B(val) (OCR1B = (val))
#define CAPTURE_INTERRUPT TIMER1_CAPT_vect
#define COMPARE_A_INTERRUPT TIMER1_COMPA_vect
#define COMPARE_B_INTERRUPT TIMER1_COMPB_vect

harryberlin:
wäre die Erweiterug von AltSoftSerial vllt. ein Weg.

Viel Spaß dabei.

Gruß Tommy

Hi

harryberlin:
...
Reaktionen auf die PNs blieb bisher aus.
...

Was hattest Du Dir vorgestellt?
Vll, daß die Leute, Denen Du großherzig Dein geistiges Eigentum zur Verbesserung geschickt hast, Dieses für Dich auch noch in bare Münze umwandeln?

Aber: Ist Dein Sketch und wenn man schon als Schmarotzer hingestellt wird, nur weil man schmarotzt, dann ist Das halt so.

MfG

Woher möchtest du wissen, ob ich was geschickt habe? Immer die Mutmaßungen hier....
Erwartet habe ich eine Antwort. Inhalt sei mal dahin gestellt.

Schmarotzer

Halte dich mal mit diesen asozialen Äußerungen zurück! Nein du brauchst die Erklärung jetzt nicht aus dem Wiki verlinken.

Es geht um Erweiterung von AltSoftSerial, wo wohl jeder davon profitieren kann.
Was dann damit angestellt wird, ist jedem überlassen und auch gar nicht Thema hier! Wenn du schon so korrekt sein willst. Das der Speicher nicht ausreicht war eine Randinfo, die ebenfalls nicht zum Topic hier gehört.
Vorher mal nachdenken, bevor man sich so verhält.

Hi

Das Karma kam aber jetzt nicht von Dir, oder?
Was ist daran großartig asozial, daß ich die Mit-User vor der, meiner Meinung nach recht einseitigen Situation, Die Du hier an den Tag legst, warnen, gar beschützen will?
SO gesehen bin ich aber so was von sozial ... noch etwas mehr und ich werde zum Bundespräsidenten ernannt ...

Wenn aber doch JEDER von Deinem Problem, oder eben der Lösung dazu, profitieren soll, verstehe ich Deine Geheimhaltung noch viel weniger - aber kein Ding, etwas blöd wird man ja wohl noch sein dürfen.

In diesem Sinne

PS: 'woher möchtest Du ...' - solange Du nicht nur im Forum rumlügst, hast Du Denen das Zeug geschickt - steht zumindest weiter oben so - und bisher hatte ich keinen Anlass, Dir nicht zu glauben - sollte ich besser nicht?