реклама на сайте
подробности

 
 
> 1-wire+Xmega некорректное чтение
Мария Е
сообщение Dec 12 2012, 11:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424



Здравствуйте!
К Xmega32D4 подключена ИМС с UID ds2411. 1-wire реализовывала сама в avrstudio6. Reset проходит, ответ на него приходит. После команды Read ROM (0x33) в ответ приходит стабильно одна и та же последовательность байт, но почему-то последние два байта нулевые (хотя самый последний байт должен быть CRC). Первый байт считывается правильно 0x01. Из чего сделала вывод, что тайминги все соблюдаются, да и осциллограф об этом же говорит. Пробовала на двух разных платах (соответственно с двумя разными ИМС ds2411). Результат одинаковый. В чем может быть проблема?
Тактовый сигнал таймера 16 МГц.
Просмотрела 20 страниц форума по результату поиска по 1-wire. Ничего похожего на мою ситуацию не нашла, поэтому и создаю очередную тему.
CODE

#define trstl 480
#define tpdh 70
#define tpdl 250
#define tslot 35

void init_timer0(void)
{
// enable timer and its clock system
tc_enable(&TCC0);
//задаем режим работы таймера: обычный
tc_set_wgm(&TCC0, TC_WG_NORMAL);
}

void timer_delay_us(unsigned int us_count)
{
uint16_t us=0;
us=us_count*16;
// устанавливаем top
tc_write_period(&TCC0, us);
// устанавливаем источник тактирования и начинаем считать!
tc_write_clock_source(&TCC0, TC_CLKSEL_DIV1_gc);
while(!(tc_is_overflow(&TCC0)));
tc_clear_overflow(&TCC0);
// stop timer
tc_write_clock_source(&TCC0, TC_CLKSEL_OFF_gc);
tc_write_count(&TCC0,0);
}

unsigned char send_reset(void)
{
unsigned int delay_count=0;

ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
timer_delay_us(trstl);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
// ждем ответа ds2411 (ждем нуля на линии)
// либо выхода по тайм-ауту
while((ioport_get_pin_level(PORT_UID))&&(delay_count<tpdh))
{
timer_delay_us(1);
delay_count++;
}
if (delay_count==tpdh) return 0;
delay_count=0;
// ждем пока ds2411 держит ответ (ждем 1 на линии)
while((!(ioport_get_pin_level(PORT_UID)))&&(delay_count<tpdl))
{
timer_delay_us(1);
delay_count++;
}
if (delay_count==tpdl) return 0;

return 1;
}

void write_one(void)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
timer_delay_us(tslot);
}

void write_zero(void)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
timer_delay_us(tslot);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
}

void send_ROM_read(void)
{
// посылаем код команды 0x33 младшим битом вперед
write_one();
write_one();
write_zero();
write_zero();
write_one();
write_one();
write_zero();
write_zero();
}

unsigned char read_byte(void)
{
unsigned char temp=0,i;

for(i=0;i<7;i++)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
LED_GREEN_ON();
if (ioport_get_pin_level(PORT_UID))
{
temp|=0x80;
}
LED_GREEN_OFF();
temp>>=1;
timer_delay_us(tslot);
// while(!(ioport_get_pin_level(PORT_UID)));
// usart_serial_putchar(USART_SERIAL, temp);
}
return temp;
}

void read_UID(unsigned char *uid)
{
unsigned char i;

while (!send_reset());
timer_delay_us(tpdl);
send_ROM_read();
timer_delay_us(tslot);
for (i=0;i<8;i++)
{
LED_RED_ON();
// usart_serial_putchar(USART_SERIAL, i);
*uid=read_byte();
// usart_serial_putchar(USART_SERIAL, *uid);
LED_RED_OFF();
uid++;

}
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016