Bascom RTC MCP7940M läuft nicht!

WZindler

Neues Mitglied
Premium Benutzer
03. Jan. 2015
8
0
0
Haan, NRW
Sprachen
  1. BascomAVR
  2. Assembler
Hallo,

ich habe in meiner Schaltung ein MCP7940M von MicroChip.
Leider kann ich diese Uhr nicht über den I2C-Bus ansteuern.
Mit meinem Scan-Programm sehe ich alle anderen Bausteine, nur eben dieses RTC nicht.

Alternativ habe ich jetzt ein DS1307 eingesetzt und alles funktioniert einwandfrei.
Auf Nachfrage bei MicroChip soll es an der Adresse liegen, kann ich aber nicht glauben.
Problem Resolution:
Confirm you are trying the correct address. The MCP7940M requires all 3 Chip Select bits to be ‘1’, for a full 7-bit I2C address of ‘1101111’. So if the customer is only scanning through the upper 4 bits (the Control Code), then you might not get a response. (The DS1307 uses ‘000’ for its Chip Select bits.)

Wer hat Erfahrung mit diesem Baustein oder kennt dieses Problem?

Gruß

Wolfgang
 
Hi Wolfgang,

das ist mal wieder ein Datenblatt in dem die I2C-Adresse 7-bittig angegeben wird und vom Baustein 8-bittig erwartet wird :p

3.1.2 DEVICE ADDRESSING AND OPERATION
A control byte is the first byte received following the Start condition from the master device (Figure 3-2). The control byte for accessing the SRAM and RTCC registers are set to ‘1101111’. The RTCC registers and the SRAM share the same address space. The last bit of the control byte defines the operation to be performed. When set to a ‘1’ a read operation is selected, and when set to a ‘0’ a write operation is selected. The next byte received defines the address of the data byte (Figure 3-3).

Ist ein wenig blöd geschrieben. Also ...
11011110 => I2Cwrite-Adresse (&DEh , hex DE)
11011111 => I2Cread-Adresse (&DFh , hex DF)
Da sollte der Baustein am Bus zu finden sein. Wenn man nach ner Start-Condition (I2Cstart) die Adresse sendet (I2Cwrite) dann sollte sich der Baustein mit einem Acknowledge-Bit melden. Danach kann man dann entweder weiterschreiben wenn man Adresse DE gesendet hat oder wenn man DF gesendet hat macht einen Repeated-Start und liest die Daten aus.

Hier gibts das Datenblatt vom MCP7940M (970kB, zu groß zum dranhängen)

Ein paar Bildchen aus dem Datenblatt ...

MCP7940M_5-1.png
In 5-1 und 5-2 sieht man wie man ein einzelnes Byte in den Baustein schreiben kann. Also zuerst die Startcondition und dann die I2C-Baustein-Schreibadresse senden. Danach die interne Speicheradresse an der man mit dem Schreiben anfangen will (sozusagen die interne Registeradresse). Danach kommt dann ein oder mehrere Datenbytes die fortlaufend ab der angegebenen Speicheradresse abgelegt werden.

I2Cstart
I2Cwrite &DEh
I2Cwrite Speicheradresse
I2Cwrite data1
I2Cwrite data2
I2Cwrite data3
....
I2Cstop


MCP7940M_5-5.png
Nun das ganze in 5-5 und 5-6 für Leseoperationen. Man sendet wieder die Startcondition und danach wieder die I2C-Baustein-Schreibadresse. Dann wird die Speicheradresse geschrieben ab der man aus dem Inhalt (Register) lesen möchte. Danach kommt nun das Repeated-Start (also wieder eine Startcondition). Jetzt folgt die I2C-Baustein-Leseadresse. Nun wird nacheinander ein Byte nach dem anderen ab der vorher angegebenen Speicheradresse aus dem Baustein ausgegeben.

I2Cstart
I2Cwrite &DEh
I2Cwrite Speicheradresse
I2Cstart
I2Cwrite &DFh
I2Cread data1, ACK
I2Cread data2, ACK
I2Cread data3, ACK
....
I2Cread datax, NACK
I2Cstop


MCP7940M_5-4.png
Hier nochmal in 5-4 das Lesen von einem oder mehreren Bytes ab der aktuell verwendeten Speicheradresse. Man sendet wieder die Startcondition und danach diesmal die I2C-Baustein-Leseadresse. Nun wird wieder nacheinander ein Byte nach dem anderen ab der vorher zuletzt verwendeten Speicheradresse aus dem Baustein ausgegeben.

Wenn man also vorher die Adresse 03h angegeben hat und dann 3 Bytes schreibt, dann steht der Adresszeiger auf 05h oder 06h. Je nach interner Logik des Bausteins. Man liest dann das erste Byte also bei 05h oder 06h aus dem Baustein.

Ach ja ... diese Diagramme sind doch immer wesentlich aufschlußreicher als dieses ganze Geschwafel im Text :p

Gruß
Dino
 
Hallo Wolfgang!

