Forum: Mikrocontroller und Digitale Elektronik ADC Problem bei ATTINY 461


von X. Y. (elektro_henkler)


Lesenswert?

Ich habe das Problem, dass ich meinen ADC anscheint nicht umgeschaltet 
bekomme, mit dem Beispiel hier im Tut. hat es auch nicht funktioniert. 
Jemand ne idee?
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
//Klassen Defenition
7
void setup();
8
9
uint16_t ADC_Read( int channel);
10
11
// Hauptprogramm
12
int main(void)
13
{
14
  setup(); // Konfiguration des Controllers
15
  
16
17
  
18
    while(1)
19
    {
20
    int x = 0;
21
        OCR1A = ADC_Read(x);
22
    _delay_ms(10);
23
     x = 1;
24
        OCR1B = ADC_Read(x); 
25
    _delay_ms(10);
26
     x = 2;
27
        OCR1D = ADC_Read(x);
28
    _delay_ms(10);
29
    
30
    }
31
  
32
}
33
34
void setup()
35
{
36
    DDRB |= (1 << DDB1);
37
    DDRB |= (1 << DDB3);
38
    DDRB |= (1 << DDB5);
39
    //Timer 1 konfiguration
40
    //Mode + Output einstellung
41
    //Fast PWM mode 8 Bit Timer 1, OC1A, OC1B und OC1D auf non-inverting output setzen
42
43
    TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<PWM1A) | (1<<PWM1B);
44
45
    TCCR1C = (1<<COM1D1) | (1<<PWM1D) | (1<<COM1A1S) | (1<<COM1B1S);
46
    
47
    TCCR1D = (0<<FPIE1) | (0<<FPEN1) | (0<<FPNC1) | (0<<FPES1) |
48
    (0<<FPAC1) | (0<<FPF1) | (0<<WGM11) | (0<<WGM10);
49
50
    //Top setzen
51
    OCR1C = 0xFF;
52
    
53
    //PLL init und starten
54
    PLLCSR = (0<<LSM) | (1<<PCKE) | (1<<PLLE);
55
    
56
    
57
    while(!(PLLCSR&0x01)) {} //stabilisierung der PLL abwarten
58
59
    OCR1A = 127;
60
    OCR1B = 127; 
61
    OCR1D = 127;
62
63
    //Timer aktivieren
64
    TCCR1B |= (1<<CS10);
65
    
66
    //ADC Konfigurieren
67
    
68
    //Voltage Referenz - VCC
69
    ADMUX  =  (0<<REFS0); 
70
    ADMUX  =  (0<<REFS1);
71
    
72
    //ADC Frequenz Teiler auf 64 Setzen
73
    ADCSRA  =  (0<<ADPS0);
74
    ADCSRA  =  (1<<ADPS1);
75
    ADCSRA  =  (1<<ADPS2);
76
    
77
    //ADC Aktiviren
78
    ADCSRA  =  (1<<ADEN);
79
    
80
    //ADC Dummy Messung
81
    ADCSRA |= (1<<ADSC);                 
82
    while (ADCSRA & (1<<ADSC) ) 
83
    { 
84
              
85
    }
86
    (void) ADCW;
87
    
88
    
89
    
90
}
91
92
93
uint16_t ADC_Read( int channel )
94
{
95
  if (channel == 0)
96
  {
97
    ADMUX |=
98
    (0 << ADLAR)|
99
    (1 << MUX0) | 
100
    (0 << MUX1) |
101
    (0 << MUX2) |
102
    (0 << MUX3) |
103
    (0 << REFS0)|
104
    (0 << REFS1)|
105
    (0 << REFS2);
106
  }
107
  
108
  else if(channel == 1)
109
  {
110
    ADMUX |=
111
    (0 << ADLAR)|
112
    (0 << MUX0) | 
113
    (1 << MUX1) |
114
    (0 << MUX2) |
115
    (0 << MUX3) |
116
    (0 << REFS0)|
117
    (0 << REFS1)|
118
    (0 << REFS2);
119
  }
120
  
121
  else if(channel == 2)
122
  {
123
    ADMUX |=
124
    (0 << ADLAR)|
125
    (1 << MUX0) | 
126
    (1 << MUX1) |
127
    (0 << MUX2) |
128
    (0 << MUX3) |
129
    (0 << REFS0)|
130
    (0 << REFS1)|
131
    (0 << REFS2);
132
  }
133
      
134
  
135
  
136
  ADCSRA |= (1<<ADSC);            
137
  while (ADCSRA & (1<<ADSC) ) 
138
  {  
139
     
140
  }
141
  int x = ADCW;
142
  x = x/4;
143
  return x;                    
144
}

von Uwe (de0508)


Lesenswert?

@unbekannt,

dein Code überschreibt mehrmals die Register ADMUX und ADCSRA komplett
1
//Voltage Referenz - VCC
2
    ADMUX  =  (0<<REFS0); 
3
    ADMUX  =  (0<<REFS1);
4
    
5
    //ADC Frequenz Teiler auf 64 Setzen
6
    ADCSRA  =  (0<<ADPS0);
7
    ADCSRA  =  (1<<ADPS1);
8
    ADCSRA  =  (1<<ADPS2);

Das Ziel, einzelne Bits zu setzen oder löschen, erreicht man so nicht, 
lies Dir bitte die Bitmanipulation in deinem C-Buch durch.

Zum
1
if (channel == 0)
2
  {
3
    ADMUX |=
4
    (0 << ADLAR)|
5
    (1 << MUX0) | 
6
    (0 << MUX1) |
7
    (0 << MUX2) |
8
    (0 << MUX3) |
9
    (0 << REFS0)|
10
    (0 << REFS1)|
11
    (0 << REFS2);
12
  }
13
  
14
  else if(channel == 1)
15
  {
16
    ADMUX |=
17
    (0 << ADLAR)|
18
    (0 << MUX0) | 
19
    (1 << MUX1) |
20
    (0 << MUX2) |
21
    (0 << MUX3) |
22
    (0 << REFS0)|
23
    (0 << REFS1)|
24
    (0 << REFS2);
25
  }
26
  
27
  else if(channel == 2)
28
  {
29
    ADMUX |=
30
    (0 << ADLAR)|
31
    (1 << MUX0) | 
32
    (1 << MUX1) |
33
    (0 << MUX2) |
34
    (0 << MUX3) |
35
    (0 << REFS0)|
36
    (0 << REFS1)|
37
    (0 << REFS2);
38
  }
 gerödel schreibe ich jetzt nichts - außer das geht besser.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Uwe S. schrieb:

> gerödel schreibe ich jetzt nichts - außer das geht besser.

Hättest du aber sollen :-)

@TO

Denn an dieser Stelle wäre eine Zuweisung an ADMUX korrekt gewesen und 
kein
1
    ADMUX |= ....

denn: mit einem | bzw. einem |= kriegt man Bits auf 1 gesetzt aber nicht 
auf 0 runtergezogen.

Wenn daher in ADMUX erst mal die diversen MUX Bits auf 1 sind, werden 
die nie wieder 0.

Du scheinst mit Bitoperationen und wie und warum man sie einsetzt auf 
Kriegsfuss zu stehen. Stell das ab! Bitoperationen sind in der 
µC-Programmierung täglich Brot. Da darf es keine Unsicherheiten geben.


Edit:
D.h. jetzt mal ganz davon abgesehen, dass man das ganz sicher nicht so 
schreibt, dass man in der ADC_Read Funktion die komplette Konfiguration, 
soweit sie das ADMUX Register betrifft, noch mal neu anführt. Das ist 
viel zu fehleranfällig und umständlich, wenn sich mal die Konfiguration 
ändert. Wenn in dieser Funktion nur die MUX Bits zu ändern sind, dann 
macht man auch genau das UND NUR DAS: die MUX Bits ändern.

: Bearbeitet durch User
von X. Y. (elektro_henkler)


Lesenswert?

Karl H. schrieb:
> Du scheinst mit Bitoperationen und wie und warum man sie einsetzt auf
> Kriegsfuss zu stehen. Stell das ab! Bitoperationen sind in der
> µC-Programmierung täglich Brot. Da darf es keine Unsicherheiten geben.

