Forum: Compiler & IDEs 1-Wire Delay Routinen


von Toni (Gast)


Lesenswert?

Hallo

Ist der unten eingefügten Code für die Programmierung der verlangten
Verzögerungen beim 1-Wire Protokoll (in us Bereich) geeignet ?

Vielen Dank für die Hilfe

Toni

---------------------------------------------------------------------
Code aus lcd.c von Peter Fleury

/*********************************************************************** 
**
 delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
************************************************************************ 
*/
static inline void _delayFourCycles(unsigned int __count)
{
    if ( __count == 0 )
        _asm_ __volatile__( "rjmp 1f\n 1:" );    // 2 cycles
    else
        _asm__ __volatile_ (
          "1: sbiw %0,1" "\n\t"
          "brne 1b"                              // 4 cycles/loop
          : "=w" (__count)
          : "0" (__count)
         );
}


/*********************************************************************** 
**

delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock
frequency
************************************************************************ 
*/
#define delay(us)  _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 )

von Alex (Gast)


Lesenswert?

Die sollten schon funktionieren, wenn sie Peter veröffentlicht hat.
Alternativ kann man auch einfach einen Timer verwenden. Diesen startet
man ohne oder mit Prescaler (je nach gewünschter Zeit) und fragt dann
ständig den Zählerstand ab. Hat der Zähler einen bestimmten Wert
erreicht, bricht man eine Schleife ab und geht weiter im
Programmablauf. Für Zeiten ab dem us-Bereich ist das eigentlich je nach
verwendetem Oszillator auch praktikabel.

Alex

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.