www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anpassung der Delay Routine (von 4 auf 6 MHz) in i2cmaster.S


Autor: die amme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
vielleicht kann mir jemand einen Tipp zu folgendem Problem geben:

Die Delay Routine im i2cmaster.S von P. Fleury ist auf 4 MHz µC Takt 
definiert.
Wie lässt sich diese auf 6 MHz bzw. auf N MHz µC Takt einstellen?


;*************************************************************************
; delay half period

; For I2C in normal mode (100kHz), use T/2 > 5us

; For I2C in fast mode (400kHz),   use T/2 > 1.3us

;*************************************************************************
  .stabs  "",100,0,0,i2c_delay_T2
  .stabs  "i2cmaster.S",100,0,0,i2c_delay_T2
  .func i2c_delay_T2  ; delay 5.0 microsec with 4 Mhz crystal  

i2c_delay_T2:        ; 4 cycles

    rjmp 1f      ; 2   "
1:  rjmp 2f      ; 2   "
2:  rjmp 3f      ; 2   "
3:  rjmp 4f      ; 2   "
4:  rjmp 5f      ; 2   "
5:  rjmp 6f      ; 2   "
6:  nop          ; 1   "
    ret          ; 3   "
    .endfunc     ; total 20 cyles = 5.0 microsec with 4 Mhz crystal 

Gruß,
die amme

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Füge weitere RJMPs mit Label ein bis du auf 30 Zyklen kommst.

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die amme schrieb:
> Wie lässt sich diese auf 6 MHz bzw. auf N MHz µC Takt einstellen?

Mit folgender Formel bekommst du die Anzahl der Wartezyklen:

cycle= 0.5 * FCPU / FI2C

das heißt bei 100khz I2C Takt und 6MHz FCPU brauchst du
0.5 * 6000000 / 100000 = 30 Zyklen.

20 hast du schon. Das heißt du solltest 10 weitere Zyklen einfügen.

Gruß Olli

Autor: die amme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps!

Wenn ich das richtig verstehe, könnte das wie folgt aussehen:

> i2c_delay_T2:        ; 4 cycles
>
>     rjmp 1f      ; 2   "
> 1:  rjmp 2f      ; 2   "
> 2:  rjmp 3f      ; 2   "
> 3:  rjmp 4f      ; 2   "
> 4:  rjmp 5f      ; 2   "
> 5:  rjmp 6f      ; 2   "
  6:  rjmp 7f      ; 2   "
  7:  rjmp 8f      ; 2   "
  8:  rjmp 9f      ; 2   "
  9:  rjmp 10f     ; 2   "
 10:  rjmp 11f     ; 2   "
>11:  nop          ; 1   "
>     ret          ; 3   "
>     .endfunc     ; total 30 cyles = 5.0 microsec with 6 Mhz crystal

Wäre das so richtig?

Gruß,
die amme

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau damit müsstest du den gewünschten effekt erzeugen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.