das mit arduino war nur vermutet, aber vielleicht bruacht er den chip wegen pinout und größe oder gar stromverbrauch
Werbung
das mit arduino war nur vermutet, aber vielleicht bruacht er den chip wegen pinout und größe oder gar stromverbrauch
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
ja, das Board wurde auf Grund der Größe gewählt, ich brauche auch nur wenige Pins. Auch der Preis spielte hier eine Rolle, es sollen 48 Stück seriell miteinander verbunden werden, jeder soll einen Sensor überwachen.
Aber ich werde meinen Code überarbeiten, bisher gibt jedes Board seine Sensordaten an das nächste Board weiter, das wiederum hängt seine Daten dran usw. bis am Ende eine sehr lange Datenkette ausgewertet wird.
Ich werde es jetzt so versuchen, das jedes Board nur fehlerhafte Sensordaten weiterleitet.
mach es doch einfacher, statt die daten entgegen zu nehmen, zwischen zu speichern und dann verändert weiter zu senden
nimm das daisy chain verfahren, dafür brauchst du aber noch eine zusätzliche leitung!
wenn der erste sensor senden möchte, zieht er eine signalleitung auf LOW (am empfänger hat die leitung einen pull up widerstand) und sendet seine daten, solange die leitung am nächsten sensor low ist, plaudert er die daten munter zum nächsten sensor weiter und zieht auch seine eigene leitung auf LOW
wenn die leitung von LOW auf HIGH wechselt (also der erste sensor seine daten fertig gesendet hat) fängt der zweite sensor an zu senden und lässt anschließend die signalleitung zum dritten sensor los, der hat inzwischen die daten vom ersten udn zweiten sensor weitererzählt während er seine signalleitung zu nr. 4 auf low hält und hängt dann seine daten mit an .... usw. usw. usw.
als empfänger bekommst du dann also nach dem stille post prinzip (daisy chain kommt von daisy duck die alles weiterschnattert) mehrere datenpäckchen aneinander gereiht auf die dann eine längere pause kommt
wenn du jetzt die signalleitung vom letzten sensor an den ersten hängst hast du sogar eine endlosreihe von paketen oder deni empfänger toggelt einfach de signalleitung des ersten sensor kurz HIGH LOW HIGH und er fängt an zu senden
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
ok, ich konnte den Code optimieren, er macht jetzt was er soll.
Danke.
so, noch mal...
ich habe hier zwei Code Schnipsel:
wird der erste Code compiliert, brauche ich 5.900 byte (Program size: 5.900 bytes (used 98% of a 6.012 byte maximum) (0,62 secs)):
wird der zweite Code compiliert, brauche ich 6.400 byte (Program too big. The size is 6400 bytes (of a 6012 byte maximum).):Code:. . . // wenn eingang <> "!" und fehler = 1, dann ausgang = (eingang(!*) + 1) & "!" & (eingang(!*) + 1) else if (inString.indexOf("!") == 0 && analogRead(1) > 1000) { mySerial.println(inp + "!" + out); } // wenn eingang <> "!" und fehler = 0, dann ausgang = (eingang(!*) + 1) // else if (inString.indexOf("!") == 0 && analogRead(1) < 1000) { // mySerial.println(out); // }
Im 2. Abschnitt wird weniger Code benutzt, doch ich brauch 500 byte mehr! Kann mir das mal jemand erklären? Ich benutze Visual Micro (Arduino), bei Atmel Studio 7 blick ich leider nicht durch und habe es wieder deinstalliert.Code:. . . // wenn eingang <> "!" und fehler = 1, dann ausgang = (eingang(!*) + 1) & "!" & (eingang(!*) + 1) // else if (inString.indexOf("!") == 0 && analogRead(1) > 1000) { // mySerial.println(inp + "!" + out); // } // wenn eingang <> "!" und fehler = 0, dann ausgang = (eingang(!*) + 1) else if (inString.indexOf("!") == 0 && analogRead(1) < 1000) { mySerial.println(out); }
Geändert von spunky9003 (12.12.2017 um 20:45 Uhr)
es ist jeweils der gleiche Code, nur wurde nur einmal der obere, dann der untere Teil auskommentiert und compiliert, alles andere ist 100% identisch.
habe den Code nochmal farblich hervorgehoben. https://www.roboternetz.de/community...l=1#post641058
ah, alles klar, hier wird in der Serial-Class erst die auszugebende Zeichenkette quasi per String-class-Methoden verlängert.
Versuche mal, den Ausgabe-string mit normalen ANSI-strcat-Methoden außerhalb von Serial zusammenzusetzen und dann erst in der kompletten neuen Variante per Serial auszugeben!
Testweise:
was macht das hier:
mySerial.print(inp);
mySerial.print("!");
mySerial.println(out);
Falls möglich, verwende auch keine String Class, sondern ANSI-C-strings, also char[] bzw. char *, das spart mächtig Speicher.
ich habe den Code nochmal überarbeitet, ich konnte ihn noch ein wenig optimieren. Leider noch immer ca. 100 Byte zu viel für den ATtiny85. Ich bin leider nicht so der Profi, sieht jemand eine Möglichkeit den Code noch weiter zu optimieren, bei den wenigen Zeilen wahrscheinlich nicht so einfach.
Code:/* Name: Sketch1.ino (speziell für IR Reflexlichtschranke, TCRT 5000) Created: 06.12.2017 14:10:36 */ #include <SoftSerial.h> SoftSerial mySerial(4, 0); // RX, TX const int LED_out = 1; // onboard LED auf Model A //const int DIST_in = 2; // Sharp Distance Sensor const int IR_in = 2; // IR Modul, Empfänger const int IR_out = 3; // IR Modul, Sender long lasttime; //String err = ""; String out_l = ""; String out_r = "1"; //String outString = "1"; String inString = ""; void setup() { mySerial.begin(9600); //pinMode(DIST_in, INPUT); // Sharp Distance Sensor pinMode(LED_out, OUTPUT); // LED Fehlermeldung pinMode(IR_out, OUTPUT); // IR Modul, Sender pinMode(IR_in, INPUT); // IR Modul, Empfänger } void loop() { if (millis() - lasttime > 500) { digitalWrite(IR_out, HIGH); // IR Modul, Sender ein digitalWrite(LED_out, LOW); // LED Fehlermeldung aus while (mySerial.available() > 0) { // sind Daten vorhanden, dann inString += (char)mySerial.read(); // Daten von anderen Modul einlesen } if (inString != "") { // wurden Daten eingelesen, dann out_r = inString.substring(inString.indexOf("!") + 1, inString.indexOf("\n") - 1).toInt() + 1; // eigene Modul-Nummer berechnen } if (analogRead(1) < 300 || analogRead(1) > 900) { // IR Modul, Empfänger abfragen, dann digitalWrite(LED_out, HIGH); // LED Fehlermeldung ein out_l = out_r; // eigene Modul-Nummer für Fehlermeldung merken } else { // keine Fehlermeldung out_l = ""; } if (inString.indexOf("!") > 0 && out_l == "") { // Fehlermeldung von anderen Modul und keine Fehlermeldung vom eigenen Modul, dann out_l = inString.substring(0, inString.indexOf("!")); // Fehlermeldung von anderen Modul weiterleiten } else if (inString.indexOf("!") > 0 && out_l != "") { // Fehlermeldung von anderen Modul und Fehlermeldung vom eigenen Modul, dann out_l = inString.substring(0, inString.indexOf("!")) + "," + out_r; // Fehlermeldung von anderen Modul und Fehlermeldung vom eigenen Modul weiterleiten } mySerial.println(out_l + "!" + out_r); // Daten zum nächsten Modul schicken, Fehlermeldung(en) + "!" + eigene Modul-Nummer inString = ""; // Eingangsdaten löschen digitalWrite(IR_out, LOW); // IR Modul, Sender aus lasttime = millis(); } }
wie es grundsätzlich geht, weiß ich von GCC auf dem Pi.
Ich spreche hier also nur über die Arduino-IDE mit den default-Einstellungen, so wie sie jeder normale Arduino-Nutzer verwendet, und wie es die Arduino IDE eben dann automatisch macht: Da wird normalerweise nichts an Compile- oder Build-Flags oder Makefile herummanipuliert.
Es geht also nur darum, inwiefern sich allein dadurch etwas ändert, dass man vollständig ohne die String-Klasse im eigenen Sourcecode auskommt, sondern stattdessen alleine char* oder char[] verwendet (d.h. nullterminierte C-strings), und dann entweder mit oder ohne Verwendung von zusätzlichen cstring-lib-Funktionen wie strcat oder strcpy arbeitet: was ändert das am Speicherbedarf für ansonsten identische Programme?
Das war die Frage an den OP.
Lesezeichen