реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM32F100C6T6 и 1-wire, не отладить в IAR EWARM v6.30.4
maksimp
сообщение Jan 23 2012, 08:45
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(ivainc1789 @ Jan 23 2012, 12:05) *
Именно так я ее и проверял - работает нормально и в пределах допусков! Но после такой задержки прочитать заранее известное состояние шины 1-wire почему-то не получается (см. main.c из первого поста) и это тревожит...

Если попробовать примерно так, убрав непонятные (некоторым, например мне) функции, вывести результат чтения на другую ногу.
Здесь ноги 12 и 13 порта B индицируют работу задержки и результат чтения:
Код
Work:
GPIOC->BSRR=GPIO_BSRR_BR15;
Delay1wire(500*us);
__istate_t s = __get_interrupt_state();
__disable_interrupt();
GPIOC->BSRR=GPIO_BSRR_BS15;
// через 35us DS18B20 удерживает DQ=0 100us
GPIOB->BSRR=GPIO_BSRR_BS12;
Delay1wire(80*us);
GPIOB->BSRR=GPIO_BSRR_BR12;
tmp=(GPIOC->IDR >> 15)&1;
GPIOB->BSRR=tmp?GPIO_BSRR_BS13:GPIO_BSRR_BR13;
GPIOB->BSRR=GPIO_BSRR_BS12;
Delay1wire(500*us);
GPIOB->BSRR=GPIO_BSRR_BR12;
__set_interrupt_state(s);
goto Work;

Или вот так:
Код
Work:
GPIOC->BSRR=GPIO_BSRR_BR15;
Delay1wire(500*us);
__istate_t s = __get_interrupt_state();
__disable_interrupt();
GPIOC->BSRR=GPIO_BSRR_BS15;
// через 35us DS18B20 удерживает DQ=0 100us
int i;
for(i=0;i<20;i++)
{
GPIOB->BSRR=GPIO_BSRR_BS12;
Delay1wire(8*us);
GPIOB->BSRR=GPIO_BSRR_BR12;
GPIOB->BSRR=GPIO_BSRR_BS13;
Delay1wire(1*us);
GPIOB->BSRR=GPIO_BSRR_BR13;
Delay1wire(1*us);
tmp=(GPIOC->IDR >> 15)&1;
GPIOB->BSRR=tmp?GPIO_BSRR_BS13:GPIO_BSRR_BR13;
}
GPIOB->BSRR=GPIO_BSRR_BS12;
Delay1wire(500*us);
GPIOB->BSRR=GPIO_BSRR_BR12;
__set_interrupt_state(s);
goto Work;

Здесь на ноге 13 порта B увидим 20 пичков через 10 мкс, и после каждого - уровень прочтённый с шины. (и отладочные ноги нужно заранее сконфигурировать на выход)

Сообщение отредактировал maksimp - Jan 23 2012, 13:08
Go to the top of the page
 
+Quote Post
lexanet
сообщение Jan 23 2012, 10:06
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 6-04-11
Пользователь №: 64 159



Цитата(ivainc1789 @ Jan 23 2012, 11:32) *
а если частота тактирования Fhclk изменится (в другом проекте)??? Опять настраивать?
Конечно, так делать не стоит. Любая помеха на шине будет воспринята как присутствие девайса. Хотя потом его ROM код все равно не прочитается )))) ....


Нет, никакого проекта, все это исключительно для проверки, так сказать, первого подхода в жизни к 1-wire.


Блин, сложности какие то с простейшим датчиком. Вся работа с ним должна реализовываться начальными знаниями. Достаточно человеку уметь зажечь/погасить светодиод и прочитать состояние пина и все, ничего более.
Вот рабочий код LPC1768 (рабочий - значит работает):
Код
char ow_reset (void)
{
    char ret = 10;

    LPC_GPIO2->FIODIR |= (1<<1); //Pin 2.1 - OUT
    LPC_GPIO2->FIOSET |= (1<<1); //Pi 2.1 - "1"
    delay_us (1);                    
    LPC_GPIO2->FIOCLR |= (1<<1); //Pin 2.1 - "0"                              
    delay_us (480);
    LPC_GPIO2->FIODIR &= ~(1<<1); //Pin 2.1 - IN
    delay_us (80);
    if (LPC_GPIO2->FIOPIN & 2)          //Если через 80 мкс все еще на пине "1", датчика нет
    {
        ret = 0;
    }
    else
    {
        ret = 1;
    }
    delay_us (400);                          //Ждем окончания тайм-слота
    return ret;
}


то же код на stm32f100 - не работает:

