00001 #include "ds1631.h"
00002
00003 #define WRITE 0
00004 #define READ 1
00005
00006 void ds1631_write_mode() {
00007 clear_bit(tris_array[ds1631_sda_port - PORTA], ds1631_sda_pin);
00008 }
00009
00010 void ds1631_read_mode() {
00011 set_bit(tris_array[ds1631_sda_port - PORTA], ds1631_sda_pin);
00012 }
00013
00014
00015 void ds1631_start() {
00016
00017 ds1631_write_mode();
00018
00019 set_pin(ds1631_sda_port, ds1631_sda_pin);
00020 ds1631_bit_delay();
00021
00022 set_pin(ds1631_scl_port, ds1631_scl_pin);
00023 ds1631_bit_delay();
00024 clear_pin(ds1631_sda_port, ds1631_sda_pin);
00025 ds1631_bit_delay();
00026 clear_pin(ds1631_scl_port, ds1631_scl_pin);
00027 }
00028
00029 void ds1631_stop() {
00030 ds1631_write_mode();
00031
00032 set_pin(ds1631_scl_port, ds1631_scl_pin);
00033 ds1631_bit_delay();
00034 clear_pin(ds1631_sda_port, ds1631_sda_pin);
00035 ds1631_bit_delay();
00036 set_pin(ds1631_sda_port, ds1631_sda_pin);
00037 }
00038
00039
00040
00041
00042 void ds1631_write_byte(uns8 data) {
00043 uns8 count;
00044
00045 ds1631_write_mode();
00046
00047 for (count = 0; count < 8; count++) {
00048 change_pin(ds1631_sda_port, ds1631_sda_pin, data.7);
00049 ds1631_bit_delay();
00050 set_pin(ds1631_scl_port, ds1631_scl_pin);
00051 ds1631_bit_delay();
00052 clear_pin(ds1631_scl_port, ds1631_scl_pin);
00053 data = data << 1;
00054 }
00055 }
00056 uns8 ds1631_read_and_ack(uns8 last) {
00057
00058 uns8 count, data;
00059 ds1631_read_mode();
00060 for (count = 0; count < 8; count++) {
00061 set_pin(ds1631_scl_port, ds1631_scl_pin);
00062 ds1631_bit_delay();
00063 data = data << 1;
00064 data.0 = test_pin(ds1631_sda_port, ds1631_sda_pin);
00065 clear_pin(ds1631_scl_port, ds1631_scl_pin);
00066 ds1631_bit_delay();
00067 }
00068
00069 ds1631_write_mode();
00070
00071 change_pin(ds1631_sda_port, ds1631_sda_pin, last);
00072
00073 set_pin(ds1631_scl_port, ds1631_scl_pin);
00074 ds1631_bit_delay();
00075 clear_pin(ds1631_scl_port, ds1631_scl_pin);
00076 ds1631_bit_delay();
00077 return data;
00078 }
00079
00080 void ds1631_write_convert(uns8 control, uns8 command) {
00081
00082 ds1631_start();
00083
00084 ds1631_write_and_ack(control);
00085
00086 ds1631_write_and_ack(command);
00087
00088 ds1631_stop();
00089 }
00090
00091 void ds1631_write_and_ack(uns8 data) {
00092
00093
00094 ds1631_write_byte(data);
00095
00096 ds1631_read_mode();
00097
00098 set_pin(ds1631_scl_port, ds1631_scl_pin);
00099 ds1631_bit_delay();
00100 clear_pin(ds1631_scl_port, ds1631_scl_pin);
00101
00102 ds1631_write_mode();
00103
00104 }
00105
00106 void ds1631_write_config(uns8 control, uns8 command, uns8 data) {
00107
00108 ds1631_start();
00109 control.0 = WRITE;
00110
00111 ds1631_write_and_ack(control);
00112 ds1631_write_and_ack(command);
00113 ds1631_write_and_ack(data);
00114
00115 ds1631_stop();
00116 }
00117
00118 uns8 ds1631_read_config(uns8 control, uns8 command) {
00119
00120 uns8 result;
00121
00122 ds1631_start();
00123 control.0 = WRITE;
00124 ds1631_write_and_ack(control);
00125 ds1631_write_and_ack(command);
00126 control.0 = READ;
00127 ds1631_start();
00128 ds1631_write_and_ack(control);
00129
00130 result = ds1631_read_and_ack(1);
00131 ds1631_stop();
00132 return result;
00133 }
00134
00135
00136 uns16 ds1631_get_temp(uns8 control, uns8 command ) {
00137
00138 uns16 result;
00139
00140 ds1631_start();
00141 control.0 = WRITE;
00142 ds1631_write_and_ack(control);
00143 ds1631_write_and_ack(command);
00144
00145 control.0 = READ;
00146 ds1631_start();
00147 ds1631_write_and_ack(control);
00148
00149 result = ds1631_read_and_ack(0);
00150
00151 result = result << 8;
00152 result = result + ds1631_read_and_ack(1);
00153 ds1631_stop();
00154 return result;
00155 }
00156
00157 void ds1631_setup() {
00158 make_output(ds1631_sda_port, ds1631_sda_pin);
00159 make_output(ds1631_scl_port, ds1631_scl_pin);
00160 set_pin(ds1631_sda_port, ds1631_sda_pin);
00161 set_pin(ds1631_scl_port, ds1631_scl_pin);
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 uns8 convert_to_dec2b(uns8 data) {
00184
00185 switch (data) {
00186 case 0: return 00;
00187 case 1: return 00;
00188 case 2: return 00;
00189 case 3: return 25;
00190 case 4: return 25;
00191 case 5: return 25;
00192 case 6: return 50;
00193 case 7: return 50;
00194 case 8: return 50;
00195 case 9: return 50;
00196 case 10: return 50;
00197 case 11: return 75;
00198 case 12: return 75;
00199 case 13: return 75;
00200 case 14: return 99;
00201 case 15: return 99;
00202 }
00203 }
00204
00205 uns8 convert_to_dec1(uns8 data) {
00206
00207 switch (data) {
00208 case 0: return 0;
00209 case 1: return 1;
00210 case 2: return 1;
00211 case 3: return 2;
00212 case 4: return 3;
00213 case 5: return 3;
00214 case 6: return 4;
00215 case 7: return 4;
00216 case 8: return 5;
00217 case 9: return 6;
00218 case 10: return 6;
00219 case 11: return 7;
00220 case 12: return 8;
00221 case 13: return 8;
00222 case 14: return 9;
00223 case 15: return 9;
00224 }
00225 }
00226 uns8 convert_to_dec2(uns8 data) {
00227
00228 switch (data) {
00229 case 0: return 00;
00230 case 1: return 06;
00231 case 2: return 13;
00232 case 3: return 19;
00233 case 4: return 25;
00234 case 5: return 31;
00235 case 6: return 38;
00236 case 7: return 44;
00237 case 8: return 50;
00238 case 9: return 56;
00239 case 10: return 63;
00240 case 11: return 69;
00241 case 12: return 75;
00242 case 13: return 81;
00243 case 14: return 88;
00244 case 15: return 94;
00245 }
00246 }
00247