Ich habe mich ja nie damit beschäftigt und was ich bisher so gelesen hatte, wurde immer nur gewartet bis die Gegenstelle bereit ist und dann komplette Daten auf den Bus zum abholen gelegt.
Jetzt fällt mir auf, dass zumindest der dht da ein zeitverschlüsseltes ein bit Protokoll verwendet.
Das bedeutet, dass wenn das Timing nicht stimmt und man zwischendrin eine Pause macht, wieder von vorne anfangen muss.
Öhhmm...
Wir halten uns an das Protokoll des Herstellers, wenn wir damit erfolgreich sein wollen.
Dann klappt das auch.
Ohne Pause machen, ohne neu anfangen.
Öhhmm...
Wir halten uns an das Protokoll des Herstellers, wenn wir damit
erfolgreich sein wollen.
Dann klappt das auch.
Ohne Pause machen, ohne neu anfangen.
Und wie soll das gehen wenn die Uhrzeit über einen Interrupt kommt??
Und wie soll das gehen wenn die Uhrzeit über einen Interrupt kommt??
Wie soll die Uhrzeit über einen Interupt kommen. Darüber kann nur eine Unterbrechungsanforderung kommen. Die Daten für Stunden/Minuten/Sekunden müssen immer als Daten übertragen werden.
Und wie soll das gehen wenn die Uhrzeit über einen Interrupt kommt??
Wie soll die Uhrzeit über einen Interrupt kommen. Darüber kann nur eine Unterbrechungsanforderung kommen. Die Werte für Stunden/Minuten/Sekunden müssen immer als Daten übertragen werden.
Öhhmm...
Wir halten uns an das Protokoll des Herstellers, wenn wir damit
erfolgreich sein wollen.
Dann klappt das auch.
Ohne Pause machen, ohne neu anfangen.
Und wie soll das gehen wenn die Uhrzeit über einen Interrupt kommt??
da der dht aber keine ganze Sekunde braucht, kannst du nach dem Interrupt das abfragen.
Wenn ich die Interrupt abschalte, werden die anderen Übertragungen gestört und wenn ich die an lasse, bekomme ich keine 100 %ig sichere Übertragung hin?
Vllt. den Interrupt vom Taskwechsel abschalten, da der ja recht lange dauert und die restlichen eben probieren und bei einem Fehler neu starten?
Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen, Antwort einlesen und Interrupt wieder anschalten)?
Was ja? Ich müsste das schon wissen, damit ich jetzt nicht mit den Modulen anfange um dann festzustellen, dass das sequentielle abarbeiten nicht möglich ist...
Der Can-Controller hat scheinbar einen eigenen Puffer, müsste also klappen.
RS485 hat ja keinen Controller, da wird man die Daten schon direkt einlesen müssen, ohne die Interrupt abzuschalten, wenn man alle Werte haben will?
für IRMP gibt es alle 64µs einen IRQ, der sammelt die IR Bits, dauer im µs Bereich.
für Pedas Tasten Entprellroutine gibt es einen 10ms Timer IRQ
da im IRQ kein weiterer IRQ zugelassen ist könnte man im 10ms Timer IRQ für die Tastenentprellung ein IR Interrupt verpassen, also setzte ich ein Flag, eine Variable Bin_im_10ms_Timer_IRQ und gebe die IRQ für IR wieder frei mit sei(), wenn nun der nächste IR int kommt weiss ich ob ich im 10ms Timer IRQ bin oder nicht und muss entsprechend verzweigen/reagieren.
Bin ich noch im 10ms Timer IRQ mache nichts ist der Timer 10ms abgearbeitet, also am Ende sperre ich für den IR int mit cli() wieder und verlasse den 10ms timer tasten IRQ.
Das könnte auch bei dir funktionieren, aber die typischen IR senden Codes ja öfter so daß ein Bitausfall im IR nicht auffällt.
für IRMP gibt es alle 64µs einen IRQ, der sammelt die IR Bits, dauer im
µs Bereich.
für Pedas Tasten Entprellroutine gibt es einen 10ms Timer IRQ
da im IRQ kein weiterer IRQ zugelassen ist könnte man im 10ms Timer IRQ
für die Tastenentprellung ein IR Interrupt verpassen, also setzte ich
ein Flag, eine Variable Bin_im_10ms_Timer_IRQ und gebe die IRQ für IR
wieder frei mit sei(), wenn nun der nächste IR int kommt weiss ich ob
ich im 10ms Timer IRQ bin oder nicht und muss entsprechend
verzweigen/reagieren.
Bin ich noch im 10ms Timer IRQ mache nichts ist der Timer 10ms
abgearbeitet, also am Ende sperre ich für den IR int mit cli() wieder
und verlasse den 10ms timer tasten IRQ.
Das könnte auch bei dir funktionieren, aber die typischen IR senden
Codes ja öfter so daß ein Bitausfall im IR nicht auffällt.
Ich kenne deine Aufgabe ja nicht.
1
void softSerialRead(){
2
uint8_t d = 0;
3
4
// If RX line is high, then we don't see any start bit
5
// so interrupt is probably not for us
6
if ( !rx_pin_read() ) {
7
// Wait approximately 1/2 of a bit width to "center" the sample
8
tunedDelay(_rx_delay_centering);
9
10
uint8_t i;
11
// Read each of the 8 bits
12
for (i = 0x1; i; i <<= 1) {
13
tunedDelay(_rx_delay_intrabit);
14
uint8_t noti = ~i;
15
if (rx_pin_read())
16
d |= i;
17
else // else clause added to ensure function timing is ~balanced
18
d &= noti;
19
}
20
21
// skip the stop bit
22
tunedDelay(_rx_delay_stopbit);
23
24
// if buffer full, set the overflow flag and return
Das blockiert zwangsweise mindestens für 8 Bit jeglichen Interrupt.
Wenn jetzt von zwei solchen Teilen gleichzeitig Daten kommen, z. B. WR und Stromzähler, was passiert dann?
Kann sein, dass ich mich jetzt als Vollhorst oute, aber da kommt der Interrupt und dann ist das Signal sofort auf 8 Bit abzutasten, oder man hat einen Übertragungsfehler...
Warum nimmt man für so ein Projekt den kleinstmöglichen Mikrocontroller und kämpft dann monatelang erfolglos mit rtos-Entwicklung, nicht vorhandener Rechenleistung, zu wenig Ressourcen und fehlendem Multitasking?
Ausgeprägter Hang zu Masochismus?
Jaja, Mr. "ich mach's möglichst umständlich" jammert mal wieder. Solchen Leuten ist nicht zu helfen. Der Rest der Welt findet eine pragmatische Lösung.
Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt
und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander
abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen,
Antwort einlesen und Interrupt wieder anschalten)?
Nein.
Typisch hat man für RS485, CAN und Ethernet usw. einen Controller im MC, der die Daten puffert.
Z.B. bei der UART im AVR werden bis zu 3 Bytes gepuffert, d.h. man hat 30 Bitlängen Zeit, in den Interrupt zu springen und die Daten in einem FIFO abzuspeichern. Es bleibt also genug Zeit, um andere Interfaces zu behandeln, ohne das es Konflikte gibt. Die Daten parst man dann bequem in der Mainloop.
Etwas tricky wird es bei Sonderformaten, für die es keine Controllereinheit im µC gibt und die man mit Bitwackeln nachbilden muß. Da bietet es sich an, mit Interruptprioritäten zu arbeiten, d.h. die Interfaces mit Controller auf geringere Priorität zu setzen. Oder falls das nicht geht, die Interrupts in deren Handler frühzeitig wieder freizugeben.
Wie man z.B. 1-Wire mit Interrupts behandelt, findest Du in der Codesammlung.
Ein RTOS macht die gleichzeitige Benutzung mehrerer Interfaces deutlich komplizierter und zehrt vor allem stark an den Ressourcen der CPU. Daher ein RTOS nur mit Bedacht und viel Erfahrung benutzen.
Bei einer Funktion, die so heißt, klingeln bei mir sämtliche Alarmglocken.
Diese Implementationen sind wirklich nur für sehr eingeschränkte Anwendungen gedacht. Oft sind sie auch blockierend geschrieben und nicht über Interrupts.
Für sinnvolles Programmieren sollte man schon die entsprechenden Controllereinheiten im µC benutzen und nicht alles in Software nachbilden.
Es gibt natürlich auch UART-Implementationen mit Interrupts in Software, nur muß man dann auch deren Anforderungen an die anderen Tasks beachten. Unbekümmert nur Legosteinchen übereinander stapeln, geht dann nicht mehr.
Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt
und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander
abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen,
Antwort einlesen und Interrupt wieder anschalten)?
Nein.
Typisch hat man für RS485, CAN und Ethernet usw. einen Controller im MC,
der die Daten puffert.
Z.B. bei der UART im AVR werden bis zu 3 Bytes gepuffert, d.h. man hat
30 Bitlängen Zeit, in den Interrupt zu springen und die Daten in einem
FIFO abzuspeichern. Es bleibt also genug Zeit, um andere Interfaces zu
behandeln, ohne das es Konflikte gibt. Die Daten parst man dann bequem
in der Mainloop.
Danke für den Denkanstoß, der Arduino Mega hat scheinbar 4 Hardware UART (der Uno nur einen). Damit müsste es gehen, ohne sich selbst ein nicht funktionsfähiges Software serial hinzufrickeln was dann doch nicht fehlerfrei läuft!!
Ich würde auch sagen, für die, die nur Legosteinchen stapeln wollen, ist es ungeeignet.
Für schnell mal eben Testaus-/Eingaben zu zimmern, geht es durchaus.
Jedes Werkzeug hat seine Vor- und Nachteile. Wer die Nachteile nicht verstehen möchte, sollte es nicht benutzen.
Für was ist eigentlich das SoftwareSerial, wenn es eh nur verbuggt
läuft??
Du bist halt voll in die Arduino-Falle getappt. Die besteht darin dass man jedem Noob glaubhaft macht dass man nichts können oder wissen muss um per Copy-Paste embedded Software zu schreiben.
Ist halt nicht so. Ahnung haben hilft. Echt, ungelogen. Ansonsten wird das wie immer Lernen durch Schmerzen. Da du dich jedoch wenig einsichtig zeigst funktioniert das mit dem Lernen noch nicht so.
Es gibt Berufszweige, in denen komplette Inkompetenz sich jahrzehntelang durch selbstbewusstes Auftreten kompensieren lässt. Softwareentwicklung gehört nicht dazu.
Jetzt fällt mir auf, dass zumindest der dht da ein zeitverschlüsseltes
ein bit Protokoll verwendet.
Falls Du damit die Feuchtesensoren meinst, das ist eigentlich nicht schwer.
Eine Bitzeit dauert 76..120µs. Beim AVR @16MHz hat man also >1200 Zyklen Zeit für andere Interrupts. Wenn man da nicht zu verschwenderisch ist, läßt sich das bequem wuppen. Wie gesagt, das länger dauernde Parsen macht man eh in der Mainloop.
Da die Information in der Bitzeit liegt, bietet sich der Capture-Interrupt geradezu an. Das Einlesen erfolgt also per Interrupt im Hintergrund, ohne andere Tasks zu stören.
Leider findet man kaum konkrete Codebeispiele, sondern immer nur die Benutzung fertiger Libs. Ich habe daher keine Ahnung, wie gut deren Qualität ist, d.h. wie sauber die programmiert wurden.
In einem Artikel habe ich gelesen, daß die DHT22 gerne mal abstürzen und dann ein Power-Off benötigen. Das läßt nichts gutes ahnen. Ich vermute daher Probleme in dieser verwendeten Lib.
Wie gesagt, es mit dem Capture-Interrupt auf dem AVR selber zu implementieren, stelle ich mir einfach vor. Zum Test würde ich zuerst mal alle 41 Capture-Werte im SRAM ablegen und per UART ausgeben (SW-Serial ginge dazu auch).
So kompliziert ist Interrupt Programmierung nicht. Man muß sich erstmal Gedanken machen, welchen Teil erledigt der Interrupt und welchen das Main. Man muß also eine Vorstellung entwickeln, was kostet viel CPU-Zeit und was ist zeitkritisch und dann diese Teile im jeweiligen Kontext ausführen.
Ansonsten stößt man schnell an die Grenzen der blockierenden Programmierung.
Ein RTOS oder Multicore versucht im Prinzip das gleiche, nur wird da keine Intelligenz des Entwicklers benötigt. Die Trennung erfolgt also nicht logisch, sondern Brute Force mit einer Unmenge an Ressourcen.
Ein RTOS oder Multicore versucht im Prinzip das gleiche, nur wird da
keine Intelligenz des Entwicklers benötigt. Die Trennung erfolgt also
nicht logisch, sondern Brute Force mit einer Unmenge an Ressourcen.
Ist also im Prinzip bei gegebener Hardware nur ein sehr komplizierter Weg, denselben Zustand "geht nicht wegen Verstoß gegen timing constraints" zu erreichen.
Also wenn schon aus Gründen von Dummheit oder Faulheit oder Kostendruck die Verwendung eines RTOS attraktiv erscheint, dann gleich einen deutlich potenteren Rechenknecht als Target einplanen.
Lizenskosten für's RTOS und höhere Hardwarekosten können übrigens den Kostenvorteil bei der Entwicklung auch durchaus mal auffressen, wenn man nicht aufpasst. Hängt stark von der Stückzahl des Produkts ab. Je größer die ist, desto größer ist auch die Gefahr, dass es in der Gesamtbilanz ordentlich in's Minus geht.
Modbus hat, was ich so gelesen habe, scheinbar 19.200 bit/s, also 52,1
us pro Bit und 0,416 ms pro Byte.
Was Du alles so liest... Mit wäre es neu, dass Modbus (RTU) mit nur
einer einzigen Baudrate betrieben wird.
Und hast Du, insbesondere bei der Implementierung eines Modbus-Slaves,
auch mal Gedanken über T35 usw. gemacht? Vermutlich nicht.
Es können also 11,5 Byte über modbus eintrudeln, während ich da die
Feuchtigkeit auslese.
Einfach so, auch wenn Dein Microcontroller der Master sein sollte?
Interessant zu wissen. War bisher niemandem bekannt.
Nein und ich habe jetzt auch nicht vor darüber eine Doktorarbeit zu schreiben.
Mir reicht es, wenn die Solaranlage mit Batteriespeicher irgendwann zuverlässig läuft, ohne dass da tagelang ein Relais klackert bis ich die Batterie manuell vom Stromkreis trenne.
So ein Relais hat nämlich nur ein paar 10 tausend Schaltzyklen, bevor es den Geist aufgibt.
Danach habe ich auch noch andere Projekte in der Schublade die traurigerweise wegen Zeitmangel verstauben 😭
Ich habe ja schon nicht viel Ahnung und lese solche Sachen eigentlich um zu lernen.
Wenn ich das hier vom TO lese, dann frage ich mich, wieso macht man das?
Wieso nicht in kleinere Brocken aufteilen und erstmal eins zum Laufen bringen. Man kann auch alles auf eigene Controller realisieren und wenn das alles klappt, Stück für Stück das in eine Hardware zusammen fassen.
Dem Mut würde ich Respekt zollen, aber ich glaube nicht, dass es der Mut an Aufgaben zu wachsen ist.
Danach habe ich auch noch andere Projekte in der Schublade die
traurigerweise wegen Zeitmangel verstauben 😭
Nö, wegen deiner Unfähigkeit und mangelndem Pragmatismus. Du bläst
Probleme auch, anstatt sie zu lösen. Aber Jammern ist ja modern.
Nein, ich hab jetzt 6 Monate mit der Steuererklärung zugebracht, weil irgendeiner gerne einen Doktor hätte und es die scheinbar bei Steuergesetzen nur gibt, wenn man es noch schwerer macht.
Jetzt hatte ich ein kleines Zeitfenster für die Steuerung der Solaranlage und muss jetzt eben mit höchster Priorität den Garten fertig machen, bevor es wieder kalt wird.
Klar, kann man auch Tätigkeiten outsourcen, aber die IT wird halt teilweise sehr schlecht bezahlt.
Dabei habe ich das extra genommen um die ohne Löten komfortabel
zusammenzustecken...
was hat das mit deinen fehlenden Programmierkenntnissen zu tun?
So oft wie du hier postest könntest du auch ein klitze programmieren lernen, braucht man sowieso um die Aufgabe in kleine passende Häppchen zu zerlegen.
Der nun wohl vorläufig ruhegestellt wurde, und damit viel mehr Zeit hat,
seine unterentwickelten Programmierkenntnisse seinem Trollfaktor
anzunähern.
Nicht wirklich. Der wird wohl innert kürzester Zeit unter einem anderen Account wieder auftauchen. Zumindest wenn er nicht völlig blöd und Trollen sein eigentliches Ziel ist.
Aber: er hat genug Stoff für die Trolldetektor-KI hinterlassen. Wenn er wieder auftaucht, ist er auch schnell wiedererkannt. Genau so, wie sie seine vorherigen Inkarnationen erkannt hat.
Weswegen ich auch ziemlich sicher bin, dass er bald wieder auftauchen wird.
Notorische Trolle sind psychisch gestörte Personen, genau wie Serienmörder, bloß nicht ganz so gefährlich für das Gemeinwohl. Aber wie diese können sie nicht ablassen von ihrem Tun. Zumal hier keine ernsthafte Strafe droht.
Was andererseits auch irgendwie OK ist, es entsteht ja niemandem ein Schaden. Jedenfalls nicht, wenn man nicht bereit ist, freiwillig etwas zu tun. Also dem Troll zu antworten und tatsächlich Geistesleistungen aufzuwenden, um eine kompetente Antwort zu geben. Der Aufwand ist umsonst, klar. Aber es ist kein Schaden im Sinne des BGB, da er freiwillig und ohne vorherige Vereinbarung einer Gegenleistung erbracht wurde.
Der wird wohl innert kürzester Zeit unter einem anderen
Account wieder auftauchen. Zumindest wenn er nicht völlig blöd und
Trollen sein eigentliches Ziel ist.
Glaube nicht dass Trollen sein eigentliches Ziel war.
Sonst hätte er nicht mit Links um sich geschmissen, die ihn mit 2-3 Mausklicks mit vollem Realnamen, vollständiger Adresse usw. "enttarnen".
Ich denke es ist eher das, was ich oben geschrieben habe: Der hat