Forum: Mikrocontroller und Digitale Elektronik Software I2C -> Frequenz ändern


von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

Nabend,

habe von Assembler leider nicht so die Ahnung.
Wie ändere ich hier die I2C Frequenz auf 400kHz?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

;*********************************************************************** 
**
; delay half period
; For I2C in normal mode (100kHz), use T/2 > 5us
; For I2C in fast mode (400kHz),   use T/2 > 1.3us
;*********************************************************************** 
**

von Jan H. (janiiix3)


Lesenswert?

Wolfgang schrieb:
> ;*********************************************************************** **
> ; delay half period
> ; For I2C in normal mode (100kHz), use T/2 > 5us
> ; For I2C in fast mode (400kHz),   use T/2 > 1.3us
> ;*********************************************************************** **

Sagt mir jetzt das ich was ändern muss bzw. Was anderes nutzen soll... 
Nur was genau?

von Wolfgang (Gast)


Lesenswert?

Erstmal musst du wissen, mit welcher Taktfrequenz dein uC läuft.

von Karl M. (Gast)


Lesenswert?

Hallo Wolfgang,

zur Mathematik: f = 1/t <==> t = 1/f

Damit kann man die Zeiten ausrechnen.

von Wolfgang (Gast)


Lesenswert?

Karl M. schrieb:
> zur Mathematik: f = 1/t <==> t = 1/f
>
> Damit kann man die Zeiten ausrechnen.

Wie meinen?

In i2c_delay_T2  in i2cmaster.S werden Taktzyklen des Prozessors 
verdaddelt. Wieviele das sein müssen, hängt von der uC-Taktfrequenz und 
von der erforderlichen Verzögerung ab.

Was willst du da mit f = 1/t?

von Jan H. (janiiix3)


Lesenswert?

Wolfgang schrieb:
> Karl M. schrieb:
> zur Mathematik: f = 1/t <==> t = 1/f
> Damit kann man die Zeiten ausrechnen.
>
> Wie meinen?
>
> In i2c_delay_T2  in i2cmaster.S werden Taktzyklen des Prozessors
> verdaddelt. Wieviele das sein müssen, hängt von der uC-Taktfrequenz und
> von der erforderlichen Verzögerung ab.
> Was willst du da mit f = 1/t?

Meine CPU läuft auf 8MHz.

von Dirk B. (Gast)


Lesenswert?

Jan H. schrieb:
> Wolfgang schrieb:
>> ;*********************************************************************** **
>> ; delay half period
>> ; For I2C in normal mode (100kHz), use T/2 > 5us
>> ; For I2C in fast mode (400kHz),   use T/2 > 1.3us
>> ;*********************************************************************** **
>
> Sagt mir jetzt das ich was ändern muss bzw. Was anderes nutzen soll...
> Nur was genau?
1
X MHz* 1.3 = T bspw. 8*1.3=ca.10T
2
                    ; 7T
3
2c_delay_T2:        ; 4 cycles ;stehen lasen
4
     nop nop nop; 3    ; <-fehlende nop's für 10T  
5
        ret         ; 3  ;stehen lassen  "

ist ein bisschen schwierig das anschaulich zu schreiben (und die rjmps 
um nop's speichersparend zu implementieren machen mMn den Code nicht 
lesbarer)

edit: codeformatierung .. und / mit * verwechselt

von Peter D. (peda)


Lesenswert?

Gibt es diese Lib nicht auch in c?
Dann könnte man bequem mit _delay_us() die Zeiten einstellen.
Für umständlichen Assembler besteht jedenfalls keinerlei Grund.

von Dirk B. (Gast)


Lesenswert?

Peter D. schrieb:
> Gibt es diese Lib nicht auch in c?
dafür machst du besser einen eigenen Thread auf, wenn die Frage nur 
einfach "Frequenz ändern" ist

> Dann könnte man bequem mit _delay_us() die Zeiten einstellen.
das ist sicherlich bequemer als aufwendig eine Handvoll "nop" zu 
notieren, aber solche Bequemlichkeit kann schnell zu erlernter 
Hilflosigkeit führen und bei einem beängstigenden Aufwand von mehreren 
nop sogar die Kompetenz  ein Hilfegesuch eigenständig zu stellen 
gefährden.

> Für umständlichen Assembler besteht jedenfalls keinerlei Grund.
es gibt sicherlich Menschen die lieber umständliche Suchanfragen 
bevorzugen, anstatt einfach ein paar nop zu schreiben. Vielleicht 
überfordert die umständliche Multiplikation zweier Zahlen auch bequeme 
Nutzer, sodass sie eine Lib mit vormultiplizierten Zahlen erfragen.

von Jan H. (janiiix3)


Lesenswert?

Dirk B. schrieb:
> 2c_delay_T2:        ; 4 cycles ;stehen lasen
>      nop nop nop; 3    ; <-fehlende nop's für 10T
>         ret         ; 3  ;stehen lassen  "

Wenn ich das jetzt so einfüge kommt ein Fehler. Kann ich das etwa nicht 
direkt so einfügen?
Wie gesagt habe von Asembler keine Ahnung.

von Mario M. (thelonging)


Lesenswert?

Jedes NOP muss auf eine eigene Zeile.

von Wolfgang (Gast)


Lesenswert?

Jan H. schrieb:
> Wenn ich das jetzt so einfüge kommt ein Fehler.

Schön, dann lies dir den Text der Fehlermeldung einfach mal durch oder 
poste ihn hier.

> Kann ich das etwa nicht direkt so einfügen?

Kannst du schon, wird aber zu einer Fehlermeldung führen.
Schreibe mal jedes nop in eine eigene Zeile, ggf. mit Kommentar 
dahinter ;-)
Die ";" leiten einen Kommentar ein

> Wie gesagt habe von Asembler keine Ahnung.
Ein paar elementare Grundlagen können nie schaden

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.