Hilfe Delay function?

Gast #927556
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
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.