A.K. hat nichgt so ganz unrecht.
Eine ordentliche und vor allen Dingen konsistente Einrückung ist oft
schon mal die halbe Miete. Auch für Dich!
Es geht nicht darum, dass nicht alles am linken Rand klebt und der Code
ein wenig aufgelockerter erscheint, sondern es geht darum, das man
erkennen kann, welche Codeteile von anderen abhängig sind (welche Teile
zb im then Teil eines if abgearbeitet werden), und welche auf gleicher
Logikstufe stehen.
Ich mach das mal für einen Teil und hinten nach dann eine Frage an dich
1 | for (;;)
|
2 | {
|
3 | cli();
|
4 |
|
5 | if (i == 1)
|
6 | {
|
7 | Temperatur = Temperatur( Temperatur );
|
8 | dtostrf( Temperatur, 4, 2, string3 );
|
9 | UART0_String_SEND( string3 );
|
10 |
|
11 | sei();
|
12 |
|
13 | i = 0;
|
14 | }
|
15 | }
|
16 | }
|
wenn i nicht gleich 1 ist, wird in der Schleife als erstes trotzdem der
cli gemacht. Wie genau stellst du dir dann vor, dass dann jemals ein
Interrupt dir das i auf 1 stellen kann?
1 | float Temperatur(float Temp )
|
2 | {
|
3 | volatile uint8_t Daten0;
|
4 | volatile uint8_t Daten1;
|
5 |
|
6 | PORTB &=~(1<<PB0);
|
7 | SPDR=0x00;
|
8 | while(!(SPSR & (1<<SPIF)))
|
9 | ;
|
10 | SPDR;
|
11 | SPSR |=(0<<SPIF);
|
12 | _delay_us(2);
|
13 | SPDR=0x00;
|
14 | while (!(SPSR & (1<<SPIF)))
|
15 | ;
|
16 | Daten0 = SPDR;
|
17 | SPSR |=(0<<SPIF);
|
18 | _delay_us(2);
|
19 | SPDR=0x00;
|
20 | while (!(SPSR & (1<<SPIF)))
|
21 | ;
|
22 | Daten1 = SPDR;
|
23 | SPSR |=(0<<SPIF);
|
24 | PORTB |=(1<<PB0);
|
Schon mal was von Funktionen gehört? Ich hab mir sagen lassen, dass die
Übersicht in einen Code bringen können, indem man immer gleiche Teile in
eine Funktion auslagert und dadurch der Code an der aufrufenden Stelle
vereinfacht wird.
Ts ts
SPSR |=(0<<SPIF);
so löscht man doch nicht ein Bit.
Abgesehen davon ist das ein Interrupt Bit, das wird höchst
wahrscheinlich dadurch gelöscht (Datenblatt nachsehen), dass man eine 1
an die entsprechende Bitposition einschreibt. So gesehen funktioniert
deine Version - aber nur zufällig, weil du Glück hattest.