Ресет-присутствие реализовал.
Отправку-прием бита реализовал, но проверить не могу.
Отправляю команду READ ROM [33h], но считываю все биты как 1, то есть мне не кто не отвечает.
- Вложения
-
- main.c
- (2.92 КБ) 323 скачивания
Ok, учту но это пока не мешает. Резистор 4.7кЕсли внешний подтягивающий резистор установлен, то манипуляции с PORTB можно выкинуть...
Изначально я так и делал, а из-за того что сразу не зарабочало пошли эксперименты.И всегда перед тем как послать в линию 0 (перед ресетом или стробом) проверяйте наличие 1 на линии.
Блин, а это для меня новость. Значит щас нарисую чтение какого-нибудь байта памяти.DS1821 может быть на шине только единственным устройством, т.к. (Вам уже сказали) не имеет ROM! После RESET и ответа от датчика посылайте сразу команды:READ TEMPERATURE [AAh],START CONVERT T [EEh],STOP CONVERT T [22h],WRITE TH [01h],WRITE TL [02h],READ TH [A1h],READ TL [A2h],WRITE STATUS [0Ch],READ STATUS [ACh],READ COUNTER [A0h],LOAD COUNTER [41h]
вы вообще откуда такую инфу черпаете? 0 в линии, паузы... бред какой-то. не пробовали изучать ДОКУМЕНТАЦИЮ - все-таки эта литература хоть доброе и вечное не сеет, но разумное - как правило... DS1820 не устанавливает в линии 0 на вермя преобразования - зарубите себе это на носу! и впредь не используйте для написания программ непроверенные СЛУХИ - только документацию производителя. во многих случаях даже переводам доверять следует с опаской.danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
А как красиво начиналось: DS1821... и вдруг используем слухи для 1820danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
по даташиту не может не получаться. а черпать из чужих источников, особенно когда "не понимаешь", не советую - вспомните братца Иванушку: дочерпался из "источников", бедолажка...danger3466 писал(а):А куда деваться если по даташиту не получается или не понимаешь
не увидел каких-то особых "трюков" в работе со строками, кроме грубых ошибок в коде и мелких ляпов типа избыточности.danger3466 писал(а):Как вам как я работаю со строками? Или так лучше не делать?
Код: Выделить всё
void USART_Send(unsigned char *data) // Отправка в USART
{
int i;
while(data[i]){
if (data == '\n')
USART_Send('\r');
while ( !( UCSRA & (1<<UDRE)) ){};
UDR = data[i];
i++;
}
}Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char data=command;
int i;
for(i=0;i<8;i++)
{
data=data<<7; //Сдвиг на i разрядов влево
command=command>>1; //Сдвиг передаваемого байта
if(data==0x80) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
data=command; //Новое значение для сдвига
};
}
Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1)
{
if(command & mask) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
};
}
О, прикол, не заметил, и кстати да работает ведьвот это у вас на самом деле работает? и data == '\n' тоже?!
Код: Выделить всё
зачем функция Send если фактически используется USART_Send ?stdin пробовал, но не понравилось сколько он памяти отобрал, тогда оптимизация была O3, может потому что не O2зачем вообще городить что-то свое, если есть stdio.h ?
Для меня было не очевидным поведение этого бита, для верности сделалзачем в начале каждой функции работы с шиной 1-wire у вас одно и то же PORTB &= ~_BV(PB1); ?
Такой for вижу врервые, потому и сделал как сделала вот эти хитрости с data и command к чему вообще?!по-моему, логичнее как-то так:Код: Выделить всё
void OWI_Send_command(unsigned char command) { unsigned char data=command; int i; for(i=0;i<8;i++) { data=data<<7; //Сдвиг на i разрядов влево command=command>>1; //Сдвиг передаваемого байта if(data==0x80) OWI_Send_1(); //Передача лог.1 else OWI_Send_0(); //Передача лог.0 data=command; //Новое значение для сдвига }; }Код: Выделить всё
void OWI_Send_command(unsigned char command) { unsigned char mask; for(mask = 0x80; mask; mask >>= 1) { if(command & mask) OWI_Send_1(); //Передача лог.1 else OWI_Send_0(); //Передача лог.0 }; }
То есть boolen какой-нибудь, что там на 1 бит?почему большинство функций у вас типа int? для AVR напрасная трата ресурсов...
Ну так, подглядел где надоМастер Ломастер писал(а):задержка нужна. но ее величина ДОКУМЕНТИРОВАНА, хотя взятая вами величина в 800 мс подходит
Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1)
{
if(command & mask) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
};
}Так и есть оказываетсяdanger3466 писал(а):На запрос температуры в терминал выдает 00011110 что соответствует в десятичной 30.
На температуру слабо похоже, у нас вроде прохладней
Включил stdio.h, uart занимает 1.5кб + код для 1wire 0.5 это при общем объеме в 2кб, не хватает что то около 60бМастер Ломастер писал(а):зачем вообще городить что-то свое, если есть stdio.h ?