Hey Leute! Ich möchte gerne einen Luftdrucksensor (http://www.pollin.de/shop/dt/MDg4OTgxOTk-/Bausaetze_Module/Module/Luftdruck_Modul_HP03S.html) mit einem Atmega 8 ansteuern. Das ganze sollte über die Hardware TWI geschehen. Das klappt alles auch ganz gut. Nur beim Auslesen des EEPROM’S stimmen zwei meiner Ausgelesenen Werte nicht. Ich lese den mit den 24C02 kompatiblen EEPROM im SEQUENTIAL READ MODE aus. Das sieht in meinem Fall so aus: Pin XCLR = 0 TWI Starten -> TWI schreibe 0xA0 -> TWI Schreibe 0x10 -> TWI Start -> TWI Schreibe 0xA1 -> TWI Lese C1 MSB + Ack -> TWI Lese C1 LSB + ACK -> … ->TWI Lese D + Nack -> TWI Stop. Alle ausgelesenen Werte liegen im angegebenem Wertebereich, außer der Wert C, und C5. C darf zwischen 1 und 15 liegen, ist aber leider 255. Und C5 beträgt -31472 obwohl mit „uint16_t“ gearbeitet wird. Wenn man MSB und LSB ausliest betragen diese 133 und 16. Wenn man diese per Hand zusammenfügt würde der Wert wieder stimmen. Zusammengefügt wurden die beiden wie folgt: data = twi_read_ack(); //lese MSB C5 = twi_read_ack(); // lese LSB C5|= (data<<8); // zusammenfügen und speichern. Ausgelesen über ITOA und uart_puts Alle andern Werte wurden auf die Selbe Art zusammengefügt und da stimmt es. Wie kann das sein? Ist Irgendjemanden zufällig ein Fehler aufgefallen? Im Anhang ist das Programm wenn jemand es für eine genauere Prognose benötigen sollte. MFG Stephan
So jetzt habe ich mal wieder was gelernt! ITOA ist ja nur für signed Variablen geeignet! Ich benötige doch UTOA! Doch was mit den Koeffizienten „C“ los ist weiß ich immer noch nicht :(. Hat nicht jemand eine Idee was da sein könnte?
Hallo Stephan, hast du an den Sensor einen Quarz für den Masterclock geschaltet oder den über den µC erzeugt?
Danke für deine Antwort! Ich habe den Takt über den Mikrocontroller erzeugt. Mit Timer in CTC Mode. Ist das Falsch? Wird ein Quarz benötigt? MFG
Leider kann ich dir da nicht weiterhelfen, ich probiere selber noch mit den Sensor. Meine Suche hat bislang immer nur ergeben, dass der Takt über den µC erzeugt wurde. Ich hab mir allerdings einfach einen Quarz in der Frequenz besorgt und bin aber etwas überfordert den anzuschließen.
Also ich habe mir jetzt nochmal das Originale Datenblatt angesehen. Demnach sollte der Takt über den µC erzeugt werden und darf zwischen 30-35 MHz liegen. Das erklärt also mein Problem auch nicht :(. Ich würde auf den Quarz verzichten und den Takt über den Controller geben. MFG
Erhälst du denn für Temp oder Druck schon eine Ausgabe? Also bekommst du überhaupt schon Werte ausgelesen? Wenn du einen Quarz hättest, wie würdest du den denn an den MCLK hängen? Ich hab leider keine Ahnung wie ich den dort anschließe. Einen Kontakt des Quarzes auf GND und den anderen MCLK ?
Ja die Werte des EEPROMS ließ ich schon aus. Und außer den Wert C klappt alles! Nur der Wert C beträgt 255, ich hoffe das hier nicht mein Sensor einen Schaden hat :(. Ich habe das Ganze auch schon mal mit Bascom Programmiert, was auch klappte doch ist das auch schon einige Zeit her. Jetzt sollte es eigentlich mehr eine C-Programmierübung werden. Mit einem Quarz müsstest du z.B. eine Pierce-Schaltung vorschalten. (http://de.wikipedia.org/wiki/Pierce-Schaltung)
@Stephan Hochmüller: Habe den HP 02 s heute zum laufen bekommen, auch mit TWI :-) Bis auf Spannung und die Konstanten scheint der sich in der Ansteuerung ja nicht zu unterscheiden. Ich bin über die MSB / LSB reihen folge gestolpert. Das hast du ja korrigiert. Die TWI Ansteuerung habe ich mal druchgesehn, mit ist aber leider nix aufgefallen (Ich mache das hier per IRQ). Lass dir doch mal von twi_read_ack das TWSR und TWDR ausgeben. Vielleicht fällt dir das was auf. Sicher das dir der GCC das nicht wegoptimiert?
1 | while (!(TWCR & (1<<TWINT)));{} |
@youth Da brauchst du keinen Quarz. Der Sensor will 32kHz. Die lassen sich locker mit einem Timer per PWM mit 50% erzeugen (oder mit CTC und Pin Toggle wie bei Stephan).
Stephan Hochmüller schrieb: > Demnach sollte der Takt über den µC erzeugt werden und darf zwischen > 30-35 MHz liegen. Tim schrieb: > Da brauchst du keinen Quarz. Der Sensor will 32kHz. Macht das einen Unterschied zwischen 32 MHz und 32 kHz?
Ohh tut mir leid! Tippfehler! kHz natürlich! Tim schrieb: > Lass dir doch mal von twi_read_ack das TWSR und TWDR ausgeben. > Vielleicht fällt dir das was auf. Vielen Dank das du dir mal mein Programm durchgesehen hast! Ich werde die beiden Register (TWSR, TWDR) morgen mal ansehen. Vielleicht fällt mir was auf. Bericht kommt morgen. Tim schrieb: > Sicher das dir der GCC das nicht wegoptimiert? >while (!(TWCR & (1<<TWINT)));{} Sollte nicht der Fall sein im Datenblatt des ATMEGA8 ist ein Beispiel zur Ansteuerung der TWI. In diesen Beispiel sieht es gleich aus.
Naja der Test mit TWSR und TWCR hat leider auch keine Ergebnisse gebracht. Alles in Ordnung! TWSR = 0x50; was nichts andres heißt wie Übertragung mit Ack ist ok. Und TWCR sagt TWINT+TWEN+TWEA also alles wie es sein sollte. Bin jetzt gerade sehr ratlos! Mal sehn Vielleicht bekomme ich noch eine Erkenntnis die alles ändert :D.
Tim schrieb: > @youth > Da brauchst du keinen Quarz. Der Sensor will 32kHz. > Die lassen sich locker mit einem Timer per PWM mit 50% erzeugen > (oder mit CTC und Pin Toggle wie bei Stephan). Hey Tim, ja ok, allerdings brauch ich dann einen Pin mehr am µC und Speicher für Quellcode. Mal abgesehen davon, hab ich halt den passenden Quarz rumliegen und würde den gern anschließen. Nur ich komm diesbezüglich leider noch nicht weiter. Hatte bis jetzt noch nie etwas mit einen Quarz zu tun.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.