14.12.2011, 19:51
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Отладочные платы для STM32
Сообщение от CMaxx22
|
Попробовал инкрементировать 0xF800 получилось немного не то, что я хотел.
|
RGB 565... 5 бит красного, 6 бит зелёного и 5 бит синего...
Код:
|
#define RED 0xF800 // максимум красного
#define BLACK 0x0000 // отсутствие красного |
11111 (0x001F) сдвигаете 11 раз влево... получаете 11111000 00000000 (0xF800)...
11110 (0x001Е) - 11110000 00000000 (0xF000)...
11101 (0x001D) - 11101000 00000000 (0xE800)...
и т. д. ..
Т.е. ... каждый раз уменьшаем значение на 0x0800...
|
|
|
|
15.12.2011, 13:36
|
|
Временная регистрация
Регистрация: 20.01.2011
Адрес: Витебск
Сообщений: 38
Сказал спасибо: 6
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Отладочные платы для STM32
Извините если не в тему, Вопрос по отладочной плате STM32VLDISCOVERY. В плате есть встроенный ST-Link - внутрисхемный отладчик, можно ли с STM отладчика считать прошивку?? Нету возможности купить платку отладочную, вот думаю повторить.
|
|
|
|
15.12.2011, 13:47
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Отладочные платы для STM32
Нет... нельзя...
|
|
|
|
20.12.2011, 11:24
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
Для CMaxx22 рабочий проект с несколькими сенсорами. Номера датчиков лежат в RAM.
Вот еще один. На 10 датчиков.
Последний раз редактировалось Easyrider83; 20.12.2011 в 13:44.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
22.12.2011, 15:01
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
Спешу обрадовать. Процедура Search Rom заработала!
Основываясь на коде из комментария к статье:
http://www.maxim-ic.com/app-notes/index.mvp/id/187
Получилась такая вот процедурка. Пишет в локальный массив серийные номера и возвращает количество найденных устройств в переменную devices_found.
Проверено на 10 x DS18B20
Код:
|
unsigned char DS1822_Search_Rom (unsigned char * devices_found, GPIO_TypeDef * GPIOx, unsigned long PINx)
{
unsigned long path,next,pos; /* decision markers */
unsigned char bit,chk; /* bit values */
unsigned char cnt_bit, cnt_byte, cnt_num,tmp;
path=0; /* initial path to follow */
cnt_num=0;
do
{ /* each ROM search pass */
//(initialize the bus with a reset pulse)
tmp=One_Wire_Reset(GPIOx, PINx);
if (tmp!=One_Wire_Success) return tmp;
//(issue the 'ROM search' command)
One_Wire_Write_Byte(One_Wire_Search_ROM,GPIOx, PINx);
next=0; /* next path to follow */
pos=1; /* path bit pointer */
for (cnt_byte=0;cnt_byte!=8;cnt_byte++)
{
Search_Rom_SN[cnt_num][cnt_byte]=0;
for (cnt_bit=0;cnt_bit!=8;cnt_bit++)
{ /* each bit of the ROM value */
//(read two bits, 'bit' and 'chk', from the 1-wire bus)
bit=One_Wire_Read_Bit(GPIOx, PINx);
chk=One_Wire_Read_Bit(GPIOx, PINx);
if(!bit && !chk)
{ /* collision, both are zero */
if(pos&path) bit=1; /* if we've been here before */
else next=(path&(pos-1))|pos; /* else, new branch for next */
pos‹‹=1;
}
//(write 'bit' to the 1-wire bus)
One_Wire_Write_Bit(bit, GPIOx, PINx);
//(save this bit as part of the current ROM value)
if (bit!=0) Search_Rom_SN[cnt_num][cnt_byte]|=(1‹‹cnt_bit);
}
}
//(output the just-completed ROM value)
path=next;
cnt_num++;
}while(path);
* devices_found = cnt_num;
return One_Wire_Success;
} |
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
22.12.2011, 16:10
|
|
Частый гость
Регистрация: 05.12.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Здравствуйте,Easyrider83.
Нужно реализовать часы с термометром.
Пытаюсь подключить датчик ds18b20 к stm32vldiscovery.
Прочитал ваше обсуждение с CMaxx22.Сделал как у вас ,но почему-то ничего не вышло. Разрабатывал в CooCox.
Так подключаю датчик:
![](http://img-fotki.yandex.ru/get/4424/140007253.0/0_6b1db_d6e76611_M)
Так инициализирую порт
Код:
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); |
Буду рад любым советам.
|
|
|
|
22.12.2011, 16:26
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
bishop020, для одного датчика можно обойтись процедурой Skip ROM. В этом случае все на много проще.
Порт вы можете и вовсе не инитиалировать. Главное подключить его к генератору тактовых имульсов:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
Схема у вас верная. Посмотрите через дебаг, что возвращает процедура.
Процесс работы такой:
Резет
Команда Skip ROM
Команда Convert T
Пауза 750мс
Резет
Команда Skip ROM
Команда READ STRATCHPAD
Все. Результат у вас. Осталось разделить на 4 и будет вам температура.
Не очень правильно писать - ничего не получилось. Пишите конкретнее - что именно вызывает сложность.
|
|
|
|
22.12.2011, 16:47
|
|
Частый гость
Регистрация: 05.12.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Код:
|
One_Wire_Reset(GPIOB,GPIO_Pin_1);
One_Wire_Write_Byte(One_Wire_Skip_ROM,GPIOB,GPIO_P in_1);
One_Wire_Write_Byte(DS1822_CONVERT_T_CMD,GPIOB,GPI O_Pin_1);
Delay(750);
One_Wire_Reset(GPIOB,GPIO_Pin_1);
One_Wire_Write_Byte(DS1822_READ_STRATCHPAD_CMD,GPI OB,GPIO_Pin_1);
test = One_Wire_Read_Byte(GPIOB,GPIO_Pin_1); |
Это мне следует вызвать в main ? В ответ пришло 255.
|
|
|
|
22.12.2011, 16:53
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Отладочные платы для STM32
Сообщение от bishop020
|
Код:
|
One_Wire_Reset(GPIOB,GPIO_Pin_1);
One_Wire_Write_Byte(One_Wire_Skip_ROM,GPIOB,GPIO_P in_1);
One_Wire_Write_Byte(DS1822_CONVERT_T_CMD,GPIOB,GPI O_Pin_1);
Delay(750);
One_Wire_Reset(GPIOB,GPIO_Pin_1);
One_Wire_Write_Byte(DS1822_READ_STRATCHPAD_CMD,GPI OB,GPIO_Pin_1);
test = One_Wire_Read_Byte(GPIOB,GPIO_Pin_1); |
Это мне следует вызвать в main ? В ответ пришло 255.
|
Нет-нет. Вам нет нужды работать с файлом 1-Wire. Это стыковочный файл между процедурами работы с датчиком и процедурами работы с портом.
Смотрите файл DS1822. Там процедура DS1822_Start_Convert_Skip_ROM или как-то так, уже точно не помню. Она сама вызовет резет и вернет ошибку в случае неудачи. Потом ждите 750мс и забирайте результат. Сейчас постараюсь помочь кодом.
Код:
|
unsigned char DS1822_Start_Conversion_Skip_Rom (GPIO_TypeDef * GPIOx, unsigned long PINx)
{
unsigned char tmp;
tmp=One_Wire_Reset(GPIOx, PINx);
if (tmp!=One_Wire_Success) return tmp;
One_Wire_Write_Byte(One_Wire_Skip_ROM,GPIOx, PINx);
One_Wire_Write_Byte(DS1822_CONVERT_T_CMD,GPIOx, PINx);
if (One_Wire_Read_Byte(GPIOx, PINx)==0) return One_Wire_Success;
else return One_Wire_Device_Busy;
}
unsigned char DS1822_Read_Temp_NoCRC_Skip_Rom (unsigned int * temperatura, GPIO_TypeDef * GPIOx, unsigned long PINx)
{
unsigned char tmp;
tmp=One_Wire_Reset(GPIOx, PINx);
if (tmp!=One_Wire_Success) return tmp;
One_Wire_Write_Byte(One_Wire_Skip_ROM,GPIOx, PINx);
One_Wire_Write_Byte(DS1822_READ_STRATCHPAD_CMD,GPI Ox, PINx);
* temperatura = One_Wire_Read_Byte(GPIOx, PINx)|(One_Wire_Read_Byte(GPIOx, PINx)‹‹8);
return One_Wire_Success;
} |
Работаем так:
Код:
|
unsigned int temp=0xFF;
If (DS1822_Start_Conversion_Skip_Rom(GPIOB, GPIO_Pin_1)==One_Wire_Success)
{
delay_ms(750);
DS1822_Read_Temp_NoCRC_Skip_Rom(&temp,GPIOB, GPIO_Pin_1);
} |
Переменная temp в случае ошибки будет ровна 255 и в случае успеха в 4 раза будет превышать температуру датчика.
Последний раз редактировалось Easyrider83; 22.12.2011 в 17:07.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
22.12.2011, 17:07
|
|
Частый гость
Регистрация: 05.12.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отладочные платы для STM32
Код:
|
int main(void){
GPIO_Configuration();
while(1){
DS1822_Start_Conversion_Skip_Rom(GPIOB,GPIO_Pin_1) ;
delay_ms(750);
test = DS1822_Read_Temp_NoCRC_Skip_Rom(GPIOB,GPIO_Pin_1);
}
} |
А если так?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:04.
|
|