Mario wrote
| 1 | void delay_1ms( u16 i )
 | 
| 2 | {
 | 
| 3 |   while(i) {                 // leserlicher while(i > 0)
 | 
| 4 |     _delay_ms( 1 );
 | 
| 5 |     --i;
 | 
| 6 | }
 | 
Das ist aber nicht dasselbe wie
| 1 | void delay_1ms( u16 i )
 | 
| 2 | {
 | 
| 3 |   do{
 | 
| 4 |     _delay_ms( 1 );
 | 
| 5 |   }while( --i );
 | 
| 6 | }
 | 
Beim ersteren wird zuerst überprüft, ob i bereits null ist und erst dann 
1ms gewartet, während bei letzterem zuerst gewartet und dann überprüft 
wird. Eigentlich ist deine Methode die "richtigere" weil es logischer 
ist, dass beim Aufruf von delay_1ms(0) nicht garnicht gewartet wird.
MfG Mark