Warum hier ein "while"?

Gast #4884740
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?!
Gast #4884744
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.
Gast #4884748
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.
Gast #4884749
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren