Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. ;
  2. ;--------------------------------------
  3. ;
  4. .EQU    RTC_ADDRESS             =$A0    ; Address of PCF8583 RTC chip.
  5. .EQU    RTC_COMMON_MODE_REG     =$FE    ; RTC's register for common modes.
  6. ;.EQU    MODE_VGA                =$01    ; VGA mode (0 - not set/1 - set).
  7.  
  8. .EQU    TW_START                =$08
  9. .EQU    TW_REP_START            =$10
  10. .EQU    TW_MT_SLA_ACK           =$18
  11. .EQU    TW_MT_DATA_ACK          =$28
  12. .EQU    TW_MR_SLA_ACK           =$40
  13.  
  14. .MACRO  TW_SEND_STOP
  15.         LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
  16.         STS     TWCR,TEMP
  17. .ENDMACRO
  18. ;
  19. ;--------------------------------------
  20. ;out:   DATA == mode (bit.0 - CLR == TV mode, SET == VGA mode)
  21. NVRAM_READ_MODE:
  22. ;init i2c
  23. ;SCL frequency = CPU clk/ ( 16 + 2* (TWBR) * 4^(TWPS) )
  24. ;11052000 / (16 + 2*48 ) = 98678,5Hz (100000Hz recommended for PCF8583)
  25.         STS     TWSR,NULL
  26.         LDI     TEMP,48
  27.         STS     TWBR,TEMP
  28.  
  29. ;reset RTC
  30. ;write 0 to control/status register [0] on PCF8583
  31.  
  32.         RCALL   TW_SEND_START
  33.         ANDI    DATA,TW_START|TW_REP_START
  34.         BREQ    RTC_ERROR1
  35.  
  36.         LDI     DATA,RTC_ADDRESS
  37.         RCALL   TW_SEND_ADDR
  38.         CPI     DATA,TW_MT_SLA_ACK
  39.         BRNE    RTC_ERROR1
  40.  
  41.         LDI     DATA,0
  42.         RCALL   TW_SEND_DATA
  43.         CPI     DATA,TW_MT_DATA_ACK
  44.         BRNE    RTC_ERROR1
  45.  
  46.         LDI     DATA,0
  47.         RCALL   TW_SEND_DATA
  48. RTC_ERROR1:
  49.         TW_SEND_STOP
  50.  
  51. ;restore mode register from NVRAM
  52.  
  53.         RCALL   TW_SEND_START
  54.         ANDI    DATA,TW_START|TW_REP_START
  55.         BREQ    RTC_ERROR2
  56.  
  57.         LDI     DATA,RTC_ADDRESS
  58.         RCALL   TW_SEND_ADDR
  59.         CPI     DATA,TW_MT_SLA_ACK
  60.         BRNE    RTC_ERROR2
  61.  
  62.         LDI     DATA,RTC_COMMON_MODE_REG
  63.         RCALL   TW_SEND_DATA
  64.         CPI     DATA,TW_MT_DATA_ACK
  65.         BRNE    RTC_ERROR2
  66.  
  67.         RCALL   TW_SEND_START
  68.         CPI     DATA,TW_REP_START
  69.  
  70.         LDI     DATA,RTC_ADDRESS|$01
  71.         RCALL   TW_SEND_ADDR
  72.         CPI     DATA,TW_MR_SLA_ACK
  73.         BRNE    RTC_ERROR2
  74.  
  75.         RCALL   TW_READ_DATA
  76.         RJMP    RTC_OK2
  77. RTC_ERROR2:
  78.         LDI     DATA,0
  79. RTC_OK2:
  80.         TW_SEND_STOP
  81.         RET
  82. ;
  83. ;--------------------------------------
  84. ;out:   DATA == i2c status
  85. TW_SEND_START:
  86. ;start transmit
  87.         LDI     DATA,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  88.         STS     TWCR,DATA
  89. ;wait for flag
  90. TW_SS_WAIT:
  91.         LDS     DATA,TWCR
  92.         SBRS    DATA,TWINT
  93.         RJMP    TW_SS_WAIT
  94. ;return status
  95.         LDS     DATA,TWSR
  96.         ANDI    DATA,$F8
  97.         RET
  98. ;
  99. ;--------------------------------------
  100. ;in:    DATA == data/address
  101. ;out:   DATA == i2c status
  102. TW_SEND_ADDR:
  103. TW_SEND_DATA:
  104. ;set data/address
  105.         STS     TWDR,DATA
  106. ;enable transmit
  107.         LDI     DATA,(1<<TWINT)|(1<<TWEN)
  108.         STS     TWCR,DATA
  109. ;wait for end transmit
  110. TW_SD_WAIT:
  111.         LDS     DATA,TWCR
  112.         SBRS    DATA,TWINT
  113.         RJMP    TW_SD_WAIT
  114. ;return status
  115.         LDS     DATA,TWSR
  116.         ANDI    DATA,$F8
  117.         RET
  118. ;
  119. ;--------------------------------------
  120. ;out:   DATA == data
  121. TW_READ_DATA:
  122. ;enable transmit
  123.         LDI     DATA,(1<<TWINT)|(1<<TWEN)
  124.         STS     TWCR,DATA
  125. ;wait for flag set
  126. TW_RD_WAIT:
  127.         LDS     DATA,TWCR
  128.         SBRS    DATA,TWINT
  129.         RJMP    TW_RD_WAIT
  130. ;get data
  131.         LDS     DATA,TWDR
  132. ;NOT return status
  133. ;        LDS     DATA,TWSR
  134. ;        ANDI    DATA,$F8
  135.         RET
  136. ;
  137. ;--------------------------------------
  138. ;
  139.