Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Микроконтроллеры

Войти
Регистрация
Восстановить пароль
 
INTOM33
0 / 0 / 1
Регистрация: 03.05.2012
Сообщений: 45
#1

Pic16f628 + DS18B20 - Микроконтроллеры

15.04.2017, 14:42. Просмотров 153. Ответов 2
Метки нет (Все метки)

Доброго всем времени суток !
Мне надо сделать управление вентиляторами при определённых температурах, вот примерно такой код на MikroC pro PIC
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int lsb,mbs,j;
unsigned temp;
 
void main() {
TRISB = 0;//Порт В на выход
TRISA = 255;//Порт А на вход
CMCON = 7;//Отключаем компаратор для коректной работы входов PORTA
PORTB = 0;
    while(1){
    Ow_Reset(&PORTA,1);
    Ow_Write(&PORTA,1,0xCC);
    Ow_Write(&PORTA,1,0x44);
    Delay_us(120);
 
    Ow_Reset(&PORTA,1);
    Ow_Write(&PORTA,1,0xCC);
    Ow_Write(&PORTA,1,0xBE);
 
    lsb = Ow_Read(&PORTA,1);//Получить LSB температуры младшие байты
    mbs = Ow_Read(&PORTA,1);//Получить MSB температуры старшие байты
 
    if(mbs >= 3)RB7_bit = 1;//48 градусов
      else RB7_bit = 0;
    if(mbs >= 4)RB6_bit = 1;//64 градусов
      else RB6_bit = 0;
    if(mbs >= 5)RB5_bit = 1;//80 градусов
      else RB5_bit = 0;
    if(mbs >= 6)RB4_bit = 1;//96 градусов
      else RB4_bit = 0;
 
     Delay_ms(100);
   }
}
Но здесь у меня определяет температуру по старшему байту с датчика, это 48,64,80,96 а хотелось бы чтобы можно было
задать конкретную температуру например 40 или 48 градусов, пробывал так написать:
C
1
2
3
mbs <<= 8;
    mbs += lsb;
    PORTB = mbs;
не получается, может кто подскажет как это сделать ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2017, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Pic16f628 + DS18B20 (Микроконтроллеры):

Среда компиляции для МК PIC16F628 - Микроконтроллеры
Пробовал компилировать данным компилятором ошибок не возникало и после пере прошивки микроконтроллера hex файлом,полученным вышеописанным...

PIC16F628. Как реализовать ЦАП? - Микроконтроллеры
Мне нужно запрограммировать pic16f728a так что бы одна его нога давала напряжение в виде ступенек от 0 до 5 вольт, я знаю как сделать что...

PIC16F628 не хочет спать, как усыпить? - Микроконтроллеры
Пытаюсь разобраться с режимом sleep. Для примера имеется вот такая простенькая программка: include P16F628.INC org 0000h bsf...

Вывод слова на LCD 1602 в МК PIC16F628 с помощью C++ - Микроконтроллеры
добрый вечер буду очень благодарен за помощь имеется в наличии pic 16f628,lcd 1602+ponyprog Задача состоит в том, чтобы при каждом...

PIC16F628. Для чего команды movlw, movwf? - Микроконтроллеры
Вот лабораторная работа LIST P=16F628 #INCLUDE &quot;P16F628.INC&quot; __CONFIG _CP_OFF &amp; _WDT_OFF &amp; _BODEN_OFF &amp; _PWRTE_ON &amp;...

Поиск заголовочных файлов для компиляции под pic16f628/16f84/12f675 - Микроконтроллеры
Собственно нужна помощь в КОМПИЛЯЦИИ. пишу для души. pic16f628/16f84/12f675 сейчас знания = 0 (полный сумбур) давно давно писал...

2
Humanoid
Почетный модератор
9845 / 3742 / 167
Регистрация: 12.06.2008
Сообщений: 11,476
16.04.2017, 18:54 #2
Если нужны только целые числа, то можно сдвинуть на 4 бита... т.е. в mbs содержаться 8 старших бит от значения, а в lsb - 8 младших бит. Но что бы получить температуру, нужно значение разделить на 16 (сдвинуть вправо на 4 бита).
Действия таковы:
C
1
2
3
mbs <<= 4;  // 8 бит данных сдвигаются влево: 0000 xxxx xxxx 0000 (на место младших 4 бит потом запишем данные из lsb)
lsb >>= 4; // 8 бит данных сдвигаются вправо и остаются только 4 бита... 0000 0000 0000 xxxx (потерявшиеся 4 бита - это дробная часть, которую мы будем игнорировать)
mbs |= lsb; // теперь в mbs хранится значение температуры: 0000 xxxx xxxx xxxx (биты 0-3 - это от lsb, а биты 4-11 - от mbs)
Но это будет работать только при плюсовой температуре... для минусовой надо старшие биты выставлять:
C
1
2
if ((mbs >> 11) & 1)  // если старший бит значения температуры = 1 (отрицательное число)
    mbs |= 0xF000;    // то надо забить единицами старшие биты 16-битного int, что бы PIC понимал, что это именно отрицательное число
Так же тут идёт округление до меньшего целого значения температуры. Что бы округлять до ближайшего (например 35.6 что бы превратилось в 36 градусов), нужно перед сдвигом lsb увеличить этот lsb на 0.5 градуса.
C
1
lsb += 0x8;
0
INTOM33
0 / 0 / 1
Регистрация: 03.05.2012
Сообщений: 45
17.04.2017, 10:10  [ТС] #3
Большое Спасибо все получилось !!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2017, 10:10
Привет! Вот еще темы с ответами:

Шина 1-Wire и термометр DS18B20 - Микроконтроллеры
Ребята код начал ругаться на этом месте uint8_t one_wire_read_bit() { uint8_t bit = 0; GPIOA-&gt;ODR = 0; delay(80); ...

Получить серийники 4-х датчиков DS18B20 на шине 1-Wire - Микроконтроллеры
Интересует вопрос как получить адреса 4-х устройств?

Пример в CodeVisAVR на DS18B20 - AVR
Всем добрый день! Прошу высказать мнение о работоспособности одной фирменной программы. В программе-среде CodeVisAVR в папке...

Опрос DS18B20 (ATmega328P, Algorithm Builder) - AVR
Добрый день. Срочно нужно сделать датчик температуры. За основу взял DS18B20 и Arduino nano (ATmega328P). У меня уже была готовая программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru