Guten Tag, ich habe einen Beitrag beigesteuert (main.c),von dem ich glaube,daß er interessant für einige ist. Es handelt hierbei um ein kleines Kunststoffgehäuse mit einer Elektronik,die unter anderem einen Attiny 84A, eine Funkstrecke mit Sender und Empfänger (433 MHz), 5 Tasten,zwei Fotozellen und Keingram beheimatet. Das alles ist verbunden mit einer Software, die einen LED-Sreifen ansteuert, der u.a. einen automatischen Betrieb zuläßt.Per Funk kann es diese LED-Ansteuerung zu einem Slave-Modul übertragen, das eigene LED-Streifen steuert. Wenn Interesse daran besteht, dann lesen bitte diese "main.c". Mit freundlichen Grüßen - arras -
Funktioniert das gezeigte Programm wirklich? Erster Blick: Deine main-Schleife schließt die Definition von
1 | void Init_Anlauf () // Anlaufprogramm |
mit ein. Diese ruft sich selbst rekursiv auf:
1 | // **** Init_Timers,Init_I2C und Init_ADC ****
|
2 | //
|
3 | Init_Timers (); |
4 | Init_ADC (); |
5 | Init_Anlauf(); // mehr z.Z. nicht.. |
Die Formatierung des Quelltextes ist katastrophal, die Strukturierung ebenso.
Tippgeber schrieb: > Diese ruft sich selbst rekursiv auf: > // **** Init_Timers,Init_I2C und Init_ADC **** > // > Init_Timers (); > Init_ADC (); > Init_Anlauf(); // mehr z.Z. nicht.. Ok, diesen Teil nehme ich zurück, nachdem ich das Programm mal in einen Codeeditor geladen habe. Es bleibt aber dabei, dass das Ganze sehr unübersichtlich ist und schlecht formatiert.
Hallo, bei meinem Entwicklungssystem (AVR,Atmel Studio 7) sieht aber alles sehr aufgeräumt aus. Ich kann Deine Einwende nicht nachvollziehen. Es liegt am Editor, der macht einem TAB (09) irgentetwas..nur keine TAB. Er muß bei einem Tabulator-Zeichen genau 4 Leerstellen machen. Gruß arras
fjm schrieb: > Er muß bei einem Tabulator-Zeichen genau 4 Leerstellen machen. Schreib es doch einfach in den Quelltext hinein…
Tippgeber schrieb: > Es bleibt aber dabei, dass das Ganze sehr unübersichtlich ist und > schlecht formatiert. und von mäßiger Code-Quality = 1.Lehrjahr!, weil: - massenweise sinnlose Initialisierung von global Variables mit 0x00 - tonnenweise global Variables ist strukturlos - händisches Adressenhandling im EEPROM, das macht struct von selbst - if () if () ..., wenn ein if () mit der gesamten Bedingung reicht - massenweise redundante Codebereiche - massenweise Variable-Bezeichner ohne Sinn - ... Ich könnte hier x-weitere Punkte listen. Dieser Code ist unübersichtlich bzw. unlesbar und hat Klippschulniveau! Ich würde mal ein C-Buch lesen UND mir guten Code anschauen UND dazu lernen oder doch lieber Kuchenbacken.
Hallo AllesKönner ! Ich wollte kein Lehrbuch in C schreiben, noch ein kurzes Quellcode-Release machen. Es kem mir darauf an, eine - ggf. umstängiges und weitreichendes Werk zu generieren, in dem auch Sequenzen enthalten sind, die nicht im HEX-file wiederverwenden sind. Tatsache ist aber, der Code passt in in 8 kb Speicher. Gerade die Programme, die etwas mit "Funk" zu tun haben, machen dies notwengig. Selbstverständlich sind alle Module getestet und laufen seit Wochen. Gruß fjm
fjm schrieb: > Ich wollte kein Lehrbuch in C schreiben, Dann hast du jetzt wohl doch ein Buch mit einem negativ Beispiel abgegeben, wie man nicht programmiert! Beschäftige dich auch mal mit Refactoring. Vor dem Coding kommt besser auch das Denken bzgl. Programm-/Datenstrukturen, was du hier wohl komplett ausgelassen hast. Deine zahllosen global Variables sind eine Vergewaltigung einfachster Grundsätze der Programmierung. Die Lesbarbeit deines Codes ist gleich null, zwei Beispiele Refactored, 3 Instructions
1 | // wenn Gleichstand besteht (A==B), Fast-PWM-Art (0101 = 5)
|
2 | TCCR1A |= (1<<COM1B1) | (1<<WGM10) |
3 | // Pres.64 (250 msec), Fast-PWM-Art 2.Teil
|
4 | TCCR1B |= (1<<WGM12) | (1<<CS11) | (1<<CS10); |
5 | TIFR1 |= (1<<OCF1A) | (1<<OCF1B); |
Original, 6 Instruction und sinnloses !(...)
1 | TCCR1B |= ((!(1<<CS12)) | ((1<<CS11)) | ((1<<CS10)));// Pres.64 (250 msec) |
2 | TCCR1A |=((!(1<<WGM11)) |((1<<WGM10))); // Fast-PWM-Art (0101 = 5) |
3 | TCCR1B |=((1<<WGM12) | (!(1<<WGM13))); // Fast-PWM-Art 2.Teil |
4 | TCCR1A |= (((1<<COM1B1)) | (!(1<<COM1B0))); // wenn Gleichstand besteht (A==B) |
5 | TIFR1 |= (1<<OCF1A); |
6 | TIFR1 |= (1<<OCF1B); |
Refactored
1 | ISR (TIM0_COMPA_vect) { |
2 | PORTA |= (1<<PWM_0); |
3 | //PORTA ^= (1<<Ser_out); // 16 msek Basiszeit
|
4 | |
5 | if (!impuls_1) impuls_1++; |
6 | else impuls_1 = 0; |
7 | |
8 | zeit++; // Basiszeit |
9 | zeit0++; |
10 | zeit1++; |
11 | zeit2++; |
12 | zeit3++; |
13 | zeit_0++; |
14 | zeit_01++; |
15 | Basis_T2++; |
16 | zeit_seriell++; |
17 | |
18 | if (sv_ausg ) sv_ausg--; // Ein/Aus Reset |
19 | if (zeit_ausg) zeit_ausg--; // Service Ausgabe (Byte) |
20 | if (zeit_bit) zeit_bit--; // Bitzeit |
21 | if (zeit_aus) zeit_aus--; // ein/aus Progr. |
22 | if (zeit_man) zeit_man--; // Manchestercodezeit |
23 | if (zeit_empf) zeit_empf--; // Empfangszeit |
24 | if (zeit_send) zeit_send--; // Sende_zeit |
25 | if (zeit_pre && Preambel==1) zeit_pre--; // Vorlaufzeit |
26 | if (zeit_vor) zeit_vor--; // Überwachungszeit |
27 | }
|
Original, sinnlose Comments, redundante Schreibweise:
1 | ISR (TIM0_COMPA_vect) |
2 | {
|
3 | PORTA |= (1<<PWM_0); |
4 | //PORTA ^= (1<<Ser_out); // 16 msek Basiszeit
|
5 | |
6 | if (impuls_1 == 0) |
7 | {
|
8 | impuls_1 = impuls_1 + 1; |
9 | }
|
10 | else
|
11 | {
|
12 | impuls_1 = 0; |
13 | }
|
14 | zeit = zeit + 1; // Basiszeit |
15 | |
16 | zeit0 = zeit0 + 1; // zeit0 |
17 | zeit1 = zeit1 + 1; // zeit1 |
18 | zeit2 = zeit2 + 1; // zeit2 |
19 | zeit3 = zeit3 + 1; // teit3 |
20 | zeit_0 = zeit_0 + 1; // zeit_0 |
21 | zeit_01 = zeit_01 + 1; // zeit_01 |
22 | |
23 | Basis_T2 = Basis_T2 +1; // Basis_T2 inv |
24 | zeit_seriell = zeit_seriell + 1; |
25 | |
26 | if (sv_ausg > 0) // Ein/Aus Reset |
27 | {
|
28 | sv_ausg = sv_ausg - 1; |
29 | }
|
30 | |
31 | if (zeit_ausg > 0) // Service Ausgabe (Byte) |
32 | {
|
33 | zeit_ausg = zeit_ausg - 1; |
34 | }
|
35 | |
36 | if (zeit_bit > 0) // Bitzeit |
37 | {
|
38 | zeit_bit = zeit_bit - 1; |
39 | }
|
40 | |
41 | if (zeit_aus > 0) // ein/aus Progr. |
42 | {
|
43 | zeit_aus = zeit_aus - 1; |
44 | }
|
45 | |
46 | if (zeit_man > 0) // Manchestercodezeit |
47 | {
|
48 | zeit_man = zeit_man - 1; |
49 | }
|
50 | |
51 | if (zeit_empf > 0) // Empfangszeit |
52 | {
|
53 | zeit_empf = zeit_empf - 1; |
54 | }
|
55 | |
56 | if (zeit_send > 0) // Sende_zeit |
57 | {
|
58 | zeit_send = zeit_send - 1; |
59 | }
|
60 | |
61 | //if (zeit_pre > 0)
|
62 | if ((zeit_pre > 0) && (Preambel == 1)) // Vorlaufzeit |
63 | {
|
64 | zeit_pre = zeit_pre - 1; |
65 | }
|
66 | |
67 | if (zeit_vor > 0) // Überwachungszeit |
68 | {
|
69 | zeit_vor = zeit_vor - 1; |
70 | }
|
71 | |
72 | }
|
-------------- Mod: Formatierung korrigiert, es muss lauten:
1 | [c]...[/c] |
und nicht [\c]
:
Bearbeitet durch Moderator
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.