Forum: Mikrocontroller und Digitale Elektronik Programmierung AVR


von Bodo M. (bodo_75)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

Bodo M. schrieb:
> Gibt es ein Grundlagenbuch, wo das schön beschrieben wird?

Was denn?
Kooperatives Multitasking? Ja! (hoffe ich)

von Stefan F. (Gast)


Lesenswert?


von Bodo M. (bodo_75)


Lesenswert?

Danke.
Genau sowas meinte ich. Jetzt muß es nur nachvollziehen und verstehen.

Beitrag #6698994 wurde von einem Moderator gelöscht.
von Joachim B. (jar)


Lesenswert?

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
von Pandur S. (jetztnicht)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Reneg (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.