Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

89s52, PCF8583P - odczyt na przemian raz dobry, a raz zły

McarlosM 06 Lut 2008 13:00 888 0
  • #1 06 Lut 2008 13:00
    McarlosM
    Poziom 11  

    Witam, mam problem jak w temacie. Zbudowałem urządzenie, w którym wykorzystuje RTC PCF8583P. Z elektroniką jest wszystko OK bo ogólnie zegarek "tyka". Natomiast mam coś nie tak z programem. Wygląda to następująco:
    Za pierwszym razem gdy odczytuje czas (tzn godziny i minuty) wszystko jest tak jak być powinno. Program działa w pętli i w związku z tym za drugim razem odczyt także powinien być prawidłowy. Niestety tak nie jest. Na wyświetlaczu pokazują mi się zawartości kolejnych komórek PCF-ki tzn dzień i miesiąc. Za kolejnym razem znowu poprawna godzina a potem dzień i miesiąc. I tak w kółko. Załączam przykładowy programik w Asemblerze. Proszę o pomoc.

    Code:

    E   EQU   P3.7
    RW   EQU   P3.6   
    RS   EQU   P3.5
    BUZZ   EQU   P0.1
    PODS   EQU   P0.0
    STAN   EQU   P0.2
    WIRE   EQU   P3.3
    SCL   EQU   P3.0
    SDA   EQU   P3.1
    INT   EQU   P3.2
    ACK   BIT   0

       LJMP   START
       ORG    100
    START:   LCALL   D50M      ;OPÓŻNIENIE 100MS (ŁADOWANIE KONDENSATORÓW)
       LCALL   LCD_INI      ;INICJALIZACJA WYŚWIETLACZA
    LOOP:   MOV   A,#83H
       LCALL   ROZKAZ      ;USTAWIENIE KURSORA NA WYŚWIETLACZU
       LCALL   I2CSTART   ;ROZPOCZĘCIE TRANSMISJI I2C
       MOV   A,#0A0H      ;ADRES PCF8583P A0 - ZAPIS
       LCALL   I2CWB      ;ZAPIS DO I2C
       MOV   A,#3H      ;KOMÓRKA 3H - MINUTY
       LCALL   I2CWB      ;ZAPIS DO I2C
       LCALL   I2CSTART   ;ROZPOCZĘCIE TRANSMISJI
       MOV   A,#0A1H      ;ADRES PCF8583P   A0 - ODCZYT
       LCALL   I2CWB      ;ZAPIS DO I2C
       LCALL   I2CRB      ;ODCZYTANIE KOMÓRKI 3H - MINUTY
       PUSH   ACC
       ANL   A,#11110000B
       RR   A
       RR   A
       RR   A
       RR   A
       ADD   A,#30H
       LCALL   DANE      ;WYŚWIETLENIE DZIESIĄTEK MINUT
       POP   ACC
       ANL   A,#00001111B
       ADD   A,#30H
       LCALL   DANE      ;WYŚWIETLENIE JEDNOŚCI MINUT




       MOV   A,#82H
       LCALL   ROZKAZ      ;USTAWIENIE KURSORA
       MOV   A,#':'      
       LCALL   DANE      ;WYŚWIETLENIE SEPARATORA
       CLR   A
       MOV   A,#80H
       LCALL   ROZKAZ      ;USTAWIENIE KURSORA   
       LCALL   I2CRB      ;ODCZYTANIE KOMÓRKI 4H - GODZINY
       PUSH   ACC
       ANL   A,#11110000B
       RR   A
       RR   A
       RR   A
       RR   A
       ADD   A,#30H
       LCALL   DANE      ;WYŚWIETLENIE DZIESIĄTEK GODZIN
       POP   ACC
       ANL   A,#00001111B
       ADD   A,#30H
       LCALL   DANE      ;WYŚWIETLENIE JEDNOŚCI MINUT
       LCALL   I2CSTOP      ;KONIEC TRANSMISJI
       LCALL   D500M      ;OPÓŹNIENIE 1S
       LJMP   LOOP      ;SKOK DO PONOWNEGO ODCZYTU CZASU

    LCD_INI:   CLR   E
          CLR   RW
          CLR   RS
          MOV   P1,#00H
          MOV   A,#01H
          LCALL   ROZKAZ
          MOV   R5,#20
    KR1:      MOV   R6,#100
          DJNZ   R6,$
          DJNZ   R5,KR1
          MOV   A,#06H
          LCALL   ROZKAZ
          LCALL    OPOZ
          MOV   A,#0CH
          LCALL   ROZKAZ
          LCALL    OPOZ
          MOV   A,#38H
          LCALL   ROZKAZ
          LCALL    OPOZ
          MOV   A,#01H
          LCALL   ROZKAZ
          MOV   R5,#20
    KR2:      MOV   R6,#100
          DJNZ   R6,$
          DJNZ   R5,KR2
          RET

    ROZKAZ:      CLR   RS
          CLR   RW
          MOV   P1,A
          SETB   E
          CLR   E
          LCALL   OPOZ
          RET

    DANE:      SETB   RS
          CLR   RW
          MOV   P1,A
          SETB   E
          CLR   E
          LCALL   OPOZ
          RET

    OPOZ:   MOV   R6,#20
       DJNZ   R6,$
       RET

    D50M:   MOV   R7,#5
    KROK1:   MOV   R5,#100
    KROK2:   MOV   R6,#100
       DJNZ   R6,$
       DJNZ   R5,KROK2
       DJNZ   R7,KROK1
       RET

    D500M:   MOV   R7,#50      
    KROKI1:   MOV   R5,#100
    KROKI2:   MOV   R6,#100
       DJNZ   R6,$
       DJNZ   R5,KROKI2
       DJNZ   R7,KROKI1
       RET

    I2CSTART:         ;ROZPOCZĘCIE TRANSMISJI   I2C
       SETB   SDA
       NOP
       SETB   SCL
       ACALL   I2CDEL
       CLR   SDA
       ACALL   I2CDEL
       CLR   SCL
       RET

    I2CSTOP:         ;ZAKOŃCZENIE TRANSMISJI   I2C
       CLR   SDA
       NOP
       CLR   SCL
       ACALL   I2CDEL
       SETB   SDA
       ACALL   I2CDEL
       SETB   SCL
       RET

    I2CDEL:   NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       RET

    I2CWB:   CLR   SCL      ;ZAPIS BAJTU DO I2C
       MOV   R1,#8
    LOOPW:   RLC   A
       MOV   SDA,C
       SETB   SCL
       ACALL   I2CDEL
       CLR   SCL
       ACALL   I2CDEL
       DJNZ   R1,LOOPW
       SETB   SDA
       SETB   SCL
       ACALL   I2CDEL
       MOV   C,SDA
       CLR   SCL
       MOV   ACK,C
       RET

    I2CRB:   MOV   R1,#8      ;ODCZYT BAJTU Z I2C
       MOV   A,#255
    LOOPR:   SETB   SDA
       SETB   SCL
       ACALL   I2CDEL
       MOV   C,SDA
       CLR   SCL
       RLC   A
       ACALL   I2CDEL
       DJNZ   R1,LOOPR
       SETB   SDA
       MOV   C,ACK
       MOV   SDA,C
       NOP
       SETB   SCL
       ACALL   I2CDEL
       CLR   SCL
       RET


    Możliwe, że coś źle robie jeżeli chodzi o sposób odczytywania (sekwencja). Procedury są raczej w porządku bo próbowałem na innych z tego forum i efekt był taki sam.

    0 0