Чт сен 13, 2012 11:35:03
Чт сен 13, 2012 12:10:42
Чт сен 13, 2012 12:14:38
Чт сен 13, 2012 12:28:01
temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Пт сен 14, 2012 04:36:55
Пт сен 14, 2012 11:22:48
Пт сен 14, 2012 13:04:13
Пт сен 14, 2012 17:08:17
Тут читается только 8 бит.... чтобы прочитать 64, надо 8 раз вызвать данную фкнкцию.invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Здесь тоже происходит запись только одного байта, чтобы записать 8 байт, надо соответственно 8 раз вызвать данную ф-цию.invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
Ничего автоматически заполнятся не будет, все надо прописать, в цикле, читать байт 1wire, потом сохранять в EEPROM, и так 8 раз.....invisible86 писал(а):Уже открыл, просто 64 бита я считаю, но ячейка памяти eeprom 8 бит, если я просто отправлю все 64 как мне кажется все ячейки памяти заполнятся автоматически и по порядку. а как указать в какой диапазон ячеек памяти поместить значение переменой что бы потом, занести несколько таблеток в разные ячейки, и вызывать их значения из EEPROM по очереди для сравнения
Вс сен 16, 2012 17:20:25
Вс сен 16, 2012 17:27:08
Вс сен 16, 2012 17:32:37
Вс сен 16, 2012 18:22:00
Потому, что на нём никто ничего не делает нормального, т.к. это игрушка, у которой глобальные проблемы с оптимизацией.invisible86 писал(а):не думал что так трудно будет найти исходник написанный на mikroC for PIC для того что бы разобраться на примере уже почти месяц рою интернет
Вс сен 16, 2012 18:48:47
Вс сен 16, 2012 19:13:39
Вс сен 16, 2012 21:01:31
Вс сен 16, 2012 22:56:54
Ну смотря откуда читаеш. Если читаеш 1wire то в коде который ты приводил, как раз показана работа с 1wire датчиком температуры DS1820. Я тут в скобках, еще свои коменты добавил, вроде все простоinvisible86 писал(а):А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет
do { // главный цикл
Ow_Reset(&PORTE,2); // Сигнал сброса по шине Onewire (любое обращение к 1wire устройствам начинается со сброса)
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM (исп-ся только когда подключено одно устройство на линии)
Ow_Write(&PORTE,2,0x44); // Выдача команды CONVERT_T (начать преобразование температуры, потом надо подождать ок 0,6 сек)
Delay_us(120); // (Вот тут как раз надо бы подождать 600мс а стоит почему то задержка 120мс ???)
Ow_Reset(&PORTE,2); // опять сброс (любое обращение к 1wire устройствам начинается со сброса)
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM (опять обращаемся к одному устройству на линии)
Ow_Write(&PORTE,2,0xBE); // Выдача команды READ_SCRATCHPAD (читать данные устройства)
Delay_ms(400); // (Здесь вообще не нужна задержка, не знаю зачем тут влепили 400мс ???)
j = Ow_Read(&PORTE,2); // Получить LSB температуры (температура занимает 2 байта, читаем младший)
temp = Ow_Read(&PORTE,2); // Получить MSB температуры (читаем старший)
temp <<= 8; temp += j; // Формирование результата (ну и дальше уже чтото делаем с данными температуры.....)
Display_Temperature(temp); // Форматирование и вывод результатов на LCD
Delay_ms(500);
} while (1);
Соответственно тут читается всего 1 байт.....invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
char Ow_Data [8]; //в объявлениях, объявить массив, под чтение 8 байт по линии 1wire
void Ow_Read_Data (*char); //прототип функции чтения 8 байт данных по линии 1wire
Ow_Read_Data (Ow_Data); //так вызывать ф-цию. данные запишутся последовательно в массив Ow_Data[]
void Ow_Read_Data (*Addr) //функция чтения 8 байт данных с устройства 1wire
{
for (char i=0; i<8; i++)
*Addr++ = Ow_Read (&PORTE,2);//читаем с 1wire, записываем в массив, инкрементируем указатель, и так 8 раз
}
Тут тоже запишется только 1 байт. Чтобы записать 8 байт, надо впихнуть ее в цикл наподобие того что я описывал ранее. Хотя не совсем понятная для меня ф-ция, по идее ей должны передаваться 2 значения, адрес и байт для записи, а тут передается одно значение. Мож еще есть функции которые инициализируют указатель, а уже потом с помощью EEprom_Write(temp); последовательно записываются передаваемые байты данных..... вот тут не знаю.invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
Пн сен 17, 2012 05:18:05
Пн сен 17, 2012 06:37:16
Пн сен 17, 2012 06:46:19
Пн сен 17, 2012 09:30:07
Я совсем недавно тоже выяснял эти вопросы в ветке про C. Использовал примерно так:invisible86 писал(а):shads, а еще мне интересно если я прочитаю данные ну к примеру с еепром и запишу их переменные a, b ,e, те a = 00011100, b = 00001111, e = 01110000 как мне их объединить в одно значение что бы вышло к примеру rez = 00011100 00001111 01110000, думаю нужно использовать сдвиг влево сдвинуть а влево чтобы получилось а = 00011100 00000000 и тд
правильно мыслю?
unsigned long abc; //переменная в 4 байта
unsigned char a; //обычные байты, которые надо объединить
unsigned char b;
unsigned char c;
abc <<= 8UL; //как то так помещаем байты в длинную переменную
abc |= c; //может и короче как получится, это я сейчас придумал
abc <<= 8UL; //именно так на практике не прменял
abc |= b; //я только вдвигал побитно как ниже.....
abc <<= 8UL;
abc |= a;
abc <<= 1UL; //побитное формирование длинной переменной, сдвиг влево
if (условие)
abc |=1; //в зависимости от условия устанавливаем младший бит
//и так в цикле, сколько надо бит задвинуть.....
a = (unsigned char) (abc >> 0); //как то так читаем из длинной переменной
b = (unsigned char) (abc >> 8);
c = (unsigned char) (abc >> 16);