Hallo! Ich hab ein kleines, nein, ein großes Problem und zwar dass ich einfach keine korrekten Daten erfassen kann! Ich spreche den PCF8593 über einen I2C Bus an, zwar funktioniert der I2C Bus, aber wenn ich diese Uhr (ach ja das ist eine Uhr mit Kalender) ansprechen will bekomm ich einfach nur Daten mit denen ich nichts anfangen kann. Die PDF zu diesem Bauteil hab ich angehängt, falls ihr mehr informationen braucht und ich hab den Code-schnipsel, der mich verrückt macht, ebenfalls angehängt. Ich hab ein Atmel AT89C5131A. Auch wenn ich sicher bin dass die Profis hier mir helfen können bitte ich euch sinnfreie Beiträge zu unterlassen. Vielen Dank für eure Hilfe :)
Meinste im ernst, dass die Uhr übern I2C Bus 11:40:50 am 29. April 2013 ausgibt? Guck ins DB ab Seite 6, da ist pedantisch erklärt wie die Bits aussehen. Referenz: http://fritzler-avr.de/HP/Librarys/PCF8583_his.php
Tut mir leid, ich hab vergessen zu erwähnen dass er eine eigene Quarz besitzt. Das Bauteil ist hab ich als fertig verbaute Platine. Platine: http://www.rb-elektronik.de/Joomla/index.php/module-mc-anwendung/i2c-bus Dessen Handbuch: http://www.rb-elektronik.de/Joomla/images/Download_Texte/Beschreibung-I2C_Platine.pdf
Vom Quarz is doch ganich de Rede, sondern was übern I2C Bus kommt...
Also man muss die Slave-Adresse ausgeben und danach die Registeradresse für das was man haben möchte und anschliessend bekommt man im BCD Format die Daten zurück oder nicht?
Ja so ist das, allerdings sind die oberen 4 bit und die unteren 4 bit getrennt als BCD Zahl zu betrachten. ZUmindest bei der Uhrzeit.
Was für Daten bekommst du denn? Und beschreibe mal in deinen eigenen Worten was dein Programm deiner Ansicht nach momentan macht? Also was liest es momentan deiner Meinung nach genau aus.
Mein Quellcode sieht nicht mehr so aus, falls du da rein guckst. Ich hab eine Funktion geschrieben die folgendes macht: -Startet I2C Bus -sendet A2h (A2h ist die Write-Slave-Adresse von der Uhr) empfängt und verwirft acknowledge bit den er bekommt. -sendet 02h (Registeradresse für die Sekunden laut DB) verwirft den acknowledge bit erneut -Startet erneut den I2C bus, da das DB sowas verlangt. -Sendet A3h(Read-Slave-Adresse) -empfängt ein byte und speichert sie in einer unsigned char -spuckt ein acknowledge bit aus für die uhr -empfängt den zweiten byte und speichert sie in einer anderen Char -anschliessend gibt er beide variablen in zwei 8xLED leisten aus damit ich zumindest seh ob sich was tut das ist das was der Quellcode sagt in der Praxis ist es so dass ich einfach bits bekomme die sich aber nicht ändern obwohl ich der uhr befehle dass sie mir die sekunden her gibt. immer wenn ich mein µC neu starte bekomm ich aber neue werte die bis zum neustart sich nicht bewegen, obwohl ich eine endlosschleife habe die ständig neue daten holen sollte. ich glaub der I2C bus schliesst bei mir nicht sauber ab und deswegen läuft er erst beim neustarten des µC
Hi >-empfängt den zweiten byte und speichert sie in einer anderen Char >-anschliessend gibt er beide variablen in zwei 8xLED leisten aus damit >ich zumindest seh ob sich was tut Ich vermisse das NACK und die Stopbedingung vom Master. MfG Spess
okay hab beides bereits drinnen gehabt. Mein Problem nun ist, dass ich einfach ein sehr schnelles lauflicht hab, das ungefähr 6 bis 10 mal in der sekunde entlang schiesst (1/10 sekunde?) ich bin langsam echt verwirrt.
Ich hab mir schon gedacht dass ich hier keine Hilfe finde. Vielen Dank für nichts ihr besserwisser! Viktor
nun, nicht jeder verfolgt ständig alle Threads, also hättest du auch höflich nochmal auf deinen Thread durch einen höflichen Post hinweisen können. Zudem bist du derjenige, der mit Informationen sehr spärlich rüber rückt. Zwar ist es toll, dass du dir die Mühe gemacht hast und dein Ablauf mit eigenen Worten erklärt hast, nur wo ist der zugehörige Source Code? Du sagst, der von dir gepostet passt nicht mit deiner Erklärung überein, ja wie soll dir da jemand helfen können um zu überprüfen ob du das auch wirklich machst, was du denkst zu tun oder gar in deinem Source Code etwas ganz anderes machst. Zudem bietet es sich an solche Command Bytes als Definitionen in das Source File mit eindeutige Namen zu schreiben, sodass jeder, und auch du, sofort erkennen kann, welchen Befehl du sendest, denn anstatt einen x-beliebige Zahl steht dann die Definition mit einem Sinnvollen Namen. Auch ist es mir noch schleierhaft wo genau du deine LEDs angechlossen hast, denn im Befehl LEDleiste scheinst du etwas über den I2C Bus zu senden, nichts mit Port ansprechen. Deine Tastenabfragen machen absolut null sinn. Du scheinst einen Taster am Port P3_2 zu haben? (Ich kennen keinen AVR und somit wird hier geraten, da du keine Kommentare dazugeschrieben hast). Diesen fragst du unentprellt in einer Endlosschleife ab und arbeitest sowohl mit dem ein und aus-Zustand. Das haut so nicht hin. Du hast eine Hauptschleife, und sonst nichts. In dieser initialisierst du, und ließt aus? Und das ständig? Das kann nicht funktionieren. Deine Main Routine sollte im Mindestfall mit einer Billigentprellung folgendermaßen ausschauen:
1 | Initialisieren der Uhr (Einschalten, Konfigurieren) // muss man nur einmal machen! |
2 | while(1) |
3 | {
|
4 | if(P3_2==1) // Taster gedrückt |
5 | {
|
6 | auslesen der Uhr |
7 | ausgeben der Werte |
8 | warten von 100ms // entprellen |
9 | while (P3_2 == 1); // warten bis Taster losgelassen wird |
10 | warten von 100ms // entprellen |
11 | {
|
12 | }
|
Eine Pause macht man nie so wie du, da du nicht weiß wie lange er wartet, oder hast du Rechenzyklen nachgerechnet, ich bezweifle das? Es gibt vermutlich eine fertige Delay Funktion die die Pause in Abhängigkeit deiner Taktfrquenz für dich genauer einstellt. Ansonsten verwendet man Timer, was aber vorerst für dich zu weit gehen würde, aber einfach im Hinterkopf behalten für zukünftige Optimierungen. Also wie du siehst, viele Probleme, viele Fehler, viele offene Fragen. Zusatz: Warum verwendest du einen uC ohne Hardware I2C Schnittstelle um ein I2C Gerät anzusprechen?
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.