Словил вот такую проблему.
В проекте по 1 -wire соеденены два МК (AtMega32) - один МК эмулятор 1-wire второй ведущий ( мастер)
Проблема вот в чем.
У меня существует два варианта мастера , перивожу все в упрощенном виде только для команд инициализации устройства.
Первый. Использую команду w1_init ( та что является встроенной функцией)
[img]
http://www.radiokot.ru/forum/download/f ... w&id=33495[/img]
Картинка отличная - сигнал сброса амплитудой 5 вольт и соответственно ответ такой же все четко. Второй вариант функция ow_reset - из даташета и с помощью более опытных друзей. Выглядит вот так
[img]
http://www.radiokot.ru/forum/download/f ... w&id=33494
[/img]
И Вы видете что на картинке ответ эмулятора имеет амплитуду в 2 раза меньше. Не могу понять в чем проблема. Вертится мысль, что чтото не так в настройках портов . Но простым перебором комбинаций конфигурации порта B ( их всего 4) ничего не вышло. Может кто подскажет? такое впечатление что что то не дает просадить шину к нулю.
В проекте по 1 -wire соеденены два МК (AtMega32) - один МК эмулятор 1-wire второй ведущий ( мастер)
Проблема вот в чем.
У меня существует два варианта мастера , перивожу все в упрощенном виде только для команд инициализации устройства.
Первый. Использую команду w1_init ( та что является встроенной функцией)
Код: Выделить всё
#include <mega32.h>
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
PORTB=0x00;
DDRB=0x01;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
while (1)
{
w1_init();
delay_ms(500);
};
}
http://www.radiokot.ru/forum/download/f ... w&id=33495[/img]
Картинка отличная - сигнал сброса амплитудой 5 вольт и соответственно ответ такой же все четко. Второй вариант функция ow_reset - из даташета и с помощью более опытных друзей. Выглядит вот так
Код: Выделить всё
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#define DQ PORTB |=0<<PB0 //
#define PB0 0
#define _BV(bit) (1 << (bit))// это макрос из WinAvr, что бы работали примеры
//---------------Функция присутствия работает-------//
unsigned char ow_reset(void) //
{ //
unsigned char presence=0; //
PORTB &= ~_BV(PB0);; // опускаем линию к 0
delay_us(480); // задержка 480us
PORTB |= _BV(PB0); // возвращаем на линию данных 1
delay_us(70); // ждем ответа
if (PINB & (1<<PB0))presence++; // принимаем ответ
delay_us(250); // ждем окончания временного промежутка
return(presence); // возвращаем наличие устройств на шине
}
void main(void)
{
PORTB=0x00;
DDRB=0x01;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
while (1)
{
if (ow_reset()==0)
printf("Device YES"); else printf("NONE Device");
printf("\n\r");
delay_ms(500);
};
}
http://www.radiokot.ru/forum/download/f ... w&id=33494
[/img]
И Вы видете что на картинке ответ эмулятора имеет амплитуду в 2 раза меньше. Не могу понять в чем проблема. Вертится мысль, что чтото не так в настройках портов . Но простым перебором комбинаций конфигурации порта B ( их всего 4) ничего не вышло. Может кто подскажет? такое впечатление что что то не дает просадить шину к нулю.
- Вложения
-
- OWRESET.jpg
- (21.44 КБ) 588 скачиваний
