Forum: Mikrocontroller und Digitale Elektronik Hilfe Delay function?


von cela (Gast)


Lesenswert?

Hallo Leute
Ich habe diesen Code gefunden, aber ich könnte es nicht richtig 
verstehen.
Was ich nicht verstanden habe. Wie kann man auf 104 kommen bzw. wie hat 
man es gerechnet. Bzw. 156

/* delay one bit 104 usec at 4 MHz (5+30*3-1+1+9=104) */

Und
/* delay 1,5 bit 156 usec at 4 MHz ( 5+47*3-1+2+9=156) */



Funktionen putchar() 9600 Baud @ 4 MHz ( Cc5x- kompilatorn )

bit putchar( char d_out ) /* sends one char */
{
char bitCount, ti;
/* One start bit, one stop bit, 8 data bit, no parity = 10 bit. */
/* Baudrate: 9600 baud => 104.167 usec. per bit. */
if(d_out == '\0') return 0; /* refuse to send "end of string" */
PORTB.0 = 0; /* set startbit */
for ( bitCount = 10; bitCount > 0 ; bitCount-- )
{
/* delay one bit 104 usec at 4 MHz (5+30*3-1+1+9=104) */

ti = 30; do ; while( --ti > 0); nop();
Carry = 1; /* stopbit */
d_out = rr( d_out ); /* Rotate Right through Carry */
PORTB.0 = Carry;
}
Return 1; /* all done */
}





Funktionen getchar() 9600 Baud @ 4 MHz ( Cc5x- kompilatorn )
char getchar( void ) /* recieves one char */
{
/* One start bit, one stop bit, 8 data bit, no parity = 10 bit. */
/* Baudrate: 9600 baud => 104.167 usec. per bit. */
char d_in, bitCount, ti;
while( PORTB.1 == 1 ) /* wait for startbit */ ;
/* delay 1,5 bit 156 usec at 4 MHz ( 5+47*3-1+2+9=156) */
ti = 47; do ; while( --ti > 0); nop2();
for( bitCount = 8; bitCount > 0 ; bitCount--)
{
Carry = PORTB.1;
d_in = rr( d_in); /* rotate carry */
/* delay one bit 104 usec at 4 MHz (5+30*3-1+1+9=104) */
ti = 30; do ; while( --ti > 0); nop();
}
return d_in;
}


Dank schön

von Der M. (steinadler)


Lesenswert?

cela wrote:
> /* delay one bit 104 usec at 4 MHz (5+30*3-1+1+9=104) */
> /* delay 1,5 bit 156 usec at 4 MHz ( 5+47*3-1+2+9=156) */

Hallo cela,

wie du richtig erkannt hast, gibt es eine "DELAY-Funktion".
Diese hat, wie alle Funktionen eine gewisse Anzahl an Instruktionen.
Ohne diese Delay-Funktion zu kennen würde ich folgendes annehmen.

Die 5, sowie der Term "-1+1+9" ist in beiden Kommentaren identisch.
Also kannst du davon ausgehen, dass die Funktion
vorm eigentlich Delay (angenommen eine Zählschleife), 5 Taktzyklen 
braucht (z.B. push), dann wird n-mal (also 30 bzw.47) die Zählschleife 
bearbeitet und anschließend kommen noch paar Taktzyklen hinzu (z.B. für 
pop und Rücksprung).

Es sieht also bildlich so aus:

5          Vor-Zyklen
n*3        Zählzyklen
9-1+1 = 9  Nach-Zyklen

Wenn du selber Zeiten definieren willst, musst du nur die obige Formel 
nach meinem 'n' umstellen. Die Vor- und Nachzyklen bleiben identisch.

Gruß
Micha

von cela (Gast)


Lesenswert?

danke schön  Micha R.

von Der M. (steinadler)


Lesenswert?

cela wrote:
> danke schön  Micha R.

So wünscht man sich ein Thread-Ende.
Es gibt genug Fälle, wo der Ersteller nach Beantwortung seiner Frage 
keinen Laut mehr von sich gibt.

Sehr vorbildlich ;-)

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.