Easyelectronics.ru

Электроника для всех
Текущее время: 17 май 2022, 22:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: STM8S и DS18B20...взлетаем?
СообщениеДобавлено: 09 май 2019, 18:07 
Только пришел

Зарегистрирован: 25 апр 2019, 01:49
Сообщения: 24
Решил прикрутить температурный датчик... Примеров обработки 1-wire в инете куча... но. В результате получил какой-то обратный отсчёт... Хотя на изменения температуры реагирует, если прикасаюсь - показания подрастают, потом опять обратный отсчёт... Вариант вывода температуры целочисленный из примера http://hex.pp.ua/stm8-1wire-ds18b20.php Как получить температуру? Да, кстати запрет прерываний закомментил т.к. через некоторое время "вешает" контроллер...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8S и DS18B20...взлетаем?
СообщениеДобавлено: 09 май 2019, 23:21 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 2024
Макросы и процедуры из рабочего старого примера под STM8S (писал пару лет назад)
посмотрите может поможет Вам.


Код:
//----------------------------------DS18B20-----------------
#define THERM_PORT GPIOA           
#define THERM_PIN  GPIO_PIN_1

#define THERM_INPUT_MODE()  THERM_PORT->DDR &= ~THERM_PIN         //сбрасываем бит - порт на чтение
#define THERM_OUTPUT_MODE() THERM_PORT->DDR |=  THERM_PIN           // выставляем бит - порт на выход
#define THERM_LOW()         THERM_PORT->ODR &= (u8)(~THERM_PIN) // лог 0 на выход
#define THERM_HIGH()        THERM_PORT->ODR |= (u8)THERM_PIN       // лог 1 на выход
#define THERM_READ()        (THERM_PORT->IDR & (u8)THERM_PIN)     // чтение пина
//------------------------------------------------------------------------
#define delay_1us()   _asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");
#define delay_15us()  x_delay(72)
#define delay_45us()  x_delay(229)
#define delay_60us()  x_delay(308)
#define delay_480us() x_delay(2535)

//--------------------------Commands-------------------
#define THERM_CMD_CONVERTTEMP    0x44
#define THERM_CMD_RSCRATCHPAD    0xBE
#define THERM_CMD_WSCRATCHPAD    0x4E
#define THERM_CMD_CPYSCRATCHPAD 0x48
#define THERM_CMD_RECEEPROM       0xB8
#define THERM_CMD_RPWRSUPPLY       0xB4
#define THERM_CMD_SEARCHROM       0xF0
#define THERM_CMD_READROM          0x33
#define THERM_CMD_MATCHROM          0x55
#define THERM_CMD_SKIPROM          0xCC
#define THERM_CMD_ALARMSEARCH    0xEC
#define THERM_DECIMAL_STEPS_12BIT 625 //.0625

typedef enum
{
  THERM_MODE_9BIT  = 0x1F,
  THERM_MODE_10BIT = 0x3F,
  THERM_MODE_11BIT = 0x5F,
  THERM_MODE_12BIT = 0x7F
} THERM_MODE;

bool therm_reset(void) //Сброс термодатчика false - Неисправность; true - Норма
{
  unsigned char i = 0xFF;

  THERM_OUTPUT_MODE();THERM_LOW();delay_480us();
  THERM_INPUT_MODE(); delay_60us();
  i = THERM_READ(); delay_480us();
  // 0 означает правильный сброс, 1 - ошибка
  return (0 == i) ? TRUE : FALSE;
}
void therm_write_bit(bool bBit) //Запись бита
{
  THERM_OUTPUT_MODE();THERM_LOW();
  delay_1us();
   if (bBit) THERM_INPUT_MODE();
    delay_60us();
  THERM_INPUT_MODE();
}
bool therm_read_bit(void) // чтение бита
{
  bool bBit = 0;
  THERM_OUTPUT_MODE();THERM_LOW();delay_1us();
  THERM_INPUT_MODE();delay_15us();
  if (THERM_READ()) bBit = TRUE;
  delay_45us();
  return bBit;
}
//---------------------------чтение байта-------------------
static unsigned char therm_read_byte(void)
{
  unsigned char i = 8;
  unsigned char n = 0;
  while (i--)
  {    // Сдвинуть на одну позицию вправо и сохранить значение бита
    n >>= 1;
    n |= (therm_read_bit() << 7);
  }
  return n;
}
//---------------------------запись байта-------------------
void therm_write_byte(unsigned char byte) 
{
  unsigned char i = 8;

  while (i--)
  {  // Записать текущий бит и сдвинуть на 1 позицию вправо
    therm_write_bit(byte & 1);
    byte >>= 1;
  } 
}
//-------------выставить режим работы-----------------------
void therm_init_mode(THERM_MODE mode)
{
  therm_reset();
  therm_write_byte(THERM_CMD_SKIPROM);
  therm_write_byte(THERM_CMD_WSCRATCHPAD);
  therm_write_byte(0);
  therm_write_byte(0);
  therm_write_byte(mode);
}
//-----------------------Поиск устройств-----------------
void read_serial(void)
{
unsigned char serial[]={0,0,0,0,0,0,0,0};
char i;
   disableInterrupts();
   therm_reset();
  therm_write_byte(THERM_CMD_READROM);
  for (i=0;i<8;i++)
              serial[i] = therm_read_byte();
       enableInterrupts();
      
}
//-----------------------чтение температуры-----------------
u8 GetTemperature(void)
{
  u8 iResult = 0;
  unsigned char temperature[2] = {0, 0};
  unsigned char digit;
  short iReadLimit;
  disableInterrupts();  // Запрет прерываний во время опроса датчика
// Сброс и сразу переход к преобразованию температуры
  iResult = therm_reset();
  therm_write_byte(THERM_CMD_SKIPROM);
  therm_write_byte(THERM_CMD_CONVERTTEMP);
// Ожидание завершения преобразования
  iReadLimit = 10;
  while (!therm_read_bit() && (--iReadLimit > 0)) { ; }
// Сброс и чтение байт температуры
  therm_reset();
  therm_write_byte(THERM_CMD_SKIPROM);
  therm_write_byte(THERM_CMD_RSCRATCHPAD); 
  temperature[0] = therm_read_byte();
  temperature[1] = therm_read_byte();
  enableInterrupts();  // Разрешить прерывания
  digit = 0;
  digit  = (  temperature[0]         >> 4 ) & 0x0F; 
  digit |= ( (temperature[1] & 0x0F) << 4 ) & 0xF0; 

  // Отрицательная температура - инвертировать и прибавить 1
  if (temperature[1] & 0x80)
  {
    iResult = ~digit;
    iResult++;
  } else
      {
    iResult = digit;
      }
   iCurrentTemp = iResult;
   return iResult;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8S и DS18B20...взлетаем?
СообщениеДобавлено: 10 май 2019, 00:48 
Только пришел

Зарегистрирован: 25 апр 2019, 01:49
Сообщения: 24
sed_alex писал(а):
Макросы и процедуры из рабочего старого примера под STM8S (писал пару лет назад)
посмотрите может поможет Вам.


Спасибо, день покувыркался - получилось. Действительно, были проблемы с таймаутами и разбором полученных байтов.
Использовал задержку функцией:

Код:
#define   _us /5

void delay_x5_us(u16 i)
{
     i = i << 4;
   for(; i; i--);
}


Обращение к функции:

Код:
delay_x5_us(10 _us);


Разбор результата такой же, как и у Вас.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB