Forum: Mikrocontroller und Digitale Elektronik Warum hier ein "while"?


von Jon (Gast)


Lesenswert?

Hallo,

habe hier folgenden Code entdeckt:
Beitrag "I2C will nicht"
1
  
2
#define F_CPU 16000000UL
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
  //Make Start Condition on I2C Bus  
10
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
11
    
12
  while (!(TWCR & (1<<TWINT)));
13
  
14
  //Set Device Adress
15
  TWDR = 0b11010000;
16
    
17
  TWCR = (1<<TWINT) | (1<<TWEN);
18
    
19
  while (!(TWCR & (1<<TWINT)));
20
    
21
  //Set Register  
22
  TWDR = 0x00;
23
    
24
  TWCR = (1<<TWINT) | (1<<TWEN);
25
    
26
  while (!(TWCR & (1<<TWINT)));
27
  
28
  //Set Register Value
29
  TWDR = 0xFF;
30
  
31
  TWCR = (1<<TWINT) | (1<<TWEN);
32
  
33
  while (!(TWCR & (1<<TWINT)));
34
  
35
  //Send Stop Condition
36
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);      
37
38
    while(1)
39
    {
40
    
41
    }
42
}


Kann jemand erklären, was diese Ausdrücke mit dem while zu bedeuten 
haben, z.B.:
while (!(TWCR & (1<<TWINT)));

???

Es gibt ja keinen Funktionsblock, der etwas bewirken könnte. Oder soll 
einfach das Programm im jeweiligen while hängenbleiben (also keine 
weitere Programmausführung), wenn die Bedingung hinter dem while 1 
wird?!

von ui (Gast)


Lesenswert?

Jon schrieb:
> Es gibt ja keinen Funktionsblock, der etwas bewirken könnte. Oder soll
> einfach das Programm im jeweiligen while hängenbleiben (also keine
> weitere Programmausführung), wenn die Bedingung hinter dem while 1
> wird?!

Ja, welchen Sinn hätte das denn sonst?
Das ist busy waiting bis die HW bereit ist zu funktionieren und die 
Daten in den Registern angekommen sind. Vereinfacht gesagt.

von Teo D. (teoderix)


Lesenswert?

Das Programm hält an (wartet) solange die Bedingung erfüllt.

von Jon (Gast)


Lesenswert?

Danke!

Teo D. schrieb:
> Das Programm hält an (wartet) solange die Bedingung erfüllt.

The TWINT Flag is set in the following situations:
• After the TWI has transmitted a START/REPEATED START condition
• After the TWI has transmitted SLA+R/W
• After the TWI has transmitted an address byte
• After the TWI has lost arbitration
• After the TWI has been addressed by own slave address or general call
• After the TWI has received a data byte
• After a STOP or REPEATED START has been received while still addressed 
as a Slave
• When a bus error has occurred due to an illegal START or STOP 
condition

Es wird also immer gewartet, bis das Twint-Flag gesetzt ist.

von Amateur (Gast)


Lesenswert?

Egal ob mit eingebundenen Funktionen oder nicht, while werkelt so lange 
wie die Bedingung erfüllt ist.
TWCR wird ja an anderer Stelle geändert - oder auch nicht.
Ich persönlich mag diese Absolutblockierer nicht, obwohl er an dieser 
Stelle vertretbar ist.

von S. R. (svenska)


Lesenswert?

Jon schrieb:
> Es gibt ja keinen Funktionsblock, der etwas bewirken könnte.

Doch: Ein while(x); ist identisch zu einem while(x){} (beachte das 
Semikolon hinter dem ersten while!).

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.