Mein erster Gedanke war der Selbe wie Dinos.....
Die angegebene Adresse hat nur 7bit und es fehlt noch das erste Bit für ein vollständiges Byte!



Allerdings haben mich diese Zeilen dann aufhorchen lassen:
Mit meinem Scan-Programm sehe ich alle anderen Bausteine, nur eben dieses RTC nicht.

Was ist das denn für ein Scan-Programm.....
und wo ist der Programmcode dazu in deinem Beitrag, damit wir eine Vorstellung von deinem Programm bekommen? :hmmmm:

Sorry, aber wir können weder auf deinen Schreibtisch noch auf deinen Monitor schauen.


Dino hat dir zum Beispiel sehr ausführlich geantwortet und eine Menge Zeit investiert.
Vielleicht ist dir das aber auch alles schon bewusst und dein Programm scannt recht großflächig.....
dann war Dinos Zeitaufwand für die ausführliche Antwort für die Tonne! :dirol:

Bedenke das bitte bei deiner nächsten Frage im Forum und stell immer gleich ALLE Infos mit ein (Programmcode, Datenblatt oder Link, Fotos)!


Grüße,
Cassio
 
Danke und Sorry

Hallo Dino und Cassio,

ja stimmt, anbei das Scan-Programm:
Code:
'-------------------------------------------------------
'      HAUPT-Programm
'-------------------------------------------------------

ScanTWI

Do
Loop

'-------------------------------------------------------
'      SUB-Prozeduren
'-------------------------------------------------------
Sub ScanTWI()
   PortC = 255                'Alle LED's an
   Wait 3
   For BusAdr = 0 to 254 Step 2
      I2Cstart
      I2Cwbyte BusAdr
      If Err = 0 Then
         PortC = BusAdr       'Ausgabe der gefundenen Adresse auf das LED-Port
         Wait 2
       End If
      I2Cstop
   Next
   Wait 5
   PortC = 0
   For n = 1 to 30
      Toggle PortC.0          'Scan-Ende, LED 0 blinkt
      WaitMs 300
   Next n
   PortC = 255                'Alle LED's an
End Sub

Ich werde gleich morgen Dino's Hinweise testen.
Vielen Dank für die ausführliche Erklärung, liegt dann wohl doch an der Adressierung!

Gruß

Wolfgang
 
Hallo Wolfgang!

Na, das hat doch schon mal Hand und Fuß! :wink:

Theoretisch müsstest du mit deinem Scan-Programm alle Write-Adressen auf dem TWI-Bus erreichen können.
Es kann daher also nicht sein, dass es sich bei dir nur um ein Adressierungsproblem handelt.

Mangels Datenblatt kann ich dir jetzt auch nicht weiterhelfen.
Ich denke aber mal, dass es sich bestimmt um einen Hardware- oder Anwenderfehler handelt. :wink:


Ach so.....
Zum Abfragen einer TWI-Adresse kannst du auch so vorgehen:
Code:
      I2Cstart
      I2Cwbyte BusAdr
      I2Cstop

      If Err = 0 Then
         PortC = BusAdr       'Ausgabe der gefundenen Adresse auf das LED-Port
         Wait 2
       End If

Das funktioniert auch und auf diese Weise blockierst du den Bus nicht um die Wartezeit (Anzeigezeit).

Diese Option kannst du später auch in "richtigen" Programmen nutzen und dann im Programmablauf darauf reagieren. :wink:


Grüße,
Cassio
 
Hi Wolfgang,

beim DS1307 hab ich mal das Problem gehabt das die Spannung der Backup-Batterie zu groß war. Da hat sich der Baustein auch quergestellt. Bei dem MCP scheint die Backup-Spannung identisch mit der Versorgungsspannung zu sein. Ich hab auf jeden Fall keinen Anschluß für eine Batterie, Akku, GoldCap, ... gefunden. Ein RTC nennt man auch Timekeeper da er im Zweifelsfall eher den Zugriff verweigert um seine Information vor zerstörerischen Zugriffen zu schützen. Eventuell paßt dem Baustein irgendwas nicht und er stellt sich darum tot. Dafür müßte man aber das Datenblatt etwas eingängiger und länger durchsuchen.

Gruß
Dino
 
Die Uhr läuft jetzt: Hurra

Hallo ihr beiden,

Dank Dinos Hilfe habe ich den Fehler gefunden.
Es waren zwei Bausteine mit der gleichen Adresse am Bus, da konnte der Scanner auch nichts finden.

Jetzt läuft die Uhr einwandfrei.:D

Ich werde aber diesen Baustein doch nicht weiter nutzten, da man keine Backup-Batterie anschliessen kann, somit gehen nach Abschalten der Versorgung alle Zeit-Informationen verloren.
Wie mir der Hersteller mitteilte, ist diese Version eigentlich nur für Geräte gedacht, die immer durchlaufen und versorgt werden.

