Hallo. Ich muss am Montag ein Projekt in meiner Schule abgeben. Bei diesem Projekt handelt es sich um eine Wetterstation, 2 der 4 werte möchte ich mit dem Luftdruck & Temperatur Sensor Hp03s auslesen. Die Berechnung von Druck und Temperatur klappt soweit mit voreingestellten Werten, wie in der Beschreibung des Sensors. ----------------- Beschreibung: https://www.pollin.de/shop/downloads/D810119B.PDF ----------------- Zur Verfügung habe ich nur meinen Stm32f407 µC mit Discovery Board und LCD Display. Als IDE darf ich nur CooCox CooIDE verwenden. Das Problem: Ich weiss nicht, wie ich per I²C die erforderlichen Koeffizienten und Messwerte einlesen kann. Für I²C hab ich bereits eine Initialisierungsroutine geschrieben. Jedoch werde ich aus der Beschreibung nicht schlau, wie ich die Koeefizienten und Werte auslesen kann. Mein Initialisierungsfile sieht wie folgt aus: void LuftdruckuTempI2C_Init(ui32 n){ Resources__ExBoard_init(_, n, "Druck & Temp"); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); /* Enable the I2C1 peripheral clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure = {0}; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_9; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); /* I2C SCL pin Configuration */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1); /* I2C SDA pin Configuration */ /* I2C1 peripheral configuration */ I2C_DeInit(I2C1); I2C_InitTypeDef I2C_InitStructure = {0}; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x33; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 32768; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); -------------------------------- -------------------------------- Da ich dieses Projekt am Montag abgeben muss, ist es ziemlich dringend. Ich würde mich sehr über schnelle und hilfreiche Antworten freuen. mit freundlichen Grüßen wirra
Gast
#4592199
Servus, > I2C_InitStructure.I2C_OwnAddress1 = 0x33; Du bist der Master! Also ... > Das Problem: Ich weiss nicht, wie ich per I²C die erforderlichen > Koeffizienten und Messwerte einlesen kann. hier ein Beispiel für C1 >C1 (MSB:LSB)0x10:0x11 Sensitivity coefficient 0x100--0xFFFF 256--65535
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 | |
Den Rest schaffst du schon. Ist eigentlich eine Sache von 1std. mfg
Gast
#4592208
welcher Unmensch von Lehrer gibt denn nur 4 Tage Zeit für ein solches Projekt ? Und dann noch mit solch genauen Vorgaben, und die Schüler dazu verpflichten, sich selbstständig in der kurzen Projektzeit auch noch ins Thema einzuarbeiten.
Gast
#4592271
dasrotemopped schrieb: > welcher Unmensch von Lehrer gibt denn nur 4 Tage Zeit für ein solches > Projekt ? Und dann noch mit solch genauen Vorgaben, und die Schüler dazu > verpflichten, sich selbstständig in der kurzen Projektzeit auch noch ins > Thema einzuarbeiten. Tierquälerei. Ach ja, es müssten noch zwei weitere Funktionen erstellet werden:
1 | |
2 | |
Dann hau rein in die Tasten. mfg
Vielen Dank für die Antworten! Nun habe ich das Problem, dass der Sensor eine Masterclock benötigt. Da ich keinen externen Quarz zur Verfügung habe, müsste ich also auf dem µC einen Takt erstellen, und diesen über einen Portpin ausgeben. Kann mir da jemand helfen? Und nochmals vielen Dank, für die bisherigen Antworten, die haben mir bereits geholfen. mfg wirra
Schau mal im Reference Manual nach "MCO". Damit kannst du eine Clock ausgeben. Ansonsten kannst du das auch mit einem Timer, so in die Richtung PWM.
Gast
#4592501
Schon lange her, aber jenachdem ganz nützliche I2C Routinen... Beitrag "STM32F4 Discovery mit I2C-Bus EEPROM"
Ok. Das mit der Clock habe ich jetzt. Jetzt habe ich noch ein Problem, beziehungsweise eine Frage. Ich muss von jedem Koeffizient und Wert immer MSB und LSB auslesen. Dass ich diese zusammenfügen kann, muss ich nur den MSB um 8 nach links verschieben, und dann den LSB damit addieren, oder? Vielen Dank übrigens, dieses Forum und ganz besonders Ihr, rettet mir grad wahrscheinlich meine Semesternote. mfg wirra
Lukas W. schrieb: > Vielen Dank übrigens, dieses Forum und ganz besonders Ihr, rettet mir > grad wahrscheinlich meine Semesternote. Die 4 gewinnt! Und Nee, wenn du wirkluch einmal lsb und einmal msb reinbekommst (was seltsam wäre) musst du dann die BitReihenfolge einer der variablen umkehren.
Nach dem stand der dinge, brauchte ich jetzt wirklich jemanden, der mir das komplette programm schreibt, weil ich an meinen grenzen angelangt bin. ich kann die vorschläge hier nicht umsetzen, und bin fertig mit meinen nerven Falls irgendjemand das echt machen würde, wär ich ihm sehr dankbar, aber allzuviel hoffnung mach ich mir nichtmehr mfg wirra
Wo ist denn das Problem?
Ich programmiere jetzt seit 52 stunden fast durchgehend, und komm auf keinen grünen zweig. Die Berechnung der Werte klappt ja... aber ich kann die Werte nicht einlesen. Ich kann keine clock erzeugen und auf einem portpin ausgeben, und darum bekomm ich irgendwelche werte. Abgesehen davon weiss ich nicht, ob das einlesen so überhaupt funktionieren kann. Beispiel C1: //C1 - Sensitivity coefficient I2C_GenerateSTART(I2C1, ENABLE); I2C_SendData(I2C1, 0xA0); //EEPROM Schreiben I2C_SendData(I2C1, 0x10); I2C_GenerateSTART(I2C1, ENABLE); I2C_SendData(I2C1, 0xA1);//EEPROM lesen C1_MSB = I2C_ReceiveData(I2C1); I2C_SendData(I2C1, 0xA0); I2C_SendData(I2C1, 0x11); I2C_SendData(I2C1, 0xA1); C1_LSB = I2C_ReceiveData(I2C1); int C1zwischen = (C1_MSB<<8); int C1 = C1zwischen + C1_LSB; Bin wie gesagt fertig mit meinen Nerven. Wenn das Programm bis Montag nicht funktioniert, fall ich durch. mfg wirra
Hast du ein Oszi?
Gast
#4593649
Servus, so funktioniert kein Forum. Niemand macht für dich deine Hausaufgaben. Du musst konkrete Fragen stellen oder du bezahlst Geld für die Arbeit. Anbei ist das Datenblatt des EEPROMS. Hier habe ich sogar ein Fehler gemacht. Wenn man i2c Protokoll kennt, dann weiß man, dass das letzte Bit der Addresse R/!W hier als MSB und LSB genannt wird. Ein "schreiben" des EEPROMS ist nicht erlaubt! Mit einer ausgeklügelten Schleife kann die ganzen Konstanten aufeinmal erschlagen. Weiterhin sind Arbeiten bei einen Bussystem ohne einen LA sehr mühselig. Wo genau hast du Probleme? mfg
Also ich habe mir das Datenblatt des Sensors und deinen Code mal grob angeschaut, falls du kein Oszi hast, versuche mal das: - Die IC2 Clock nicht auf 32.768kHz setzen, setze die mal auf 100kHz oder auch weniger. - Die Leitungen SCL und SDA jeweils mit einem Widerstand von 1kOhm gegen V+ setzen - Am µC per Timer die Clock an einem Pin ausführen, ich würde das einfach mal per Software machen, also in einem Interrupt den Pin abwechselnd setzen und wieder löschen. Hier musst du auf deine 32.768kHz kommen
Gast
#4593667
Lukas W. schrieb: > Ich kann keine clock erzeugen und auf einem > portpin ausgeben, und darum bekomm ich irgendwelche werte. Guck dir die englische Datenblätter an. >MCLK T 30 <= 32768 <= 35 KHz Erstelle eine PWM mit dieser Frequenz. Lukas W. schrieb: > I2C_SendData(I2C1, 0xA0); //EEPROM Schreiben > I2C_SendData(I2C1, 0x10); > I2C_GenerateSTART(I2C1, ENABLE); > I2C_SendData(I2C1, 0xA1);//EEPROM lesen > C1_MSB = I2C_ReceiveData(I2C1); > I2C_SendData(I2C1, 0xA0); > I2C_SendData(I2C1, 0x11); > I2C_SendData(I2C1, 0xA1); > C1_LSB = I2C_ReceiveData(I2C1); Mit der Funktion:
1 | |
Wird automatisch das R/W bit auf NULL gesetzt!
1 | |
Wird automatisch das R/W bit auf "1" gesetzt!
1 | |
Danach kann das nicht funktionieren was du machst. Wie sieht deine Funktion: I2C_SendData(I2C1, 0xA0); aus? mfg
Tut mir leid für meine Ausrucksweise, natürlich hab ich nicht erwartet,
dass mir hier jemand das komplette programm schreibt. Tut mir wirklich
leid.
Die funktion I2C_SendData(I2C1, 0xA0); sieht so aus:
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data)
{
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
/* Write in the DR register the data to be sent */
I2Cx->DR = Data;
Ich komme einfach nicht weiter, ich weiss wirklich nicht wie ich die
Werte einlesen kann. Kann mir jemand einen Codeschnipsel zur verfügung
stellen, wie das in CooCox mit den Werten einlesen geht? Also in meinem
konkreten fall.
Wäre für jede Hilfe dankbar.
mfg
wirra
Diese Befehle stammen von einem "Betriebssystem" das mein Lehrer für diesen µC geschrieben hat. Aber natürlich dürfen wir auch standart CooCox Befehle verwenden.
Gast
#4593724
Da hast du nicht tief genug in das Reference Manual geguckt. Das wird so nie im Leben funktionieren. Zuerst muss immer das Startbit gesetzt werden! I2C_GenerateSTART(I2Cx, ENABLE); Danach müssen immer die passenden Register ausgelesen werden, damit die Geschichte läuft... Ich rate dir auf die schneller mal eine funktionstüchtige lib runter zu laden: http://mikrocontroller.bplaced.net/wordpress/?page_id=720 Danach:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Den MCLK machst du zwischen 30-35khz und CLK auf 100khz. Die Pullups hast du hoffentlich nicht vergessen, sonst wird das nichts. So, ich gehe jetzt raus an die Sonne. mfg
O mein GOTT!!! Danke, mit dieser library und deinen Befehlen klappt das Einlesen der Werte! Vielen Vielen herzlichen Dank :) Ich weiss nicht wie ich mich bedanken soll, du hast mir grad meine semesternote gerettet. DAAAAANKE! mfg wirra
Das einzige was jetzt noch fehlt, ist eben der Takt über einen Portpin. Ich weiss nicht wie ich den per pwm oder interrupts generieren kann. Kann mir da vielleicht jemand helfen? Bzw den einen oder anderen code schnippsel spendieren? Muss ja nicht der ganze sein, nur dass ich das kapiere. Bin jedem hier dankbar, ganz besonderer Dank gilt natürlich aSma>> denn ohne ihn hätte ich das nicht geschafft. Danke mfg wirra
Edit: Es war natürlich nicht das einzige was fehlte (War ja klar, ich Holzkopf (/.-) ), Denn im Datenblatt des Sensors steht ein für mich zu komplexer Vorgang um die Parameter D1 und D2 einzulesen... also letztendlich die Messwerte. Hierbei würde ich noch hilfe benötigen, da ich nicht weiss, wie ich ein Acknowledge Bit senden kann, und wie ich eines vom Slave (dem Sensor) empfangen kann. Und wie generell der ganze Vorgang aussehen muss, um die Werte zu lesen. mfg wirra
Gast
#4594256
Servus, so jetzt habe ich Sonne und reichlich Bier getankt. > Das einzige was jetzt noch fehlt, ist eben der Takt über einen Portpin. > Ich weiss nicht wie ich den per pwm oder interrupts generieren kann. Ich bitte dich ein wenig Eigeninitiative wäre nicht schlecht. Das musst du selber hinkriegen! > Denn im Datenblatt des Sensors steht ein für mich zu > komplexer Vorgang um die Parameter D1 und D2 einzulesen Lach. Was ist da Komplex???
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Tut mir leid falls ich dich enttäusche, aber ich sitze jetzt schon lange genug daran. Und nein, ich habe es nicht hingekriegt. Auch das mit D1 und D2 noch nicht
Lukas W. schrieb: > aber ich sitze jetzt schon lange genug daran Dann bist du im Studium aber falsch ? Du musst dich in die Thematik reinarbeiten. Aber vllt hast du auch Glück und jemand hier erbarmt sich ☺
Das ist kein Studium, das ist ein Nebenzweig meiner Schule. Ich habe hier eine Ausbildung zum Elektrotechniker. Die Fachinformatik und somit dieses Projekt ist ein Nebenzweig den ich machen muss. mfg wirra
Und die Zeile: UB_I2C1_WriteOneByte(0xEE, 0xFD); lässt sich bei mir so nicht compilieren, muss ich die zuerst erstellen? Wenn ja: wie? Bin echt am verzweifeln, bin über jede hilfe dankbar. Ich kann mir jetzt vorstellen wie das Auslesen von D1 und D2 funktioniert. Nur brauchte ich eben noch dieses UB_I2C1_WriteOneByte(0xEE, 0xFD); und eine Clock mit 30-35kHz Falls mir da irgendjemand helfen kann (und will), ihr seid gerne willkommen :) mfg wirra
kann ich anstatt von
1 | |
auch einfach
1 | |
2 | |
schreiben? Wenn das so funktioniert, fehlt mir nurnoch die Clock. Ich fände es echt genial, wenn sich jemand meiner erbarmen würde :( mfg wirra
Gast
#4594659
Servus, du hast einfach keine Ahnung von der Materie, deshalb fällst du zurecht durch. Guck dir die mal die Funktionen an. Diese sind super dokumentiert:
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 | |
Wenn du jetzt nicht fähig bist diese Funktion an dein Sensor anzupassen, dann fehlen mir die Worte. Ich habe sogar dir ein Bildchen gemalt. In einen Forum postet man was man hat und dann wird hoffentlich Einen geholfen. Du hast keine Ahnung von µC. Deshalb bin ich raus! mfg
Vielen Dank! Ich habe es jetzt geschafft, so eine Funktion zu implementieren. Ich bin nicht böse auf dich, ich weiss ja, dass ich nicht der begabteste darin bin. Tut mir leid dass du so viel geduld mit mir haben musstest. Jetzt fehlt wirklich nurnoch eine Clock mit 32kHz und da blicke ich wirklich nicht durch. Ich habe halt zuvor noch nie etwas mit I²C gemacht. Ein Denkanstoss wie das mit der Clock funktioniert, wäre mir schon ne große Hilfe. mfg wirra
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

