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
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
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.
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:
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
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
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
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
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:
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.
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
//Beispiel C1
2
int16_tmsb,lsb;
3
uint16_tC1;
4
5
msb=UB_I2C1_ReadByte(0xA0,0x10);//C1 msb
6
if(msb<0){//error}
7
lsb=UB_I2C1_ReadByte(0xA0,0x11);//C1 lsb
8
if(msb<0){//error}
9
10
C1=(uint16_t)((8<<msb)|(lsb));
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
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
UB_I2C1_WriteByte(0xEE,0xFF,0xF0);
2
Delay_ms(41);//sysTick Handler >40ms
3
4
//Diese Fkt musst du erstellen und das Stopbit entfernen!
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
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:
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