11.02.2008, 11:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Так сдвигать или устанавливать ???
Если по рабоче-крестьянски, без структур, то..
Код:
|
#define BITSET(var,bitno) ((var) |= 1 ‹‹ (bitno))
#define BITCLR(var,bitno) ((var) &= ~(1 ‹‹ (bitno)))
//-------------------------------------------------------------
void set_clr(unsigned char nomer,unsigned char position,unsigned char value)
{
if (value == 0)BITCLR(mas[nomer],position);
else BITSET(mas[nomer],position);
}
//-----------------------------------------------------
// номер байта в массиве, номер бита в байте, 0 - сбросить, 1 -установить
set_clr(0,1,0);
// сбрасываем первый бит в маs[0]
set_clr(5,3,1);
// устанавливаем третий бит в маs[5] |
|
|
|
|
11.02.2008, 14:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Мне надо опросить два датчика DS18B20(наверно я всех уже запарил с этим датчиком,если взялся,то стараюсь до конца),создаю два масива промежуточных,один для запоминания где был конфликт другой для нахождения адреса.
Хочу сделать так: по байтам,то есть найдя первый байт адреса присваиваю младшему числу в масиве,потом следущий и т д,то есть сдвигать буду только промежуточный байт, когда ищу отдельный байт адреса.
Если не понятно будет код выложу когда напишу.
|
|
|
|
11.02.2008, 15:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Вот что типа такого,на быструю руку накидал,еще не проверял и не компилировал,может есть даже ошибки.
Код:
|
//это из главной программы
struct DS_1W
{
int addres[8]; //
int temper; /
short min; //
};
//////////////////////////////////////////////////////////
struct DS_1W *temp_1,*temp_2;
int *temp_addres[8];
int *temp_conflic[8]={0,0,0,0,0,0,0,0};
//это сам обработчик адреса,пока что для одного,но для второго хочу типа того же.Можно было и не сохранять конфликт,а просто во втором адресу сверну наоборот
//первый А0-вход,А1-управляем шиной
void search()
{
int m,n,conf,temp,error;
error=0;
temp=0;
//
reset();
command_1w(0xf0);
for(m=0;m‹8;m++)
{
for(n=0;n‹8;n++)
{
set_tris_A(0x01);
set_tris_A(0x03);
if(input_1w)
temp|=0x02;
//
delay_us(50);
//
set_tris_A(0x01);
set_tris_A(0x03);
if(input_1w)
temp|=0x01;
//
if(temp==0x03)
{
error=1
break;
}
if(temp==0) //
conf|=1;
//
set_tris_A(0x01);
if(temp&0x02)
set_tris_A(0x03);
delay_us(30);
set_tris_A(0x03);
}
temp‹‹=1;
conf‹‹=1;
}
if(error==1)
return 1;
temp_1-›addres[m]=temp;
*(temp_conflic+m)=conf;
} |
|
|
|
|
11.02.2008, 18:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Ниче не понял... вот ты анализируешь развилку - возможные варианты - 10, 01 - развилки нет - 00 - развилка, 11 - бред, нужно выходить с ошибкой. Где у тебя анализ, что куда писать ?? идет анализ - 3 и 0, а где анализ 10 и 01 ? И после этого ты ОБЯЗАН выдать то, что выбираешь - где выдача ??? По какому-то принципу устройство должно ориентироваться, по какому пути ты пошел от развилки, так ведь ?
или нет ? (с) Bill от микрочипа
|
|
|
|
12.02.2008, 02:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от urry
|
Ниче не понял... вот ты анализируешь развилку - возможные варианты - 10, 01 - развилки нет - 00 - развилка, 11 - бред, нужно выходить с ошибкой. Где у тебя анализ, что куда писать ?? идет анализ - 3 и 0, а где анализ 10 и 01 ? И после этого ты ОБЯЗАН выдать то, что выбираешь - где выдача ??? По какому-то принципу устройство должно ориентироваться, по какому пути ты пошел от развилки, так ведь ?
или нет ? (с) Bill от микрочипа
|
Почему бред когда контролер читает с шины 11,это значит или датчик не рабочий или его нет.Вот выбираем куда идти:
Код:
|
set_tris_A(0x01);
if(temp&0x02) //логическое И temp и 0b00000010
set_tris_A(0x03); //если единица выводы переведены на вход
//если не было выполнения if то вывод котролера остается как выход опуская шину к нулю
delay_us(30);
set_tris_A(0x03); |
В temp у меня сохранено два прочитаных бита с шины,первый бит истиное значение,нулевой инверсное.В порте A1 у меня 0 и когда я перевожу tris на выход он опускает шину к нулю.Идет пока что по наименьшему адресу,то есть когда был конфлик,я выставляю на шину 0.
Неправлено я сделал наверно что сдвигаю temp и conf влево.И определение второго адреса там не было.Что еще не понятно.
-- Прилагается рисунок: --
|
|
|
|
12.02.2008, 13:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Подскажите как по сылки передать указатель на структуру.Я делаю так:
структуры у меня temp_1 и temp_2
сама структура:
Код:
|
struct DS_1W
{
int addres[8];
int temper;
short min;
};
//////////////////////////////////////////////////////////
struct DS_1W temp_1,temp_2; |
из main вызываю так test=search(&temp_1,&temp_2,&temp_conflic[8]);
это вызываемая функция, заголовок:
int search(*temp_1,*temp_2,*temp_conflic)
При компиляции находит ошибку
-- Прилагается рисунок: --
|
|
|
|
12.02.2008, 14:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Так, к предыдущему посту...
Определение серийного номера 2 параллельно включенных термометров
Код:
|
out_byte(0xf0);
rd.razv=0; // та инфа, которую выдаем на развилке
find (serijn1);
reset_();
DelayBigUs(500);
out_byte(0xf0);
rd.razv=1;
find (serijn2);
и, соответственно, программа поиска серийных номеров
unsigned char find (unsigned char *mas)
{
unsigned char error, n_byt, n_bit; //
error=0; // обнуляем ошибку
for (n_byt=0;n_byt‹8;n_byt++) // номер байта в массиве
{
for(n_bit=0;n_bit‹8;n_bit++) // номер бита в байте
{
rd.bit_=read_bit(); // читаем первый бит
rd.bit_inv=read_bit(); // читаем второй бит
if (rd.bit_ != rd.bit_inv) // если они не равны, то
{ // 01 или 10
if (rd.bit_ == 1)
{
send_bit(1); // выдаем первый бит
}
else
{
send_bit(0); // выдаем первый бит
}
set_clr(mas,n_byt,n_bit,rd.bit_);
} //---------условие без развилки , окончание
else // начало - если биты равны
{
if (rd.bit_ == 1) //достаточно знать первый
{
error=1; // ошибка и на хуй с пляжа
return error;
} //--------условие -11 ошибка
else
{
send_bit(rd.razv);// выдаем условие
set_clr(mas,n_byt,n_bit,rd.razv); // пишем в серийник
} //-----условие 00 развилка
} // окончание - если биты равны
} // окончание обработки битов в байте
}// окончание обработки байтов в массиве
return error;
}
//---------- |
Проект в протеусе присоединяю
Прикрепленный файл: 5985554.rar
|
|
|
|
12.02.2008, 14:52
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
а что это за оболочка если не секрет? CCS?
|
|
|
|
12.02.2008, 15:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
За проект urry спасибо,разберу,но ведь я хочу сам написать его,спрашиваю же по мелочи,разве так научишся на готовом
|
|
|
|
12.02.2008, 15:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от stri
|
а что это за оболочка если не секрет? CCS?
|
Для написания на Си для пиков.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:03.
|
|