Heyho,
ich bin gerade dabei, an einen uController ein DCF77 Empfänger-Modul
anzuschließen. Das klappt auch alles wunderbar. Über UART(meine
Debug-Schnittstelle) sehe ich auch, dass ich die Daten richtig empfangen
habe. Nur der entsprechende C-Code dazu schaut "schrecklich" aus. Gibt
es irgendwelche Tipps, wie man den vereinfach könnte?
DCF77 sendet in 1min 59Bits, die ich in ein Array(dcf77_rx[59)]
speichere.
Um jetzt z.B. die Parity-Bits bzw. feste Bitwerte zu überprüfen, ob ich
alles Richtig empfangen habe, schaut mein Code so aus:
Als ersten Schritt: Berechnungen packt man jeweils in eine eigene
Funktion, die man einmal erstellt und testet und danach (aus den Augen,
aus dem Sinn) nur benutzt und die im Programmverlauf nicht stört, auch
wenn sie intern etwas kompilzierter ist.
programmieren schrieb:> Kann man das irgendwie vereinfacht/leserlicher schreiben/darstellen?Tom schrieb:> Berechnungen packt man jeweils in eine eigene Funktion
Eine Funktion ist gut, WENN man sie mehrmals aufruft.
Deine Funktionen sind Unsinn weil zu hoch spezialisiert.
dcf77_rx (Arrayanfangspointer) als Parameter zu übergeben
ist Quatsch weil als globale Adresse immer gleich, es
gibt keine zweite.
Wenn man ein sinnvolles Programm haben will, erfindet man z.B. eine
Funktion
1
uint8_tbitvalue(uint8_tfirstbit,uint8_tn)
2
{
3
uint8_tvalue=0;
4
while(n--)value=(value<<1)|dcf77_rx[firstbit+n];
5
returnvalue;
6
}
die kann man dann überall aufrufen, wo man aus dem bitstram Daten
entnehmen will.
Michael B. schrieb:> Eine Funktion ist gut, WENN man sie mehrmals aufruft.
Das kann man so alleine nicht stehenlassen. Aus Gründen der
Übersichtlichkeit lagert man ja auch Programmteile in Funktionen aus,
die nur einmal aufgerufen werden.
> Deine Funktionen sind Unsinn weil zu hoch spezialisiert.
Naja, Unsinn nicht, aber sie könnte weiter verbessert werden wenn sie
die universelle Funktion von Dir aufrufen würde. Auch würde ich dennoch
den Pointer zum Buffer übergeben, selbst wenn er in diesem Fall eine
globale Variable ist. Vlt. schreibt er ja das Programm später um und der
Buffer ist dann nur noch lokal (z.B. wenn er alles im Interrupt macht).
Tom schrieb:> kommen und wild Bytes sparen...
Bytes sparen wäre hier Dummheit.
Zeilen sparen, wie im UP ebenso.
Das einzige, was hier zählt ist Lesbarkeit. Also sinnvolle Namen,
Formatierung, verständliche Operationen. Für Anfänger ist massives
"eigene Funktion draus machen" manchmal klarer zu strukturieren.. Je
lesbarer der Code mit Erfahrung wird, umso weniger ist das sinnvoll.
Michael B. schrieb:> Eine Funktion ist gut, WENN man sie mehrmals aufruft.
Die Vermeidung von Redundanz ist einer der Gründe, Funktionen zu
schreiben (oft sicher auch der wichtigste und "einsichtigste"). Andere
Gründe sind z.B. Lesbarkeit und Testbarkeit.
Man muß die Bits nicht erst umständlich speichern, sondern kann sie
direkt in knallharter Echtzeit (1Bit/s) auswerten. Am einfachsten geht
das über eine Tabelle, die auf Byteadresse und Bitwertigkeit zeigt:
Beitrag "DCF77 Uhr in C mit ATtiny26"
Auch sollte man eine interne Uhr mitlaufen lassen, damit man bei
Empfangsstörungen nicht im Regen steht.
Architekt schrieb:> Andere Gründe sind z.B. Lesbarkeit und Testbarkeit.
Genau hier entfacht sich ja der Streit, wohl unauflöslich, bei
einmaligen Aufgaben:
Lesbarkeit: Der eine navigiert lieber über Listen von Anweisungen, der
andere über Listen von Links.
Testbarkeit: Der eine favorisiert Unit-Test auf Einzeilern, dem anderen
sind Test auf höheren Ebenen wichtig.
Das "gesunde Maß" hängt natürlich von Art und Umfang der Projekte ab.
Für akademische Beispiele sind einzeiler-Funktionen immer positiv, bei
größeren Projekten selbst in relativ kleiner Zahl tödlich.
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.