12.11.2011, 18:21
|
|
Временная регистрация
Регистрация: 04.01.2008
Сообщений: 93
Сказал спасибо: 19
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Посмотрел, есть вопросы.
Этот файл вместо какого будет работать?
Что именно он улучшает, меньше можно будет прописывать инициализационных команд по портам и переферии?
Как его конфигурировать, какой визард использовать и где он лежит?
Не нужен ли к нему .h ?
|
|
|
|
12.11.2011, 18:47
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
Посмотрите пример работы часов реального времени. Думаю, станет понятно.
|
|
|
|
12.11.2011, 19:19
|
|
Временная регистрация
Регистрация: 04.01.2008
Сообщений: 93
Сказал спасибо: 19
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Нет, не очень понятно.
Вот это RTC-›CRL &= ~(1‹‹1); всякие спецсимволы для мня не имеют никакого смысла. Это что, ассемблер? Я к этому лучше позже вернусь, когда буду хотяб синтаксис понимать языка... Если я щас подключу эту библиотеку то никогда настроить не смогу. Кстати там почти всё закоменчено, там надо раскомментить нужные строки или как?
|
|
|
|
12.11.2011, 19:32
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Отладочные платы для STM32
CMaxx22, там нет ничего сложного .
Вам расписать по пунктам ?
Сначала левая часть
RTC-›CRL указатель позиционируется на член структуры . Другими словами слева мы получаем адрес переменной с которой будем далее производить действия .
(1‹‹1) Эта запись лишь для наглядности . Реально вычисляется константа .
1 сдвигаем на 1 бит влево. 000 0010 0x02
Далее инвертируем . 1111101 0xFD
Далее производим побитовое AND полученой константы и содержимым переменной.
Результат заносим в переменную.
Опуская указатель
CRL = CRL & (~(1‹‹1)) или CRL=CRL & 0xFD
В итоге весь смысл этих магических манипуляций сводится к сбросу бита 1 CRL .
Намного наглядней будет расписать CRL битовые поля .
В итоге все сведется к :
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 12.11.2011 в 19:46.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
12.11.2011, 19:57
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
CMaxx22,
я подправил библиотеки под ваши 5 датчиков. Количество датчиков можно указать в DS1822.h файле.
Считать уникальные номера сенсоров можно так:
Код:
|
for (cnt=0; cnt!='количество датчиков'; cnt++)
DS1822_Search_Rom(GPIOB, GPIO_Pin_1, cnt); |
ЗЫ Возможны проблемы с пересчетом CRC. Когда проверите, дайте знать. Я мог направление счета перепутать.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
13.11.2011, 09:30
|
|
Временная регистрация
Регистрация: 04.01.2008
Сообщений: 93
Сказал спасибо: 19
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Попробовал, написал в коде
u8 senum;
for (senum=0; senum!='5'; senum++)
{LCD_ShowNum(10,10,DS1822_Search_Rom(GPIOB,GPIO_Pi n_1,senum),8,16, RED);}
Постоянно кажет 3. Если на горячую отключить произвольно один из датчиков то может показать 1 или 2... И ещё программа тормозит как будто задержку секунды в 3 поставил. Похоже не работает. Я до сих пор не пойму, как функция должна распознавать кто там из датчиков ответил, они же все на одной ноге висят...
Последний раз редактировалось CMaxx22; 13.11.2011 в 09:34.
|
|
|
|
13.11.2011, 12:29
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
На счет того, как устройства понимают, кто есть кто - очень просто. Единичка на шине имеет преимущество. Все устройства делают одинаковую функцию - дергают резет, отвечают битами. Но как только один бит отпустят все, кроме одного - другие поймут, что на шине они не одни и тот, кто до конца выполнил Search Rom на следующую команду уже не отвечает. Так по одному они выпадают из списка опрашиваемых датчиков, пока не ответят все.
А возвращает она вам количество ошибок на шине. Вероятно потому, что подтяжка к плюсу слабовата. Зато теперь знаю - контрольную сумму считает верно.
Последний раз редактировалось Easyrider83; 13.11.2011 в 12:35.
|
|
|
|
13.11.2011, 13:59
|
|
Временная регистрация
Регистрация: 04.01.2008
Сообщений: 93
Сказал спасибо: 19
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Уже понятнее, спасибо! Тоесть DS1822_Search_Rom всё также записывает данные в массив DS1822_SERIAL_NUMBER только теперь у него два направления. Подскажите как считать данные столбца (или строки) массива в переменную чтобы вывести на экран? И как потом обратиться к датчику по адресу? Чтото я не нашел функции которая кушала бы адрес датчика, все как будто для одного датчика написаны. Я пока попытаюсь добиться чтобы ошибок не возвращало.
|
|
|
|
13.11.2011, 14:47
|
|
Временная регистрация
Регистрация: 04.01.2008
Сообщений: 93
Сказал спасибо: 19
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Не получается В каком случае функция приращает err_cnt ? При любой подтяжке и вставленным одним датчиком возвращает 0. Добавляешь любой другой датчик - 1, ещё один - 2, ещё один -3, добавляешь последний - всё равно 3.
Добавлено: вот этот кусочек как работает?
tmp1=One_Wire_Read_Bit(GPIOx, PIN);
if (One_Wire_Read_Bit(GPIOx, PIN)==tmp1) err_cnt++;
Прочитанный бит читается ещё раз и если совпадает, то ошибка ++ ? Но разве они и не должны совпадать? Или это уже следующий бит? Не пойму, всё время ошибки показывает, переменным резистором кручу подтяжку вплоть до замыкания на +5в, всё одно, только при замыкании выдаёт общую ошибку 65535, а так хоть 40Ком подтяжки, хоть 100Ом - всё равно три ошибки.
Последний раз редактировалось CMaxx22; 13.11.2011 в 15:14.
|
|
|
|
13.11.2011, 15:05
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
Смотрите, вот функция:
Код:
|
unsigned int DS1822_Search_Rom (GPIO_TypeDef* GPIOx, unsigned long PIN, char sens_num)
unsigned int err_cnt=0;
unsigned char cnt_bits;
unsigned char cnt_bytes;
unsigned char tmp1=0;
unsigned char tmp2=0;
if (One_Wire_Reset(GPIOx, PIN)==One_Wire_Success)
{
One_Wire_Write_Byte(One_Wire_Search_ROM,GPIOx, PIN);
for (cnt_bytes=0;cnt_bytes!=DS1822_SERIAL_NUM_SIZE;cnt _bytes++)
{
for (cnt_bits=0;cnt_bits!=8;cnt_bits++)
{
tmp1=One_Wire_Read_Bit(GPIOx, PIN);
if (One_Wire_Read_Bit(GPIOx, PIN)==tmp1) err_cnt++;
One_Wire_Write_Bit(tmp1,GPIOx, PIN);
tmp2|=tmp1‹‹cnt_bits;
}
cnt_bits=0;
DS1822_SERIAL_NUMBER[sens_num][cnt_bytes]=tmp2;
tmp2=0;
}
if (Crc8Dallas(DS1822_SERIAL_NUM_SIZE, sens_num)==0) return err_cnt;
else return One_Wire_CRC_Error;
}
else return One_Wire_Error_No_Echo;
} |
Если устройство на RESET не ответила RESPONSE, то возвращается One_Wire_Error_No_Echo.
Затем идет команда One_Wire_Search_ROM
На нее датчик отвечает битами в виде бит, не бит. Т.е. прямой и инвертированный. Если возвращает два одинаковых - значит ошибка. В этом случае на единичку увеличивается счетчик ошибок. В результате просто возвращается значение этого счетчика. Если ошибок не было, возвращается ноль.
Последний раз редактировалось Easyrider83; 13.11.2011 в 15:09.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:24.
|
|