Guten Tag, ich habe hier ein Buch in dem es bei einem Beispiel Code um den IC2 bus geht. Und dort wurde die Taktfrequenz nach folgender Rechnung festgelegt I²C CLK Frequency = 100kHz, CLK = 8000000/(16 + 2*(0x50)*1) Jetzt ist es aber so das ich 16Mhz nutzen möchte, Und die 0x50 werden ja in diesem Register gesetzt.: TWBR = 0x50; // Set the TWI clock-frequency in bit rate register jetzt wollte ich die obige Rechnung erst einmal eben mit 8000000 nachrechnen um dann später das mit 16000000 zu machen. ich habe festgestellt das ich es nicht schaffe das mit den 0x50 zu berechnen, könnte mir das bitte jemand erklären, wie ich das richtig rechnen kann ?
Gast
#5751824
Michael H. schrieb: > Jetzt ist es aber so das ich 16Mhz nutzen möchte, Das ist abhängig vom Controller, den du nicht genannt hast. Und die Berechnung der Taktrate steht im Datenblatt des verwendeten Controllers. Du brauchst nur dort nachsehen.
Gast
#5751826
> ich habe festgestellt das ich es nicht schaffe das mit den > 0x50 zu berechnen Ich verstehe deine Frage nicht. Was hindert dich daran, in der Formel die 8MHz durch 16MHz zu ersetzen?
Entschuldigung das habe ich vergessen das ist ein Atmega88PA ich habe auch ins Datenblatt geschaut. Da steht das das TWBR Praktisch der Teiler ist. Heisst das dann, ich kann mit den 8bit einen Teiler von 1-256 einstellen ? und mit dem 0x50 wurde hier ein Teiler von 144 eingestellt oder wie ?
Gast
#5751881
Hallo, im DB http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf steht: 22.5 Overview of the TWI Module unter 22.5.2 Bit Rate Generator Unit This unit controls the period of SCL when operating in a Master mode. The SCL period is controlled by settings in the TWI Bit Rate Register (TWBR) and the Prescaler bits in the TWI Status Register (TWSR). Slave operation does not depend on Bit Rate or Prescaler settings, but the CPU clock frequency in the Slave must be at least 16 times higher than the SCL frequency. Note that slaves may prolong the SCL low period, thereby reducing the average TWI bus clock period. [Formel] SCL frequency = F_CPU / (16 +2(TWBR) *PrescalerValue) [/Formel] TWBR = Value of the TWI Bit Rate Register PrescalerValue = Value of the prescaler, see Table 22-7 on page 241. Schaut man dann nach unter "22.9.1 TWBR – TWI Bit Rate Register", findet man: *Bits 7...0* !! TWI Bit Rate RegisterTWBR selects the division factor for the bit rate generator. The bit rate generator is a frequency divider which generates the SCL clock frequency in the Master modes.
CLKPR und TWBR bestimmen den TWI-Takt. TWBR teilt von 0 bis 255. Mfg
Gast
#5751899
Wenn der Prescaler 1 ist, dann haben wir SCL frequency = F_CPU / (16 +2(TWBR)) Umgestellt ergibt das: ((F_CPU / SCL frequency) - 16) / 2 = TWBR Wir setzen ein: ((8000000 Hz/ 100000 Hz) - 16) / 2 = 32 Du musst also TWBR=32 einstellen, um auf 100kHz zu kommen. Zur Kontrolle: 8000000 Hz / (16 +2(32)) = 100000 Hz Was käme denn bei 0x50 (=80 dezimal) heraus?: 8000000 Hz / (16 +2(80)) = 45455 Hz 16000000 Hz / (16 +2(80)) = 90909 Hz Bringt dich das weiter?
Michael H. schrieb: > I²C CLK Frequency = 100kHz, CLK = 8000000/(16 + 2*(0x50)*1) Wenn ich 8000000/(16 + 2*(0x50)*1) rechne komme ich aber auf 8000000 / (16 + 2 * 80) = 45455 Hz Stefanus war schneller :-)
Gast
#5751904
Falls du auf 400kHz hoch gehen willst, beachte dabei dass TWBR mindestesn den Wert 10 haben muss. Die 400kHz wirst du mit einem 8MHz Quarz also nicht erreichen können.
Danke hilft mir schon etwas weiter, jetzt zeige ich euch hier mal den Code, den ich allerdings nicht für den LM75 verwenden will sondern, wenn ich es geschafft habe den Takt richtig zu bestimmen, will ich eigentlich nur die Funktionen nutzen um dann auf einen MCP4735 einen Wert ins Register schreiben, So steht der Code in meinem Buch. Und aus der while schleife habe ich halt schon einiges entfernt aber das tut ja hier nichts zur sache, ich will ja nur den richtigen Takt für 16 Mhz einstellen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
Gast
#5751935
Da fehlt ein Zeilenumbruch vor dem "if": > // Check value of TWI statusregister. Mask prescaler bits. If status > different from START go to ERROR if ((TWSR & 0xF8) != START) > ERROR();
Gast
#5751945
Hi >Falls du auf 400kHz hoch gehen willst, beachte dabei dass TWBR >mindestesn den Wert 10 haben muss. Diese Einschränkung kenne ich von alter AT90S... . Bei aktuellen AVRs finde ich diese Einschränkung nicht mehr. MfG Spess
Gast
#5751955
Michael H. schrieb: > das ist ein Atmega88PA spess53 schrieb: > Diese Einschränkung kenne ich von alter AT90S... . Bei aktuellen AVRs > finde ich diese Einschränkung nicht mehr. Datenblatt Kapitel 19.5.2: "Note: ...TWBR should be 10 or higher if the TWI operates in master mode. If TWBR is lower than 10, the master may produce an incorrect output on SDA and SCL for the reminder of the byte. "
Gast
#5751967
Hi
>Datenblatt Kapitel 19.5.2:
Welches Datenblatt? Bei dem Kapitel stoße ich bei den ATMega88 immer auf
SPI.
MfG Spess
Beitrag #5751970 wurde von einem Moderator gelöscht.
Stefanus F. schrieb: > Da fehlt ein Zeilenumbruch vor dem "if": > >> // Check value of TWI statusregister. Mask prescaler bits. If status >> different from START go to ERROR if ((TWSR & 0xF8) != START) >> ERROR(); Ja, das ist wohl dem Geschuldet das ich es hier rein kopiert habe. mir geht es eigentlich hautsächlich Darum das ich diesen Code für meine 16Mhz konfiguriere, und da blicke ich nicht durch, da ich für die Berechnung den Prescaler CLKPR den ich ja setzen soll niergends in dem Code finden kann. ich weiß aber das dieser so mit 8Mhz ohne Probleme funktioniert.
Gast
#5751972
spess53 schrieb: >>Datenblatt Kapitel 19.5.2: > Welches Datenblatt? http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9365-Automotive-Microcontrollers-ATmega88-ATmega168_Datasheet.pdf
Gast
#5751980
Moin, die section zum CLKPR findest du unter "System Clock and Clock Options" im Datasheet gruß (:
Gast
#5751982
Wenn du den Parameter nicht im Code findest musst du ihn wohl einbauen?!
Gast
#5751989
"The CKDIV8 fuse(!) determines the initial value of the CLKPS bits. If CKDIV8 is unprogrammed, the CLKPS bits will be reset to “0000”. If CKDIV8 is programmed, CLKPS bits are reset to “0011”, giving a division factor of 8 at start up"
ja, das ist klar, aber ich verstehe es ja erst einmal nicht, warum es genau so wie oben mit 8Mhz funktioniert und, wenn ich 16 Mhz benützen will muss ich ja etwas anderes machen, ich kann das auch noch öfters lesen ich check es nicht. ich könnte ja auch einfach den internen oszilator auf 8Mhz einstellen, aber dann bin ich immer noch nicht schlauer, wie der Mensch zu diesem Code bzw. aus diesem Coder diese Berechnung aufgestellt hat. I²C CLK Frequency = 100kHz, CLK = 8000000/(16 + 2*(0x50)*1) den irgendwo muss ja der prescaler *1 herkommen. ja ich weiß im clkpr, aber das muss ja dann schon irgendwo mit 1 gesetzt sein. das sehe ich nicht. Und F_CPU8000000UL wird ja auch nicht definiert und stimmt aber dann troztdem die Zeiten mit 8Mhz alles überein
Gast
#5751998
Hi
>http://ww1.microchip.com/downloads/..
Gibt es die ATMeg88 Automobile überhaupt noch?
Der TO hat einen ATMega88PA. Und dort steht der Passus definitiv nicht
mehr drin.
MfG Spess
Gast
#5752197
Stefanus F. schrieb: > spess53 schrieb: >>>Datenblatt Kapitel 19.5.2: >> Welches Datenblatt? > > http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9365-Automotive-Microcontrollers-ATmega88-ATmega168_Datasheet.pdf Das ist definitiv neu. In älteren Datenblättern findet sich das nicht. Die erste Frage ist: alter Bug (spät entdeckt) oder neues Silizium mit einem neuen Bug? Die zweite Frage: was muss man sich unter "the master may produce an incorrect output on SDA and SCL for the reminder of the byte" vorstellen? Was für ein Byte? Welchen Remainder eines Bytes könnte es geben? Was genau meint "incorrect"? In den Errata steht dazu absolut garnix. Das ist doch Bullshit. Ich würde mal darauf tippen, dass hier ein Inder was an der falschen Stelle in die Doku eingepflegt hat, vor allem deshalb, weil mir in der Realität auch keinerlei diesbezügliche Probleme begegnet sind...
Gast
#5752201
c-hater schrieb: > Das ist definitiv neu. Naja, von 2016. Offensichtlich habe ich das falsche Datenblatt erwischt, das "P" fehlt.
Gast
#5752380
Hi >Ich würde mal darauf tippen, dass hier ein Inder was an der falschen >Stelle in die Doku eingepflegt hat, vor allem deshalb, weil mir in der >Realität auch keinerlei diesbezügliche Probleme begegnet sind... Sehe ich auch so. Lt.meinen ATMEL-CDs ist beim ATMega88 dieser Absatz irgendwann zwischen Oktober 2005 und April 2006 aus dem Datenblatt verschwunden. Das Datenblatt vom ATMega88 Automotive von 2016 ist die Revision A, die seit 02/2009 unverändert ist. Wahrscheinlich war das schon damals falsch. MfG Spess
Hallo ! Der Quelltext kommt mir bekannt vor, als wenn er auch dem dicken "AVR Programmierung in C" Buch ist. Da ich da auch so einiges aus dem Buch durchprobiert habe, aber auch keine 8MHz Tacktfrequenz habe/hatte, habe ich mich an diesem Codebeispiel orientiert und etwas umgeschrieben dann:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Das Ausrechnen ob TWBR > 10 ist überlass ich mal dem Anwender... ;) Ich hoffe ich konnt ein wenig helfen.. Gerhard Nachtrag : den Prescaler stellt man an den beiden Bit TWPS1 TWPS0 im TWSTATUS-Register "TWSR" ein ..Im Datenblatt nachlesen...
Gast
#5754719
Gerhard H. schrieb: > Ich hoffe ich konnt ein wenig helfen. Nö .... damit bringst du nur diejenigen durcheinander die den Prescaler verwenden wollen oder müssen. Aber Hauptsache du hast eine Ladung ASCII hier abgeladen, das macht frei! Gerhard H. schrieb: > Nachtrag : den Prescaler stellt man an den beiden Bit TWPS1 TWPS0 im > TWSTATUS-Register "TWSR" ein ..Im Datenblatt nachlesen... Gut dass du das geschrieben hast denn bisher hat das keiner gewusst, und sonst müsste man das mühselig im Datenblatt nachlesen ... aber vielleicht stehts auch gar nicht drin.
Nun HababaBene, dann hast Du ja wenigstens des Rätsels Lösung hier völlig dar gelegt. Gruss Gerhard
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.