Код
#define Set_PortC_Pin_6_output ((GPIOC->CRL |= 0x3000000)|(GPIOC->CRL &= ~0xC000000))
#define Set_PortC_Pin_6_input ((GPIOC->CRL &= ~0x3000000)|(GPIOC->CRL |= 0x4000000))

char ow_reset (void)
{
    char ret = 10;

    Set_PortC_Pin_6_output; // OUT
    GPIOC->BSRR = GPIO_BSRR_BS6; // "1"
    delay_us (1);                    
    GPIOC->BSRR = GPIO_BSRR_BR6; // "0"                              
    delay_us (480);
    Set_PortC_Pin_6_input; // IN
    delay_us (80);
    if (GPIOC->IDR & GPIO_IDR_IDR6)          //Если через 80 мкс все еще на пине "1", датчика нет
    {
        ret = 0;
    }
    else
    {
        ret = 1;
    }
    delay_us (400);                          //Ждем окончания тайм-слота
    return ret;
}


В чем же проблема ? Какие еще тайные знания нужны ? Может в stm не тот режим пина ?
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 23 2012, 13:04
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(lexanet @ Jan 23 2012, 14:06) *
то же код на stm32f100 - не работает:
В чем же проблема ? Какие еще тайные знания нужны ? Может в stm не тот режим пина ?

Тактирование разрешено?
Код
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;

Тоже, как я выше писал, добавьте дрыгание ещё одной ногой и осциллографом таким образом проверьте величины задержек.
Go to the top of the page
 
+Quote Post
lexanet
сообщение Jan 23 2012, 13:33
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 6-04-11
Пользователь №: 64 159



Цитата(maksimp @ Jan 23 2012, 16:04) *
Тактирование разрешено?
Код
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;

Тоже, как я выше писал, добавьте дрыгание ещё одной ногой и осциллографом таким образом проверьте величины задержек.


Тактирование разрешено. На том же порту PORTС.8 и PORTC.9 светодиоды, один мыргает раз в секунду (от таймера, позволяет приблизительно проверить его), второй должен включиться, когда наконец то обнаружится ответ о датчика. В настройке таймера прескалер переменный, в главном цикле он меняется от 10 до 50 с шагом 1. Также переменная задержка в функции резета между 0 и отпусканием шины (200 - 1000 мкс, шаг 25 мкс). В общем, ответ ОБЯЗАН быть, при таких условиях поиска. А нет его, скорей всего, изза каких то тонкостей, которых я не знаю (не тот режим пина (общего назначения, общего назначения с открытым стоком или вход не в том режиме или во время переключения с выхода на вход что то проскакивает, что сносит башню датчику)).
Во всех виденных мною рабочих прог (по словам создателей), настройка пинов происходит с помощью библиотечных функций:
Код
void oow_pin_out(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void oow_pin_in(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
}


Может в GPIO_Init() есть какой то секрет ?

Сообщение отредактировал lexanet - Jan 23 2012, 13:41
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 23 2012, 18:33
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(lexanet @ Jan 23 2012, 17:33) *
Тактирование разрешено. На том же порту PORTС.8 и PORTC.9 светодиоды, один мыргает раз в секунду

Уберите мигание PORTС.8 там где оно у вас сейчас и приделайте его прямо сюда:
Код
    GPIOC->BSRR = GPIO_BSRR_BS6; // "1"
    GPIOC->BSRR = GPIO_BSRR_BS8; // +++
    delay_us (1);                    
    GPIOC->BSRR = GPIO_BSRR_BR8; // +++
    GPIOC->BSRR = GPIO_BSRR_BR6; // "0"                              
    delay_us (480);
    Set_PortC_Pin_6_input; // IN
    GPIOC->BSRR = GPIO_BSRR_BS8; // +++
    delay_us (80);
    GPIOC->BSRR = GPIO_BSRR_BR8; // +++

И проверьте осциллографом что на PORTС.6 и на PORTС.8.
Подтяжка вверх на PORTС.6 у вас резистором к +питания на плате? Если нет то её нужно включить у процессора, сейчас она выключена.
Цитата(lexanet @ Jan 23 2012, 17:33) *
Может в GPIO_Init() есть какой то секрет ?

Вряд ли. У меня через GPIOC->CRL работает.

Сообщение отредактировал maksimp - Jan 23 2012, 18:41
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jan 23 2012, 19:26
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Провел серию экспериментов как вы советовали... В полной растерянности...
Код
//  генератор  прецизионных  таймингов  для  1wire (Tmax[sec]=2^24/Fhclk)
__INLINE void Delay1wire(unsigned int Ticks){
  SysTick->CTRL  =  0x00000004;//  конфиг  таймера ,  таймер  выключен
  SysTick->LOAD  =  Ticks - 1;
  SysTick->CTRL  =  0x00000005;//  запуск  таймера
while(!BITCHK(SysTick->CTRL,16));
  SysTick->CTRL  =  0x00000004;//  конфиг  таймера ,  таймер  выключен
}

//  пин  C15  настроен  как  GPIO_Mode_Out_OD ( эмуляция  1-wire)
//  к  пину  C15  припаян  внешний  pull-up 5k с датчиком DS18B20
//  пин  A11  тестовый ,  настроен  как  GPIO_Mode_Out_PP
Work:
  GPIOC->BRR=GPIO_BRR_BR15;//  сбросить  С 15
  Delay1wire(500*us);
  __istate_t s = __get_interrupt_state();
  __disable_interrupt();
  GPIOC->BSRR=GPIO_BSRR_BS15;//  установить  C15  
  Delay1wire(80*us);
  tmp=(GPIOC->IDR >> 15)&1;
  __set_interrupt_state(s);
  GPIOA->BSRR=tmp?GPIO_BSRR_BS11:GPIO_BSRR_BR11;//  тестовый  пин(при подкл исправном датчике) всегда  = 1 = ошибка !!!!!!
  Delay1wire(420*us);
  goto Work;

Код был компилирован с макс оптимизацией в IAR 6.30.4. При откл датчике на шине прямоугольные импульсы 600us/400us а не 500us/500us как хочется ожидать...
Go to the top of the page
 
+Quote Post
lexanet
сообщение Jan 24 2012, 02:59
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 6-04-11
Пользователь №: 64 159



Цитата(maksimp @ Jan 23 2012, 21:33) *
Уберите мигание PORTС.8 там где оно у вас сейчас и приделайте его прямо сюда:
Код
    GPIOC->BSRR = GPIO_BSRR_BS6; // "1"
    GPIOC->BSRR = GPIO_BSRR_BS8; // +++
    delay_us (1);                    
    GPIOC->BSRR = GPIO_BSRR_BR8; // +++
    GPIOC->BSRR = GPIO_BSRR_BR6; // "0"                              
    delay_us (480);
    Set_PortC_Pin_6_input; // IN
    GPIOC->BSRR = GPIO_BSRR_BS8; // +++
    delay_us (80);
    GPIOC->BSRR = GPIO_BSRR_BR8; // +++

И проверьте осциллографом что на PORTС.6 и на PORTС.8.
Подтяжка вверх на PORTС.6 у вас резистором к +питания на плате? Если нет то её нужно включить у процессора, сейчас она выключена.

Вряд ли. У меня через GPIOC->CRL работает.


Подтяжка есть, осцила нет. Да и что именно проверять им ? Единица на пин выводится обнозначно, а точность delay_us (1) на данном этапе не критична, delay_us (1000000) - на глаз секунда и этого достаточно. Дайте, если не трудно, свою настройку пина и функции резета. Может я что то упускаю из вида.
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 24 2012, 05:32
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(lexanet @ Jan 24 2012, 06:59) *
Подтяжка есть, осцила нет. Да и что именно проверять им ?

Осциллограф - критически важный прибор для наладки таких устройств. Проверять - что именно там у вас происходит, форму сигналов посмотреть. Иногда совешенно неясная проблема становится очевидной.
Осциллограф можно сделать из самого контроллера. Настроить АЦП чтобы через DMA в буфер складывал отсчёты. Как буфер заполнится - по UART его весь в компьютер и можно смотреть что там происходило.
Цитата(lexanet @ Jan 24 2012, 06:59) *
а точность delay_us (1) на данном этапе не критична, delay_us (1000000) - на глаз секунда и этого достаточно.

Точность не критична лишь до определённого предела. А если delay_us (1) даёт задержку на 900 микросекунд например?
Цитата(lexanet @ Jan 24 2012, 06:59) *
Дайте, если не трудно, свою настройку пина и функции резета. Может я что то упускаю из вида.

С такими и подобными микросхемами не работал, такой функции дать не могу.
Настройку провожу например так:
Код
// 0 = аналог; 4 = вход; 8 = вход с подтяжкой
// норм выход двухтактн:   2 = вых 2 МГц;   1 = вых 10 МГц;   3 = вых 50 МГц;
// норм выход октр колл:   6 = вых 2 МГц;   5 = вых 10 МГц;   7 = вых 50 МГц;
// спец выход двухтактн: 0xa = вых 2 МГц;   9 = вых 10 МГц; 0xb = вых 50 МГц;
// спец выход октр колл: 0xe = вых 2 МГц; 0xd = вых 10 МГц; 0xf = вых 50 МГц;

GPIOA->CRL=0x00220000; // PA7...PA0
GPIOA->CRH=0x44488466; // PA15...PA8

и далее для остальных портов.
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jan 24 2012, 08:19
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Уже здесь возникают вопросы... Такой цикл выдает на пин С15 импульс/пауза 600us/400us, а не 500us/500us. И это при макс оптимизации. Стоит только вместо двух последних вызовов Delay1wire вставить один Delay1wire(500*us) и все становится нормально: 500us/500us. Почему такой эффект, не пойму? Расходы на вызов/возврат Delay1wire не могут/не должны составлять 100us... cranky.gif

Цитата
// пин C15 настроен как GPIO_Mode_Out_OD ( эмуляция 1-wire)
// к пину C15 припаян внешний pull-up 5k с датчиком DS18B20
Work:
GPIOC->BRR=GPIO_BRR_BR15;// сбросить С15
Delay1wire(500*us);
GPIOC->BSRR=GPIO_BSRR_BS15;// установить C15
Delay1wire(80*us);
Delay1wire(420*us);
goto Work;
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 24 2012, 09:00
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(ivainc1789 @ Jan 24 2012, 12:19) *
Такой цикл выдает на пин С15 импульс/пауза 600us/400us, а не 500us/500us. И это при макс оптимизации. Стоит только вместо двух последних вызовов Delay1wire вставить один Delay1wire(500*us) и все становится нормально: 500us/500us. Почему такой эффект, не пойму?

Не знаю но подозреваю на эффекты с регистром SysTick->CTRL .
Если так попробовать:
Код
SysTick->CTRL = 0x00000005;// запуск таймера заранее
SysTick->LOAD = 0xffffff;

И собственно задержка
Код
// генератор прецизионных таймингов для 1wire (Tmax[sec]=2^23/Fhclk)
static __INLINE void Delay1wire(unsigned int Ticks)
{
unsigned int x = SysTick->VAL - Ticks; // конечное значение таймера
while((x - SysTick->VAL)&0x800000); // пока текущее не уменьшится до конечного
// если SysTick->VAL > x то при вычитании происходит переполнение
// и старшие разряды становятся равными 1, что проверяется с помощью &0x800000
// такой способ сравнения нужен чтобы правильно работать когда
// таймер в счёте переходит с 0 на 0xffffff
}

Прерывания разрешены или запрещены? Если разрешены то от таймера есть прерывания? С какой частотой?

Сообщение отредактировал maksimp - Jan 24 2012, 17:01
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jan 24 2012, 11:14
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата
Прерывания разрешены или запрещены? Если разрешены то от таймера есть прерывания? С какой частотой?

Все прерывания запрещены еще в SystemInit().

Цитата
Код
while((x - SysTick->LOAD)&0x800000); // пока текущее не уменьшится до конечного

тут не SysTick->VAL должен быть?
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 24 2012, 12:34
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(ivainc1789 @ Jan 24 2012, 15:14) *
тут не SysTick->VAL должен быть?

Точно!
И в вашем исходном варианте тоже SysTick->VAL нужно вместо LOAD.
(отредактировал своё сообщение выше, исправив LOAD на VAL, чтобы заведомо неверный код не попался кому-нибудь и не стоил потраченного зря времени)

Сообщение отредактировал maksimp - Jan 24 2012, 12:43
Go to the top of the page
 
+Quote Post
shista
сообщение Jan 24 2012, 17:39
Сообщение #28





Группа: Участник
Сообщений: 12
Регистрация: 15-07-09
Пользователь №: 51 296



Почитал дискусиию и решил проверить действительно ли такие траблы с дискавери. Достал с полки запылившуюся плату (не разу даже не включал до этого), подключил к ней датчик, нашел месяц назад модифицированный под использование с ds18b20 стандартный кейловский проект для stm32f103, скопировал его в новую папку, указал в настройках проекта нужный чип, указал отладку st-link, поправил константу тактовой частоты в хедере, содержащем код задержек (написан по мотивам winavr delay.h), скомпилил и запустил в отладке (лениво было искать ttl-usart->usb переходник). На выходе в переменной вижу искомую температуру. Погрел рукой датчик - температура меняется без проблем. Либу писал ещё для atmega64 - без проблем работает на 8 МГц. С небольшими доработками (в основном касаемо GPIO) вставлял либу в проекты для LPC2368, LPC1768, LPC1343, LPC1114 (кроме того пришлось поменять значение с 3e6 на 4е6 в процедурах задержки на микросекунды). Легко прикрутилась к stm32f103 и как оказалось к stm32f100. Проект в Keil прилагаю. Если датчик не обнаружен или проблемы при сравнении CRC, то возвращает -128 как ошибку (такую температуру реальный датчик всё равно не возвращает). Кому интересно - пользуйтесь на здоровье.
Прикрепленные файлы
Прикрепленный файл  Blinky_3.rar ( 298 килобайт ) Кол-во скачиваний: 238
 
Go to the top of the page
 
+Quote Post
lexanet
сообщение Jan 25 2012, 04:55
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 6-04-11
Пользователь №: 64 159



Цитата(shista @ Jan 24 2012, 20:39) *
Кому интересно - пользуйтесь на здоровье.


Спасибо, ЧЕЛОВЕЧИЩЕ !!! Взял у Вас функции _delay_us(), _delay_ms(), _delay_loop(), перенес в свой проект и все заработало sm.gif Еще раз, огромное спасибо.
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jan 25 2012, 07:05
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Код
Почитал дискусиию и решил проверить действительно ли такие траблы...

Если вы внимательно читали, то понимаете, что суть темы не в том, чтобы подключить датчик DS18B20 к STM32F100 как таковой - он у меня уже давно работает именно на софтовых задержках, реализации которых в принципе достаточно для большинства проектов. Я бы даже сказал, что нет необходимости эту реализацию задержек как-то переделывать, т. к. на время работы с шиной 1-wire все равно придется приостанавливать большинство других софтверных задач, т. к. времянка слишком жесткая...
Мое неудачное портирование исходников 1-wire на STM32F100 было связано с попыткой использования для счета задержек systick таймера ядра. Опять же, я осознаю, что это излишне и не нужно - по сути ничего не дает, но поведение этого таймера на счете "мелких" задержек вызвало мое непонимание его работы. Вот это и напрягает... Я был бы признателен тому, кто смог бы выделить время и проверить, в чем тут может быть проблема...
Повторюсь, в чем проблема... После счета задержки на основе этого таймера состояние шины 1-wire не может быть достоверно прочитано в рамках, например, сброса/проверки этой шины:
Код
//  генератор  прецизионных  таймингов  для  1wire (Tmax[sec]=2^24/Fhclk)
__INLINE void Delay1wire(unsigned int Ticks){
  SysTick->LOAD  =  Ticks - 1;// возможна подстройка для точности
  SysTick->CTRL  =  0x00000005;//  запуск  таймера
  while(!BITCHK(SysTick->CTRL,SysTick_CTRL_COUNTFLAG));// пока не установится COUNTFLAG
  SysTick->CTRL  =  0x00000004;// останов таймера
}

//  пин  C15  настроен  как  GPIO_Mode_Out_OD ( эмуляция  1-wire)
//  к  пину  C15  припаян  внешний  pull-up 5k с датчиком DS18B20
//  пин  A11  тестовый ,  настроен  как  GPIO_Mode_Out_PP
Work:
  GPIOC->BRR=GPIO_BRR_BR15;//  сбросить  С15 (шина в состояние "0")
  Delay1wire(500*us);
  __istate_t s = __get_interrupt_state();
  __disable_interrupt();
  GPIOC->BSRR=GPIO_BSRR_BS15;//  установить  C15  (шина в состояние "1")
  Delay1wire(80*us);
  tmp=(GPIOC->IDR >> 15)&1;// получить текущее состояние шины(должен быть "0" при испр датчике
  __set_interrupt_state(s);
  GPIOA->BSRR=tmp?GPIO_BSRR_BS11:GPIO_BSRR_BR11;//  тестовый  пин(при подкл исправном датчике) всегда  = 1 = ошибка !!!!!!
  Delay1wire(420*us);
  goto Work;

В вышеприведенном коде не удается правильно прочитать состояние шины. Далее, для поиска возможной ошибки, я упростил процедуру максимально:
Код
//  пин  C15  настроен  как  GPIO_Mode_Out_OD ( эмуляция  1-wire)
//  к  пину  C15  припаян  внешний  pull-up 5k с датчиком DS18B20
Work:
  GPIOC->BRR=GPIO_BRR_BR15;//  сбросить  С15
  Delay1wire(500*us);
  GPIOC->BSRR=GPIO_BSRR_BS15;//  установить  C15  
  Delay1wire(80*us);
  Delay1wire(420*us);
  goto Work;

По идее, этот код должен давать на С15 сигнал импульс/пауза 500us/500us. У меня он почему-то дает 600us/400us. Естественно все прерывания запрещены.
Хотелось бы понять причину такого несоответствия... Возможно, это поможет понять почему исходно не читается правильно состояние шины...
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016