Forum: Mikrocontroller und Digitale Elektronik RTC -> MCP79521


von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

momentan schreibe ich einen Treiber für die RTC MCP79521. Auf diesem 
Baustein befindet sich neben der RTC auch ein EEPROM und ein geschützter 
Bereich für eine MAC-Adresse. Auf das EEPROM und den geschützten Bereich 
komme ich drauf. Die RTC will einfach nicht starten. Ich habe schon 
einiges mit dem Reg. ST, VBAT, OSC usw. probiert, und komme nicht 
weiter. Es geht im wesentlichen um diese Code-Abschnitte. Habe hier ggf. 
etwas vergessen? Kennt jemand diese RTC für den SPI-Bus?

Den kompletten Quelltext und das Datenblatt habe ich beigefügt. Wäre 
schön wenn hier jemand etwas weiß.

Viele Grüße
Ingo
1
#define MCP795XX_READ        0x13      // Read data from RTCC/SRAM array beginning at selected address
2
#define MCP795XX_WRITE       0x12      // Write data to RTCC/SRAM array beginning at selected address
3
4
/************************************************************************/
5
// Uhrzeit
6
/************************************************************************/
7
#define RTCHSEC     0x00
8
#define RTCSEC      0x01
9
#define RTCMIN      0x02
10
#define RTCHOUR     0x03
11
#define RTCWKDAY    0x04
12
#define RTCDATE     0x05
13
#define RTCMTH      0x06
14
#define RTCYEAR     0x07
15
#define CONTROL     0x08
16
#define OSCTRIM     0x09
17
/************************************************************************/
18
19
/************************************************************************/
20
// Allgemeines Schreiben eines Bytes
21
/************************************************************************/
22
uint8_t MCP795XX_Write_Byte(uint8_t address, uint8_t data)
23
{
24
25
    while (!SPI1_Open(SPI1_DEFAULT));     //4.00 MHz
26
    CS_RTC_SetLow();
27
    RTC_SPI_WRITE8(MCP795XX_WRITE);
28
    RTC_SPI_WRITE8(address);
29
    RTC_SPI_WRITE8(data);
30
    CS_RTC_SetHigh();
31
    
32
    SPI1_Close();
33
    __delay_ms(5);      //Pausenzeit zum schreiben
34
    
35
  return 1;
36
} 
37
/************************************************************************/
38
39
/************************************************************************/
40
// Allgemeines Lesen eines Bytes
41
/************************************************************************/
42
uint8_t MCP795XX_Read_Byte(uint8_t address)
43
{
44
    uint8_t retval;
45
46
    while (!SPI1_Open(SPI1_DEFAULT));     //4.00 MHz
47
    CS_RTC_SetLow();
48
    RTC_SPI_WRITE8(MCP795XX_READ);
49
    RTC_SPI_WRITE8(address);
50
    retval = RTC_SPI_READ8();
51
    CS_RTC_SetHigh();
52
    SPI1_Close();
53
54
  return(retval);
55
}    
56
/************************************************************************/
57
58
//exemplarisch mal diesen Teil zum Schreiben der Sekunden
59
/************************************************************************/
60
void MCP795XX_Write_Sekunden(date_time_t *dt)
61
{
62
  uint8_t bcd_Sekunden;
63
  
64
  bcd_Sekunden = BIN2BCD(dt->Sekunden); 
65
    MCP795XX_Write_Byte(RTCSEC, (0x80 | ((bcd_Sekunden) & 0x7F))); // ST ON
66
}
67
/************************************************************************/

von Wastl (hartundweichware)


Lesenswert?

Ingo S. schrieb:
> Wäre schön wenn hier jemand etwas weiß.

Ich weiss zwar nix aber habe eine ganz einfache Frage: hast du
denn deine MCP79521 korrekt in Betrieb genommen, d.h. alles nach
Hersteller-Vorgaben beschaltet? Schwingt denn dein Quarz in
deiner Schaltung? Kannst du deine Schaltung im Aufbau zeigen?
Fragen über Fragen ....

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Klar kann ich das machen. Der Quarz schwingt leider nicht. Das ist mein 
Problem. Die Kontaktierungen habe ich geprüft. Als Kondensatoren sind 
10pF bestückt. Die Projektdaten als Eagle 9 File sind auch mit dabei.

von Wastl (hartundweichware)


Lesenswert?

Ingo S. schrieb:
> Die Projektdaten als Eagle 9 File sind auch mit dabei.

Habe kein Eagle, andere Leute möglicherweise auch nicht, daher
meine Frage

Wastl schrieb:
> Kannst du deine Schaltung im Aufbau zeigen?

Damit wäre ein Foto gemeint ....

von Wastl (hartundweichware)


Lesenswert?

Ingo S. schrieb:
> Der Quarz schwingt leider nicht.

Wie stellst du das fest?

von Dieter S. (ds1)


Lesenswert?

Das Datenblatt sagt daß das ST Bit gesetzt werden muß damit der 
Oscillator arbeitet.

Außerdem gibt es AN1519 – “Recommended Crystals for Microchip 
Stand-Alone Real-Time Clock Calendar Devices”.

Alternativ könnte man versuchshalber ein externes Clock-Signal 
einspeisen, dann aber das EXTOSC Bit setzen.

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Dieter S. schrieb:
> Das Datenblatt sagt daß das ST Bit gesetzt werden muß damit der
> Oscillator arbeitet.

Stimmt. Hat der TO aber auch gemacht:

Ingo S. schrieb:
> MCP795XX_Write_Byte(RTCSEC, (0x80 | ((bcd_Sekunden) & 0x7F))); // ST ON

von Wastl (hartundweichware)


Lesenswert?

Ingo S. schrieb:
> Der Quarz schwingt leider nicht.

Wenn man den Takt an den Quarz-Pins messen möchte gelingt
dies oft nicht da die Quarz-Beschaltung ggf. dann eine zu grosse
Last sieht und die Schwingung abreisst. Um dies zu vermeiden kann
man ja den MFP Pin nutzen um einen Takt nachzuweisen. Da sollte
auf jeden Fall etwas "herauskommen" ohne den Quarzoszillator zu
stören.

von Dieter S. (ds1)


Lesenswert?

Wastl schrieb:
>
> Stimmt. Hat der TO aber auch gemacht:
>

Die Funktion MCP795XX_Write_HSekunden() aus MCP795XX.c schreibt aber ins 
falsche Register (RTCSEC anstelle RTCHSEC):

1
void MCP795XX_Write_HSekunden(date_time_t *dt)
2
{
3
    uint8_t bcd_HSekunden;
4
  
5
  bcd_HSekunden = BIN2BCD(dt->HSekunden); 
6
  MCP795XX_Write_Byte(RTCSEC, bcd_HSekunden);
7
}

Damit würde eventuell ST wieder gelöscht werden.

von Ingo S. (schicki)


Lesenswert?

Der Mann ist klasse! Vielen Dank Es funktioniert.

Großes Lob an Die Runde.

Vielen Dank! und schönes Wochenende
Ingo

von Rainer W. (rawi)


Lesenswert?

Wastl schrieb:
> enn man den Takt an den Quarz-Pins messen möchte gelingt
> dies oft nicht da die Quarz-Beschaltung ggf. dann eine zu grosse
> Last sieht und die Schwingung abreisst.

Die Chancen, dabei den Ausgang des Oszillator zu erwischen, sind halt 
50%.

Warum sollte eine Messung am Oszillatorausgang die Quarzschwingung zum 
Abreißen bringen?
Den Eingang ohne geeignete Entkopplung zusätzlich mit einer Messstrippe 
zu belasten, wäre in der Tat keine gute Idee.

: Bearbeitet durch User
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.