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


von die amme (Gast)


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?


1
;*************************************************************************
2
; delay half period
3
4
; For I2C in normal mode (100kHz), use T/2 > 5us
5
6
; For I2C in fast mode (400kHz),   use T/2 > 1.3us
7
8
;*************************************************************************
9
  .stabs  "",100,0,0,i2c_delay_T2
10
  .stabs  "i2cmaster.S",100,0,0,i2c_delay_T2
11
  .func i2c_delay_T2  ; delay 5.0 microsec with 4 Mhz crystal  
12
13
i2c_delay_T2:        ; 4 cycles
14
15
    rjmp 1f      ; 2   "
16
1:  rjmp 2f      ; 2   "
17
2:  rjmp 3f      ; 2   "
18
3:  rjmp 4f      ; 2   "
19
4:  rjmp 5f      ; 2   "
20
5:  rjmp 6f      ; 2   "
21
6:  nop          ; 1   "
22
    ret          ; 3   "
23
    .endfunc     ; total 20 cyles = 5.0 microsec with 4 Mhz crystal

Gruß,
die amme

von Stefan B. (Gast)


Lesenswert?

Füge weitere RJMPs mit Label ein bis du auf 30 Zyklen kommst.

von Oliver J. (helmo2004)


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

von die amme (Gast)


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

von Oliver J. (helmo2004)


Lesenswert?

Ja genau damit müsstest du den gewünschten effekt erzeugen.

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.