habs mir schon gedacht, das ich so auf die fresse falle. :(

ich stehe mit bitmanipulation wirklich noch auf dem kriegsfuß

kennt ihr nen gutes tut. dafür? das auf dieser seite finde ich nicht so 
gut erklärend

von Karl H. (kbuchegg)


Lesenswert?

X. Y. schrieb:
> Karl H. schrieb:
>> Du scheinst mit Bitoperationen und wie und warum man sie einsetzt auf
>> Kriegsfuss zu stehen. Stell das ab! Bitoperationen sind in der
>> µC-Programmierung täglich Brot. Da darf es keine Unsicherheiten geben.
>
> habs mir schon gedacht, das ich so auf die fresse falle. :(
>
> ich stehe mit bitmanipulation wirklich noch auf dem kriegsfuß
>
> kennt ihr nen gutes tut. dafür? das auf dieser seite finde ich nicht so
> gut erklärend

was brauchst du?
Grundlage sind die Bitoperationen UND und ODER (und NICHT). In C 
SChreibweise & (für UND) bzw. | (für ODER)

Wie sieht deren Funktionstabelle (für 2 einzelne Bits) aus?
Hast du 2 Bits A und B, dann
1
ODER:
2
3
    A     B     Ergebnis
4
  ------------------------
5
    0     0        0
6
    0     1        1
7
    1     0        1
8
    1     1        1
9
10
UND:
11
12
    A     B      Ergebnis
13
  ------------------------
14
    0     0        0
15
    0     1        0
16
    1     0        0
17
    1     1        1

was fällt uns auf?
In der Oder Operation. Wenn wir einmal das Bit A als eine vorgegebenen 
Wert ansehen, dann
* ist das Bit A auf 0, dann ist das Ergebnis dasselbe wie das Bit B
ist Bit B auf 0, dann ist auch das Ergebnis 0. Ist das Bit B auf 1, dann 
ist auch das Ergebnis 1. D.h. das Ergebnis spiegelt den Zustand von Bit 
B wieder
* ist das Bit A auf 1, dann ist das Ergebnis auf jeden Fall auf 1

D.h. wenn ich das Bit A auf 1 habe, dann kann ich im Ergebnis auf jeden 
Fall ein 1 Bit erzwingen. Ist das Bit A aber auf 0, dann ändert sich 
nichts. Das Ergebnis hat denselben Wert wie das Bit B
1
ODER:
2
3
    A     B     Ergebnis
4
  ------------------------
5
    0     0        0           <- Ergebnis ist identisch zu Bit B
6
    0     1        1
7
8
    1     0        1           <- Ergebnis ist auf jeden Fall 1
9
    1     1        1

Was fällt in der Und Operation auf?
Wieder sei das Bit A dasjenige Bit, dessen Wert (0 oder 1) ich 
kontrolliere. Wie ist der Zusammenhang zwischen dem Ergebnis und dem Bit 
B?
Nun ganz offensichtlich ist, dass das Ergebnis den Zustand vom Bit B 
wiederspiegelt, wenn Bit A auf 1 ist. Ist das Bit A hingegen auf 0, dann 
kommt im Ergebnis immer 0 raus, egal welchen Wert Bit B hat.
D.h. mit dieser Operation kann ich ein Bit auf 0 zwingen, indem ich 
dafür sorge, dass (wenn ich dieses erreichen will) das Bit A den Wert 0 
hat.
1
UND:
2
3
    A     B      Ergebnis
4
  ------------------------
5
    0     0        0         <- Ergebnis ist auf jeden Fall 0
6
    0     1        0
7
8
    1     0        0         <- Ergebnis ist identisch zu Bit B
9
    1     1        1

In C ist es jetzt so, dass diese Bitoperationen UND bzw. ODER für alle 8 
Bits eines Bytes gleichzeitig gemacht werden. Habe ich also 2 Operanden
1
  Wert & 0b00001111

dann werden die 8 Bits von Wert mit dem jeweils stellenmässig 
korrespondierendem Bit in der angegebenen Konstante (dem 2.ten 
Operanden, muss keine Konstante sein) jeweils einzeln bitmässig verundet
1
              +--+--+--+--+--+--+--+--+
2
  Wert        |  |  |  |  |  |  |  |  |    <--- hier die 8 Bits von 'Wert'
3
              +--+--+--+--+--+--+--+--+         was immer die auch für Bitwerte (0 oder 1) haben
4
5
 die 'Maske'   0  0  0  0  1  1  1  1

jede Spalte der 8 Bit wird für sich betrachtet. Die obere Zeile ist das 
'Bit B' von oben, die untere das 'Bit A'.
Was hatten wir bzgl. der UND Operation gelernt. Mit dem Bit A kann ich 
das Ergebnis auf 0 zwingen, wenn das Bit A auf 0 ist. Genau das haben 
wir hier aber
1
              +--+--+--+--+--+--+--+--+
2
  Wert        |  |  |  |  |  |  |  |  |    <--- hier die 8 Bits von 'Wert'
3
              +--+--+--+--+--+--+--+--+         was immer die auch für Bitwerte (0 oder 1) haben
4
5
 die 'Maske'   0  0  0  0  1  1  1  1
6
7
               ^  ^  ^  ^
8
               +--+--+--+------ diese 'Bit A' sind alle auf 0

d.h. mit dem Wissen über die UND Operation, können wir daher 
vorhersagen, dass die ersten 4 Bit-Spalten im Ergebnis alle mit 
Sicherheit ein 0 Bit haben werden.
Was wissen wir noch? Dort wo in den Bit A ein 1 Bit auftaucht, dort wird 
das Ergebnis dasselbe sein, wie das Bit B war.
Auch den Fall haben wir hier. Die rechten 4 Spalten haben alle eine 1 im 
Bit A
1
              +--+--+--+--+--+--+--+--+
2
  Wert        |  |  |  |  |  |  |  |  |    <--- hier die 8 Bits von 'Wert'
3
              +--+--+--+--+--+--+--+--+         was immer die auch für Bitwerte (0 oder 1) haben
4
5
 die 'Maske'   0  0  0  0  1  1  1  1
6
7
                           ^  ^  ^  ^
8
                           +--+--+--+------ die hier

d.h. an dieser Stelle wird im Ergebnis derselbe Bitwert wieder 
auftauchen, der schon an dieser Bitposition in 'Wert' gestanden hat.

Alles zusammen genommen, ergibt sich also
1
              +--+--+--+--+--+--+--+--+
2
  Wert        |a |b |c |d |e |f |g |h |   a, b, c, d, ... seien stellvertretend
3
              +--+--+--+--+--+--+--+--+   für irgendwelche 0 bzw. 1 Werte
4
 
5
 die 'Maske'   0  0  0  0  1  1  1  1
6
7
&-Operation  =============================
8
9
               0  0  0  0  e  f  g  h

Mit dieser Operation wurden also die ersten 4 Bits auf 0 gezwungen, 
während die restlichen 4 Bits erhalten blieben. Egal ob e, f, g, h auf 0 
oder auf 1 gestanden sind, diese Werte tauchen im Ergebnis genau gleich 
auf. Lediglich die ersten 4 Bits sind definitiv auf 0. Und zwar deshalb 
weil hier
1
 die 'Maske'   0  0  0  0  1  1  1  1
2
3
               ==========
entsprechende Bits auf 0 waren.


D.h. mit einer UND Operation kann man Bits in einem Byte auf 0 zwingen. 
Alles was es dazu braucht, ist eine Byte-Maske, die an den bewussten 
Stellen ein 0 Bit hat und überall anders ein 1 Bit.

So, und jetzt überlegst du dir, was man wohl mit der Oder-Operation 
anstellen kann und wie das funktioniert.

: Bearbeitet durch User
von X.Y. (Gast)


Lesenswert?

Wenn wir einen blauen Umschlag mit einer CD und einer Rechnung haben, 
wollen aber gerne die Rechnung entfernen, so müssen wir einfach den Bit 
für die Rechnung löschen. Gelöscht wird mit dem Einerkomplement.

1
_type = CD|BLUE|INVOICE;
2
_type &=~INVOICE; // ist das gleiche wie _type = _type&~INVOICE;
Schauen wir uns das Ganze in Binär an

11000000000000000000010  // CD|BLUE|INVOICE
01000000000000000000000  //  INVOICE
10111111111111111111111  // ~INVOICE (invertiert)
_type &=~INVOICE
11000000000000000000010  // _type
10111111111111111111111  // UND verknüpfen ~INVOICE
--------------------------------------
10000000000000000000010  // CD|BLUE
Hier sehen wir sehr schön, dass das Bit für INVOICE entfernt wurde, bzw. 
auf 0 gesetzt wurde.



Also quasi so?

von X. Y. (elektro_henkler)


Lesenswert?

so ich habe es nun erfolgreich am laufen, ist es nun so besser gelöst?

Die Config:
1
void setup_adc()
2
{
3
  //Referenzsspannungsquelle - VCC als Referenz
4
  
5
  ADMUX  &= ~ (1 << REFS0);
6
  ADMUX  &= ~ (1 << REFS1);
7
  ADCSRB  &= ~ (1 << REFS2);
8
  
9
  //Frequenzteiler
10
  
11
  ADCSRA  &= ~(1<<ADPS0);
12
  ADCSRA  |=  (1<<ADPS1);
13
  ADCSRA  |=  (1<<ADPS2);
14
  
15
16
  //Wandler aktivieren
17
  
18
  ADCSRA  |=  (1<<ADEN);
19
  
20
  //Dummy messung
21
  
22
  ADCSRA |= (1<<ADSC);
23
  while (ADCSRA & (1<<ADSC) )
24
  {
25
    
26
  }
27
  (void) ADCW;
28
  
29
}
1
uint8_t read_adc(uint8_t channel)
2
{
3
  if (channel == 1)
4
  {
5
    //Kanal Auswahl zurücksetzen
6
    ADMUX  &= ~ (1 << MUX0);
7
    ADMUX  &= ~ (1 << MUX1);
8
    ADMUX  &= ~ (1 << MUX2);
9
    ADMUX  &= ~ (1 << MUX3);
10
    ADMUX  &= ~ (1 << MUX4);
11
    ADCSRB  &= ~ (1 << MUX5);
12
    //Kanal Auswahl
13
    ADMUX |= (1 << MUX0);
14
  }
15
  else if (channel == 2)
16
  {
17
    //Kanal Auswahl zurücksetzen
18
    ADMUX  &= ~ (1 << MUX0);
19
    ADMUX  &= ~ (1 << MUX1);
20
    ADMUX  &= ~ (1 << MUX2);
21
    ADMUX  &= ~ (1 << MUX3);
22
    ADMUX  &= ~ (1 << MUX4);
23
    ADCSRB  &= ~ (1 << MUX5);
24
    //Kanal Auswahl
25
    ADMUX |= (1 << MUX1);
26
  }
27
  
28
  else 
29
  {
30
    //Kanal Auswahl zurücksetzen
31
    ADMUX  &= ~ (1 << MUX0);
32
    ADMUX  &= ~ (1 << MUX1);
33
    ADMUX  &= ~ (1 << MUX2);
34
    ADMUX  &= ~ (1 << MUX3);
35
    ADMUX  &= ~ (1 << MUX4);
36
    ADCSRB  &= ~ (1 << MUX5);
37
  }
38
  
39
  // Single Wandlung starten
40
  ADCSRA |= (1<<ADSC);
41
  
42
  //Warten bis Wandlung abgeschlossen
43
  while (ADCSRA & (1<<ADSC) )
44
  {
45
    
46
  }
47
  
48
  //Wert in Variable X übergeben
49
  int x = ADCW;
50
  
51
  //Wert auf 8bit umsetzen
52
  x = x/4;
53
  
54
  //Rückgabewert
55
  return x;
56
  
57
}

von Karl H. (kbuchegg)


Lesenswert?

X. Y. schrieb:
> so ich habe es nun erfolgreich am laufen, ist es nun so besser gelöst?

Die MUX Bits wurden von Atmel extra so angeordnet (und das bei allen µC, 
zumindest ist mir keine Ausnahme bekannt), so dass die gewünschte 
Kanalnummer immer ganz einfach in den untersten Bits des ADMUX Registers 
zu finden sind. D.h. man muss beim Setzen da nicht auf Einzelbitebene 
rummachen, sondern sorgt einfach nur dafür, dass die Kanalnummer (in 
diesem Fall deren untersten 4 Bit) genau so wie sie sind, ins ADMUX 
Register kommen.
Dazu müssen diese 4 Bits im ADMUX Register erst mal auf 0 gesetzt werden 
(mit einer Und-Operation). Im darauffolgenden Schritt werden mit einer 
Oder-Operation alle 1 Bits aus der Kanalnummer ins ADMUX übernommen.

D.h. das hier
>
1
> uint8_t read_adc(uint8_t channel)
2
> {
3
>   if (channel == 1)
4
>   {
5
>     //Kanal Auswahl zurücksetzen
6
>     ADMUX  &= ~ (1 << MUX0);
7
>     ADMUX  &= ~ (1 << MUX1);
8
>     ADMUX  &= ~ (1 << MUX2);
9
>     ADMUX  &= ~ (1 << MUX3);
10
>     ADMUX  &= ~ (1 << MUX4);
11
>     ADCSRB  &= ~ (1 << MUX5);
12
>     //Kanal Auswahl
13
>     ADMUX |= (1 << MUX0);
14
>   }
15
>   else if (channel == 2)
16
>   {
17
>     //Kanal Auswahl zurücksetzen
18
>     ADMUX  &= ~ (1 << MUX0);
19
>     ADMUX  &= ~ (1 << MUX1);
20
>     ADMUX  &= ~ (1 << MUX2);
21
>     ADMUX  &= ~ (1 << MUX3);
22
>     ADMUX  &= ~ (1 << MUX4);
23
>     ADCSRB  &= ~ (1 << MUX5);
24
>     //Kanal Auswahl
25
>     ADMUX |= (1 << MUX1);
26
>   }
27
> 
28
>   else
29
>   {
30
>     //Kanal Auswahl zurücksetzen
31
>     ADMUX  &= ~ (1 << MUX0);
32
>     ADMUX  &= ~ (1 << MUX1);
33
>     ADMUX  &= ~ (1 << MUX2);
34
>     ADMUX  &= ~ (1 << MUX3);
35
>     ADMUX  &= ~ (1 << MUX4);
36
>     ADCSRB  &= ~ (1 << MUX5);
37
>   }
38
>

kann man auch so schreiben
1
uint8_t read_adc(uint8_t channel)
2
{
3
  // die 4 MUX Bits auf 0 zwingen
4
  ADMUX &= ~ ( ( 1 << MUX0 ) | ( 1 << MUX1 ) | ( 1 << MUX2 ) | ( 1 << MUX3 ) | ( 1 << MUX4 ) );
5
6
// MUX5  in ADCSRB braucht nicht berücksichtigt zu werden. Wir setzen
7
// es nie, daher braucht es hier auch nicht gelöscht werden.
8
9
  // von der Kanalangabe die untersten 4 Bits nach ADMUX uebernehmen
10
  ADMUX |= channel & 0x0F;  // wir sind nur an den unteresten 4 Bits
11
                            // der Kanalangabe interessiert
12
13
  // Single Wandlung starten
14
  ADCSRA |= (1<<ADSC);
15
16
....

Fertig. Ein simpler 2 Zeiler, wo du eine ganze Seite Code brauchst. OK, 
du kümmerst dich auch noch um MUX5, was ich nicht tue. Aber auch das 
wären nur mehr 4 Zeilen mehr.
1
...
2
  if( channel & 0x10 )                // Bit 4 in der Kanalangabe gesetzt?
3
    ADCSRB |= ( 1 << MUX5 );
4
  else
5
    ADCSRB &= ~( 1 << MUX5 );
6
...

: Bearbeitet durch User
von X. Y. (elektro_henkler)


Lesenswert?

ok, ja so gehts auch ;) ich dachte mir nur am anfang, ich mach alles 
nacheinander. ich habe es mal mit nem oszi und nem debug pin 
nachgemessen, den ich high schalte wenn ich adc_read aufrufe und low 
schalte, wenn ich es verlasse.

mit deiner sowie meiner Version dauert es ca 100µsec. also denke ich ist 
es nur eine Ersparnis der Schreiberei.

ja ich denke mux5 kann ich echt weglassen. hatte es nur vollständiger 
halbe mal mit eingebaut.

von Karl H. (kbuchegg)


Lesenswert?

X. Y. schrieb:

> ich habe es mal mit nem oszi und nem debug pin
> nachgemessen, den ich high schalte wenn ich adc_read aufrufe und low
> schalte, wenn ich es verlasse.
>

Es geht nicht nur um Speed

> mit deiner sowie meiner Version dauert es ca 100µsec. also denke ich ist
> es nur eine Ersparnis der Schreiberei.

Genau darum geht es:
* um weniger Schreibaufwand
* um leichte Erfassbarkeit des Codes

vor allen Dingen Letzteres ist auf lange Sicht wichtig.
In die Länge gezogener Code ist wie ein in die Länge gezogenes 
Theaterstück. Dem Betrachter wird fad, die Konzentration lässt nach, man 
sagt sich "mach hinne, komm doch endlich mal zum Punkt" und irgendwann 
ist der Betrachter gedanklich soweit weggetreten, dass nur noch 
unaufmerksam der Sache nachgeht. Genau dann ist der Punkt erreicht, an 
dem der Fehlerteufel zuschlägt.
´
Unnötig in die Länge gezogener Code ist vor allen Dingen eines: 
unnötiger Weise in die Länge gezogen. 'Sicherer' oder 'fehlerfreier' ist 
er hingegen nicht. Eher das Gegenteil. Je mehr du Dinge in die Länge 
ziehst, desto mehr Fehlermöglichkeiten gibt es auch.
Die 'Kunst' besteht in einer kompakten Schreibweise. Aber auch nicht zu 
kompakt.

: Bearbeitet durch User
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.