RTC -> MCP79521

OP #7683991
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
/************************************************************************/
Angehängte Dateien:
#7684024
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.

#7684049
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.

#7684063
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.

#7684147
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren