Перейти к содержанию
    

Видать что-то с приривыниями, нужно копать туда

Так у вас в программе нету прерываний (по крайней мере в том тексте, который в первом посте темы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не пудрите мозг), да ресет подается после 44, но не между 0х44 + Delay и 0xBE

Ах, Вам оказывается надо было писать всё подробно, т.е ещё и delay не забыть написать, а то Вы путаетесь. Ну бльше не буду Вам пудрить мозг - работайте спокойно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотри тут http://eugenemcu.ru/publ/13-1-0-74

Там есть пример UART без прерываний и с прерываниями.

У меня это работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отложил юарт в сторону и попробовал напрямую работать с 1-wire. Сначала сам написал код по дрыганью ножками с указанными задержками по даташиту, в конце концов все равно получаю 0xFF, с горя решил глянуть пример работы с этим датчиком под STM32, нашел в китае один проект, перенёс себе, исправил в некоторых местах вызовы системной библы под свой МК, в этоге теже 0xFF в ответ.

Думал уж датчик голимый, но он ведь отвечает присутствием значит не палёный, хотя хз работает ли в нем сам датчик температуры. если кому интересно код работы с 1-wire из китая:

 

#include "stm32l1xx.h"
#include "PLL/inc/stm32l1xx_gpio.h"
#include "PLL/inc/stm32l1xx_usart.h"
#include "PLL/inc/stm32l1xx_rcc.h"

#define SKIP_ROM 0xCC
#define CONVERT 0x44
#define READ_TEMP 0xBE

#define DS_PORT GPIOA    
#define DS_PIN GPIO_Pin_5

#define ResetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_RESET)
#define SetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_SET)
#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_PIN) 

void delay_1ms(uint32_t ms)
{
        volatile uint32_t nCount;
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);

        nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
        for (; nCount!=0; nCount--);
}

void delay_1us(uint32_t us)
{
        SysTick->LOAD=us*9;
    SysTick->CTRL|=0x01; 
    while(!(SysTick->CTRL&(1<<16)));
    SysTick->CTRL=0x00000000; 
    SysTick->VAL=0x00000000;  
}

void GPIO_init()
{ 
      RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
      //GPIOA->BSRRL = GPIO_BSRR_BS_5;  
      //GPIOA->BSRRH = GPIO_BSRR_BS_5;    
}
void Init_ds18b20(void)     
{
    SetDQ();
    delay_1us(30);    
    ResetDQ();    
    delay_1us(470);      
    SetDQ();      
    delay_1us(30);    
    while(!GetDQ());    
    delay_1us(450);
    SetDQ();    
}


void DS18B20WriteByte( unsigned char  Dat)
{
    uint8_t i;
    for(i=8;i>0;i--)
    {
        ResetDQ(); 
        delay_1us(5);

        if(Dat&0x01)    
        SetDQ();
        else
        ResetDQ();

        delay_1us(65);
        SetDQ();
        delay_1us(2); 
        Dat>>=1; 
    }
}

unsigned char  DS18B20ReadByte(void)
{
     unsigned char  i,Dat;
    SetDQ();
    delay_1us(5);
    for(i=0;i<8;i++)
    {
        Dat>>=1;
        ResetDQ(); 
        delay_1us(5);
        SetDQ();
        delay_1us(5);

        if(GetDQ())
            Dat|=0x80;
        else
            Dat&=0x7f;
        delay_1us(65);
        SetDQ(); 
    }
    return Dat;
}

unsigned char  readtemperature(void)
{
     unsigned char  a,b;
    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(CONVERT); 
    delay_1ms(750);     

    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(READ_TEMP);    

    a=DS18B20ReadByte();    
    b=DS18B20ReadByte();

    b<<=4;
    b+=(a&=0xf0)>>4;

    return b;
}

volatile int temp[8]; 

int main()
{
   GPIO_init();
  
  volatile uint8_t value=readtemperature();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output.

На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output.

На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен?

сам пин настраивал как OD и PP и просто инициализировав GPIOA, результат один и тотже. да резистор имеется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот эта строка: в delay_1ms не глючит ?

нет, все проходит гладко, даж засекал)

 

Может частота тактирования не та ?

наврятли, задержки вычисляются относительно переменых состояний мк, поэтому какая разница какая будет частота, лишбы правильно импульсы генерил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как вы проверяли, что 1мс точно соответствует - осциллографом, или делали 10000 таких пауз и меряли секундомером?

Проверить работоспособность интерфейса можно по байтам 5 (всегда=FF), 6 (=0C) и 7 (=10) в scratcpad. Кстати, как то некорректно вы отрабатываете команду 0xBE - вместо 9 байт принимаете только 2. (Правда в даташите написано, что так можно - "The master may issue a reset to terminate reading at any time if only part of the scratchpad data is needed."

А еще причина может быть в слишком коротком промежутке при передаче "1" между освобождением линии и новым импульсом - у вас всего 2мкс. Фронт может немного затянуться и импульсы сольются в один. Этот момент должно быть видно на осциллографе - там все четко ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы.

Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы.

Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену.

у меня походу та же проблема, причем при частоте до 36мгц(включительно) работает нормально, если 48 и выше, то при чтении битов взвращается 0xFF, ресет проходит вроде нормально.

Подскажите, пожалуйста, как вы решили эту проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

До DS я пока не дошёл (в области STM32 я пока в стадии светодиодных мигалок :) , сейчас USB долблю и FSMC для разновсяких дисплеев), но, как по мне, проще поставить на датчик какой-нибудь малоногий AVR и рулить им через UART, SPI или через что хотите ...

Для авров этих библиотек термодатчиков до хрена понаписано ... И все они работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую по нескольку термостатов, градусники у них - DS18B20. Использовал в проектах на MSP430 (без RTOS) и перенёс на STM32f2xx (использую RTOS).

Т.к. градусников много, тона всех не хватит USART-ов, а на одну линию несколько датчиков посадить не могу, т.к. в процессе работы предполагается замена датчиков, термостаты настроены по разному и т.д. Поэтому каждой DS18B20 выделена отдельная нога.

Команда на преобразование даётся сразу на все градусники, протокол организован через таймерное прерывание.

Алгоритм работы разбит на элементарные функции и задержки между ними, использую прерывание по Compare для вызова этих функций. По вызову прерывания выполняется такая функция, затем в регистр Compare записывается необходимая задержка.

 

Исходники здесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...