Hallo, ich habe mal eine dumme Frage. Wie kann ich zwei Programme in einem Programm unterbringen? Es geht um einen Arduino. Ich habe zwei Teile, die funktionieren getrennt für sich auch ganz gut. Wie kann ich diese Teile jetzt miteinander verbinden? In frühen Jahren hab ich mal gelernt, daß das Hauptprogramm recht kurz ist. Ich habe bis jetzt RTC und Display. Unterbreche ich das Hauptprogramm nun alle, sagen wir 200ms und übertrage die Datumswerte aus dem RTC in irgendwelche Register? Den Timer stelle ich auf 3mal die Sekunde und übertrage die Werte an das Display? Da an dieses Teil noch Potentiometer und Tasten sollen, kann es doch nicht richtig sein, alles nacheinander abzufragen und die Werte zu den entsprechenden Adressaten schicken. Gibt es ein Grundlagenbuch, wo das schön beschrieben wird? Danke Bodo
Bodo M. schrieb: > Gibt es ein Grundlagenbuch, wo das schön beschrieben wird? Was denn? Kooperatives Multitasking? Ja! (hoffe ich)
Danke. Genau sowas meinte ich. Jetzt muß es nur nachvollziehen und verstehen.
Beitrag #6698994 wurde von einem Moderator gelöscht.
Bodo M. schrieb: > Den Timer stelle ich auf 3mal die Sekunde und übertrage die Werte an das > Display? ich würde ja 4x vorschlagen zählen bis 25 im 10ms Timer für Tastenentprellung P.Dannegger oder zählen bis 159 für IRMP 15kHz dann Flag setzen im Haupt loop RTC lesen und aufs Display ausgeben und Tasten oder IR codes bedienen 4x pro Sekunde das Display aktualisieren dann läuft die Uhr "geschmeidiger" weil ja im loop nicht jede Verabreitung zeitgleich erfolgt, je nach dem was sonst so anliegt, Tastenauswertung oder IR Impulse bedienen Flag wieder löschen, in der ISR läuft der Zähler ja weiter und wird das nächste Mal wieder das Flag setzen, dazwischen sind ja 250ms Zeit. Nur für IR Impulse muss eine Sonderbehandlung eingebaut werden, falls man im IRQ noch mehr macht. Optimal schreibt deine Routine in ein Schattenram Spalten Zeilen egal wann und kopiert wird dann 4x pro Sekunde unabhängig ins Display, dann braucht man sich nicht drum zu kümmern, schneller lesen kann eh keiner!
1 | // irgendwo
|
2 | sprintf_P(&menu[HAUPT_SCREEN][DATE_LINE-1][0], PSTR("%s %2d.%s %4d"), strWochenTagName_kurz(RTC.dow), RTC.day, strMonatsName_kurz( RTC.month ), RTC.year); |
3 | |
4 | // wird ins LCD kopiert
|
5 | //-------------------------------------
|
6 | for(uint8_t upd_line=0; upd_line<MAX_LINES; upd_line++) { |
7 | #if defined(__AVR_ATmega328P__)
|
8 | #ifdef DATE_LINE
|
9 | void_UpdDateLine(); |
10 | #endif // #ifdef DATE_LINE
|
11 | #ifdef TIME_LINE
|
12 | void_UpdTimeLine(); |
13 | #endif // #ifdef TIME_LINE
|
14 | void_UpdCoHeLine(); |
15 | #elif defined(ESP32)
|
16 | lcd5110.setCursor( 0, upd_line*8 ); |
17 | lcd5110.print( (char*)&menu[akt_screen][upd_line][0] ); |
18 | lcd5110.display(); |
19 | #endif // defined(__AVR__) || defined(ESP32)
|
20 | }
|
21 | lcd_updatetime=LCD_UPDATE; |
:
Bearbeitet durch User
Die Datumswerte alle 200ms uebertragen ... uii, aendern sich diese so dramatisch, oft, unerwartet ? Wie oft werden die denn benoetigt ? 5 mal die Sekunde ? Ich wuerde eine eigene RTC in software auf dem controller laufen lassen und nur bei power up synchronisieren.
Pandur S. schrieb: > Die Datumswerte alle 200ms uebertragen ... uii, aendern sich diese so > dramatisch, oft, unerwartet ? nicht Datum, Uhrzeit damit die Sekundenanzeige "geschmeidiger" läuft und zwischendurch andere Verabeitungszeiten die Anzeige nicht holperig machen 1x pro Sekunde eher holperig 4x pro Sekunde relativ flüssig, bei ADC kann man auch mal bis zu 10x pro Sekunde hochgehen um 1/10 Sekunde zu ahnen. Das ist ja leicht probierbar was einem gefällt oder was man denkt zu brauchen. Pandur S. schrieb: > Die Datumswerte alle 200ms uebertragen ... uii, aendern sich diese so > dramatisch, oft, unerwartet ? wer will denn das alte Datum sehen bei Wechsel auf 00:00 Uhr, wer mag kann auch noch eine Abfrage vorschalten ob ein neues Datum nötig ist. Auch if Abfragen kosten Speicherplatz, manchmal braucht man jedes Byte. Deine Kritik ist verständlich aber du kennst nicht alle Umstände, mein nano328p ist ratzevoll, ich bin nicht der genialste Programmierer und gehe auch Kompromisse ein.
:
Bearbeitet durch User
Nyquist hat das schon recht schön formuliert. Die optimale Polling-Frequenz hier ist somit 2Hz, nach Adam Riese also alle 500ms. Optimal dahingehend, dass man: 1. alle Änderungen mitbekommt 2. die CPU entlastet, denn 4x pro Sekunde pollen kostet natürlich CPU-Zeit, die man sich sparen kann, da ja 3x das gleiche zurückkommt.
Reneg schrieb: > denn 4x pro Sekunde pollen kostet natürlich > CPU-Zeit, die man sich sparen kann, da ja 3x das gleiche zurückkommt. das ist bei einer CPU Ausgabe aber manchmal nebensächlich ausser die CPU ist am Limit, mit weniger pollen spart man CPU Zeit aber die LCD Ausgabe kann holperig aussehen wenn eine Sekundenanzeige nicht im Takt läuft weil einige Software länger dauert. Handmultimeter geben ja auch 3x pro Sekunde aus, bei ADC Werte wäre dann 2x pro Sekunde echt zu lahm. Wie gesagt es kommt immer drauf an, muss ich jede Zeile auf dem Display sonder behandeln Datum, nur weil ich weiss das ändert sich in 24h nicht kostet diese Sonderbehandlung Programmspeicher. Es ist immer eine Abwägung zwischen CPU Nutzung & Speichernutzung, je nach Aufgaben. Geht man vom nano aus braucht man manchmal jedes Byte flash. Wechselt man von AVR zu ESP dann hat man flash und SRAM im Überfluß macht aber den Code unübersichtlicher wegen vieler Sonderbehandlungen. Ich habe ein "Gerippe" für ESP32/nano328p das RTC3231, LCD5110, Tastenabfrage und Serial In bedient, gleiche Software die man vielseitig einsetzen kann, das muss ich dann nicht immer neu programmieren sondern kann es ergänzen. Mal 433 Mhz Funke, mal DHT Feuchtemessung, mal DCF77 Wordclock, mal BerlinUhr, mal Laufschrift mit WS2812B Großdisplay 32x8. Die grundlegenden Elemente bleiben ja gleich. Kommandoauswertung "seriell in" heller/dunkler Kontrast +/-, was halt gebraucht wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.