Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 chrv 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
;