Проблема с сенсором температуры DS1621
Вот взялся подружить ATmega8535 и датчик температуры DS1621.
Пока в железе не пробовал, хотелось бы отладить виртуально, а потом тратится на датчик.
Датчик подключен через аппаратный I2C.
Все обрабатывается в прерывании от I2C.
Читать нужно только старший байт температуры (передается первым).
Функции термостата отключены.
Вот кусок проблемного кода:
1 interrupt [TWI] void twi_isr(void)
2
3 {ds1621_comcounter++; //счетчик команд
4 switch (ds1621_comcounter)
5 {
6 case 0x01: TWDR=0x92; //адрес, бит записи
7 TWCR=0x85; break;
8 case 0x02: TWDR=0xAC; //Команда доступа к конфиг регистру
9 TWCR=0x85; break;
10 case 0x03: TWDR=0x00; //запись в конфиг регистр (режим постоянных преобразований)
11 TWCR=0x85; break;
12 case 0x04: TWCR=0xE5; break; //повстарт
13 case 0x05: TWDR=0x92; //адрес, бит записи
14 TWCR=0x85; break;
15 case 0x06: TWDR=0xEE; //команда на старт преобразования температуры
//аппаратно преобразование занимает около 750мс
//при моделировании в протеусе я установил 1мкс
16 TWCR=0x85; break;
17 case 0x07: TWCR=0xE5; break; //повстарт
18 case 0x08: TWDR=0x92; //адрес, бит записи
19 TWCR=0x85; break;
20 case 0x09: TWDR=0xAA; //команда на чтение температуры
21 TWCR=0x85; break;
22 case 0x0A: TWCR=0xE5; break; //повстарт
23 case 0x0B: TWDR=0x93; //адрес, бит чтения
24 TWCR=0x85; break;
25 case 0x0C: T_air=TWDR; //читаем ст. байт температуры и возвращаем NACK
26 TWCR=0x85;
27 delay_us(20); //без этой паузы работа и2с зависает на 24 строчке,
//видимо нужна пауза между NACK мастера и СТОП
28 TWCR=0x95;
29 ds1621_comcounter=0;break;
30 default: ds1621_comcounter=0;
}
}
Скажу сразу я новичок в этом деле...поэтому предполагаю что затупил я, а не глюк протеуса (вер.7.6).
Так вот проблема в том, что до строчки 24 все впорядке и работает, мастер получает ACK после каждого прерывания, а начиная с
25 начинаются проблемы: в переменной T_air оказывается 0х93(последний переданный адрес с битом чтения, при этом
преобразование в датчике уже закончилось и в окне его состояния видно результат) а должнен бы быть старший байт температуры.
Похоже не инициируется передача температуры, хотя судя по состоянию TWCR - 0х58 означает что байт принят и отправлено NACK.
Вобщем я уже запух с этим датчиком, пробовал и паузы вставлять и оба байта температуры читать и т.д, всеравно фигня выходит,
ай ниид хелп.
Прилагаю даташит DS1621, и скрин моделирования в протеусе
|