Hier noch die Programm-Modifikation zum Einschalten der Uhr: Bit 7 der Daten-Adresse 0 muss dazu auf "1" gesetzt werden, sonst läuft die Uhr nicht an.
Code:
'-------------------------------------------------------
'      SUB-Prozeduren
'-------------------------------------------------------

Sub SET_Time(xH , xM , xS)
   xS = MakeBCD(xS)           'Sekunde
   xM = MakeBCD(xM)           'Minute
   xH = MakeBCD(xH)           'Stunde
   xS = xS or &B10000000      'Bit 7 setzten
   I2Cstart
   I2Cwbyte WR_RTC
   I2Cwbyte 0                 'Daten-Adresse
   I2Cwbyte xS
   I2Cwbyte xM
   I2Cwbyte xH
   I2Cstop
End Sub

Sub SET_Date(xT , xM , xJ)
   xT = MakeBCD(xT)           'Tag
   xM = MakeBCD(xM)           'Monat
   xJ = MakeBCD(xJ)           'Jahr
   I2Cstart
   I2Cwbyte WR_RTC
   I2Cwbyte 4                 'Daten-Adresse
   I2Cwbyte xT
   I2Cwbyte xM
   I2Cwbyte xJ
   I2Cstop
End Sub

Sub Get_Time()
   I2Cstart
   I2Cwbyte WR_RTC
   I2Cwbyte 0                 'Daten-Adresse
   I2Cstop
   I2Cstart
   I2Cwbyte RD_RTC
   I2Crbyte xSek , Ack
   I2Crbyte xMin , Ack
   I2Crbyte xStd , Ack
   I2Cstop
   ED_Nack                    'I²C-Bestätigung holen!!
   xSek = xSek and &B01111111 'Bit 7 löschen
   sSek = Str(MakeDec(xSek))
   sMin = Str(MakeDec(xMin))
   sStd = Str(MakeDec(xStd))
   If Len(sSek) = 1 then sSek = "0" + sSek
   If Len(sMin) = 1 then sMin = "0" + sMin
   If Len(sStd) = 1 then sStd = "0" + sStd
End Sub

Sub Get_Date()
   I2Cstart
   I2Cwbyte WR_RTC
   I2Cwbyte 4                 'Daten-Adresse
   I2Cstop
   I2Cstart
   I2Cwbyte RD_RTC
   I2Crbyte xTag , Ack
   I2Crbyte xMon , Ack
   I2Crbyte xJah , Ack
   I2Cstop
   ED_Nack                    'I²C-Bestätigung holen!!
   sTag = Str(MakeDec(xTag))
   sMon = Str(MakeDec(xMon))
   sJah = Str(MakeDec(xJah))
   If Len(sTag) = 1 then sTag = "0" + sTag
   If Len(sMon) = 1 then sMon = "0" + sMon
   sJah = "20" + sJah
End Sub
Diese SUB-Routinen sind für die Ausgabe auf das LCD-Display eDIP128-6 gedacht.

Also vielen Dank für die Unterstützung!!

Gruß

Wolfgang
 
Ich werde aber diesen Baustein doch nicht weiter nutzten, da man keine Backup-Batterie anschliessen kann, somit gehen nach Abschalten der Versorgung alle Zeit-Informationen verloren.

Sicherlich kann man die Stromversorgung für den 7940M auch mit ein wenig Bauteilen puffern, auch wenn die Stromaufnahme mit ca. 25µA deutlich größer als bei der Version mit BAT-Anschluss ist. Außerdem hat der den großen Vorteil das man Abweichungen der Frequenz mittels eines Registers kompensieren kann. Das können viele andere nicht.
 
Hi,

Sicherlich kann man die Stromversorgung für den 7940M auch mit ein wenig Bauteilen puffern, auch wenn die Stromaufnahme mit ca. 25µA deutlich größer als bei der Version mit BAT-Anschluss ist. Außerdem hat der den großen Vorteil das man Abweichungen der Frequenz mittels eines Registers kompensieren kann. Das können viele andere nicht.

würde ich auch sagen. Ne Schottky davor und dann nen dicken GoldCap von 0,2F parallel zu dem sowieso notwendigen 100nF. Die kosten nicht viel und nen Versuch ist es wert. Man muß nur zusehen das kein Strom durch die anderen Anschlüsse abfließen kann.

Gruß
Dino
 
Das habe ich so schon im Einsatz. Damit lassen sich mehrere Tage problemlos überbrücken. Wenn es länger durchhalten soll dann muss sowieso ein Akku ran, je nach Akkugröße wird es etwas aufwändiger.
 
Es waren zwei Bausteine mit der gleichen Adresse am Bus, da konnte der Scanner auch nichts finden.


Hallo Wolfgang!

Na, da habe ich mit meiner Vermutung doch wieder genau ins Schwarze getroffen...... :D:D:D
Ich denke aber mal, dass es sich bestimmt um einen Hardware- oder Anwenderfehler handelt. :wink:


Mach dir aber keine Gedanken.....
jeder Fehler passiert einem meistens nur einmal. :wink:


Freut mich jedenfalls zu hören dass es nun funktioniert.



Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)