С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

15.04.2017, 14:42. Просмотров 180. Ответов 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 - Микроконтроллер
Добрый день, уважаемые участники форума. С тех пор, как начал изучать контроллеры, собирал устройства на AVR-контроллерах. Недавно...

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

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

Автомат подачи звонков на PIC16F628 - Микроконтроллер
Собрал данное устройство (http://rodyomostir.som.ua/691-shkolnyj- ... onkov.html). Не работает коммутатор (сигнал на выходе триггера не...

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

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

2
Humanoid
Почетный модератор
9871 / 3770 / 174
Регистрация: 12.06.2008
Сообщений: 11,183
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
Привет! Вот еще темы с ответами:

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 (полный сумбур) давно давно писал...

PIC16F84A+DS18B20 - Микроконтроллер
Собственно, такая проблема. Накатал программку для работы с датчиком DS18B20 и просимулировал в протеусе. Почти все работает, но только вся...

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


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

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

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