Stránka 1 z 1

Oprava RTC

Napsal: 07 dub 2010, 21:45
od mad32
Zdravím, může mi někdo pomoci se znovunastavením RTC DS 1302S.

Napsal: 07 dub 2010, 21:48
od Atlan
co tam chces znovu nastavovat som troska nepochopil.....

Napsal: 07 dub 2010, 22:37
od Bernard
Před léty jsem to dělal nějak takto:

Kód: Vybrat vše

void
reset_clk (void) {
  RTC_CLOCK = 0; 
  RTC_SEL = 0;
  RTC_SEL = 1;
}

void
reset_rtc (void) {
  unsigned char jj;
;
  RTC_SEL = 0;
  RTC_CLOCK = 0;
  RTC_DATA = 1;
  delay(100);
  zapis_rtc(CTRL_WR,RTC_UNLOCK);
  jj = citaj_rtc(SEK_RD);
  if ((jj & 0x80)!=0)
    zapis_rtc(SEK_WR, 0);
}

void
zapis_rtc (unsigned char POVEL_WR, unsigned char HODNOTA) {
  reset_clk();
  zapis_bajt(POVEL_WR);
  zapis_bajt(HODNOTA);
  reset_clk();
}

void
zapis_bajt (unsigned char HODNOTA) {
  unsigned char jj;

  for (jj=8; jj>0; jj--) {
     RTC_DATA = 0;
     if (HODNOTA & 0x01)
       RTC_DATA = 1;
     RTC_CLOCK = 0;      
     RTC_CLOCK = 1;      // hrana dela zapis
     HODNOTA >>= 1;
  }
}

unsigned char
citaj_bajt (void) {
  unsigned char HODNOTA, POMOC, jj;
;
  HODNOTA = 0x00;
  RTC_DATA = 1;
  for (jj=0; jj<8; jj++) {
    RTC_CLOCK = 1;
      RTC_CLOCK = 0;
      POMOC = 0;
      POMOC |= RTC_DATA;
      POMOC <<= 7;
      HODNOTA >>= 1;
      HODNOTA |= POMOC;
  }
  return HODNOTA;
}

unsigned char
citaj_rtc (unsigned char POVEL_RD) {
  unsigned char POMOC = 0;

  reset_clk();
  zapis_bajt (POVEL_RD);
  POMOC = citaj_bajt();
  reset_clk();
  return POMOC;
}

void
set_clock (void) {
;
  reset_rtc ();
  zapis_rtc(SEK_WR,0x80);
  zapis_rtc(MIN_WR,DATUM_CAS [1]);
  zapis_rtc(HOD_WR,DATUM_CAS [2]);
  zapis_rtc(DEN_WR,DATUM_CAS [3]);
  zapis_rtc(MES_WR,DATUM_CAS [4]);
  zapis_rtc(DOW_WR,DATUM_CAS [5]);
  zapis_rtc(ROK_WR,DATUM_CAS [6]);
  zapis_rtc(SEK_WR,DATUM_CAS [0]);
}


Jestli ti to pomůže netuším. :wink: