Forum: Projekte & Code Automatisches LED-Licht mit Funkmodulen


von Franz Josef M. (arras)


Angehängte Dateien:

Lesenswert?

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 -

von Tippgeber (Gast)


Lesenswert?

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.

von Tippgeber (Gast)


Lesenswert?

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.

von fjm (Gast)


Lesenswert?

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

von Uhu U. (uhu)


Lesenswert?

fjm schrieb:
> Er muß bei einem Tabulator-Zeichen genau 4 Leerstellen machen.

Schreib es doch einfach in den Quelltext hinein…

von AllesKönner (Gast)


Lesenswert?

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.

von fjm (Gast)


Lesenswert?

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

von AllesKönner (Gast)


Lesenswert?

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