Forum: Mikrocontroller und Digitale Elektronik PCF8593 über I2C Bus steuern


von Viktor (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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

von Viktor (Gast)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Vom Quarz is doch ganich de Rede, sondern was übern I2C Bus kommt...

von Viktor (Gast)


Lesenswert?

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?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

von Frank M. (frank_m35)


Lesenswert?

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.

von Viktor (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Viktor (Gast)


Lesenswert?

brauche ich eine nack? die stopbedingung mach ich grade rein

von Viktor (Gast)


Lesenswert?

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.

von Viktor (Gast)


Lesenswert?

Ich hab mir schon gedacht dass ich hier keine Hilfe finde.

Vielen Dank für nichts ihr besserwisser!

Viktor

von Frank M. (frank_m35)


Lesenswert?

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
Noch kein Account? Hier anmelden.