| Форум РадиоКот https://radiokot.ru/forum/ |
|
| DS1621 в Proteus (Atmega88) Решено https://radiokot.ru/forum/viewtopic.php?f=57&t=184626 |
Страница 1 из 1 |
| Автор: | veso74 [ Вс сен 18, 2022 11:59:22 ] |
| Заголовок сообщения: | Re: DS1621 в Proteus (Atmega88) |
0xAA возвращает два байта: t_msb и t_lsb. i2c_restart(); не использовал, из любопытства: можете показать. Бы предпочел стандартный повторный i2c_start(); // repeat start condition |
|
| Автор: | Land [ Вс сен 18, 2022 12:31:53 ] |
| Заголовок сообщения: | Re: DS1621 в Proteus (Atmega88) |
да, я знаю, что возвращает два байта. Но ведь мне никто не может запретить принять только старший байт. Вы про это: Код: void i2c_restart(void) { ONE_SDA(); I2C_DELAY(); ONE_SCL(); I2C_DELAY(); NULL_SDA(); I2C_DELAY(); NULL_SCL(); I2C_DELAY(); } А какой вообще адрес дожен быть у Ds1621? В даташите написано следующее: Цитата: A control byte is the first byte received following the START condition from the master device. The control byte consists of a 4-bit control code; for the DS1621, this is set as 1001 binary for read and write operations. The next 3 bits of the control byte are the device select bits (A2, A1, A0). у меня получается: 1001 и 000 = 0x48 (1001000) Но нашел реализации, где адрес равен 0x90 (10010000) и на этот адрес DS1621 откликается (правда температуру считать не получается) В чем подвох? |
|
| Автор: | veso74 [ Вс сен 18, 2022 12:39:43 ] |
| Заголовок сообщения: | Re: DS1621 в Proteus (Atmega88) |
В зависимости от компилятора: I2C на 7 / 8 бит с/без [R/W] Код: ADDR_I2C = 0b1001[A2][A1][A0][R/W] Уточните 7 / 8 бит / или дайте инфо для исп. компилятора. Простой путь: подключите аппаратную часть к чипa и запустите сканер I2C. --- Поскольку Вы задали этот вопрос, теперь я вижу, что не меняете адрес, для R: 1 в конце, напр.(8 bit): Код: write: i2c_write(i2c_addr << 1); read: i2c_write(i2c_addr << 1 | 0x01); Примечание: некоторые компиляторы делают это сами. |
|
| Автор: | Land [ Вс сен 18, 2022 13:13:02 ] |
| Заголовок сообщения: | Re: DS1621 в Proteus (Atmega88) |
veso74, да, спасибо, с адресом разобрался. Для записи получается 0x90, для чтения 0х91. Спасибо, про компилятор не подумал бы даже. отклик на адрес есть. Осталось разобраться, как получить температуру ) Может кому-то пригодится: Код: // Адрес устройства
#define DS1621_ADR_R 0x91 #define DS1621_ADR_W 0x90 // Адреса регистров #define DS1621_READ_TEMPR 0xAA // Адрес регистра reads temperature #define DS1621_READ_COUNTER 0xA8 // Адрес регистра reads the value Count_Remain #define DS1621_RAED_SLOPE 0xA9 // Адрес регистра reads the value Count_Per_C #define DS1621_START_CONVERT 0xEE // Адрес регистра begins a temperature conversion #define DS1621_STOP_CONVERT 0x22 // Адрес регистра stops temperature conversion #define DS1621_ACCES_TH 0xA1 // Адрес регистра high temperature limit value into TH register #define DS1621_ACCES_TL 0xA2 // Адрес регистра low temperature limit value into TH register #define DS1621_ACCES_CONFIG 0xAC // Адрес регистра configuration data to configuration register // Funcion to init DS1621 //****************************************************************** void ds1621_init(void) { //BYTE temp = 0; i2c_init(); i2c_start(); i2c_send_byte(DS1621_ADR_W); i2c_send_byte(DS1621_ACCES_CONFIG); i2c_send_byte(0x01); //in LSB One Shot Mode. i2c_restart(); i2c_send_byte(DS1621_ADR_W); i2c_send_byte(DS1621_START_CONVERT); i2c_stop(); } // get temperature ---------- uint8_t getTemperatura(void) { i2c_start(); i2c_send_byte(DS1621_ADR_W); i2c_send_byte(DS1621_READ_TEMPR); i2c_restart(); i2c_send_byte(DS1621_ADR_R); temperatura = i2c_read_byte(NACK); i2c_restart(); i2c_send_byte(DS1621_ADR_W); i2c_send_byte(DS1621_START_CONVERT); i2c_stop(); |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


