Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
1

Греются ds18b20, программа выводит 127 градучов на дисплей

19.04.2019, 01:49. Просмотров 762. Ответов 36
Метки нет (Все метки)

Не пойму почему не работает программный 1-Wire на 328 меге. Может я там где-то что-то с портами напутал? Диод мигает с частотой в 0.5 Гц, как положено. Дисплей по i2c пашет, часы тоже. А вот далласы не хотят работать, подозреваю, что совсем.

Текст библиотечного/хэдерного файла 1-WIRE:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#define DEVICES_ERROR  1
 
#define CMD_CONVERTTEMP    0x44
#define CMD_RSCRATCHPAD    0xbe
#define CMD_WSCRATCHPAD    0x4e
#define CMD_CPYSCRATCHPAD  0x48
#define CMD_RECEEPROM      0xb8
#define CMD_RPWRSUPPLY     0xb4
#define CMD_SEARCHROM      0xf0
#define CMD_READROM        0x33
#define CMD_MATCHROM       0x55
#define CMD_SKIPROM        0xcc
#define CMD_ALARMSEARCH    0xec
#define uint64_t long long
#define uint8_t char
#define uint16_t int
#define uint32_t long
uint8_t ONE_WIRE_DQ = PINB1;
 
void oneWireInit(uint8_t pin) {
  ONE_WIRE_DQ = pin; 
  //ONE_WIRE_PORT |= (1 << ONE_WIRE_DQ);     ИЗНАЧАЛЬНО ТУТ ЭТО БЫЛО, ВРОДЕ КАК НЕ НУЖНО?
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
}
 
/*
 * сброс
 */
uint8_t reset() {
  uint8_t response;
 
  // импульс сброса, минимум 480us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(480);
 
  // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(70);
 
  // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us.
  response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ));
  _delay_us(410);
 
  // если 0, значит есть ответ от датчика, если 1 - нет
  return response;
}
 
/*
 * отправить один бит
 */
void writeBit(uint8_t bit) {
  if (bit & 1) {
    //cli();
    // логический «0» на 1us
    ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
    ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
    _delay_us(8);
    //sei();
    ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
    _delay_us(62);
  } else {
    //cli();
    // логический «0» на 1us
    ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
    ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);
    _delay_us(62);
    ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
    //sei();
    _delay_us(8);
  }
}
 
/*
 * отправить один байт
 */
void writeByte(uint8_t byte) {
  uint8_t i = 8;
  while (i--) {
    writeBit(byte & 1);
    byte >>= 1;
  }
}
 
 
 
/*
 * получить один бит
 */
char readBit (void) {
  uint8_t bit = 0;
  //cli();
  // логический «0» на 1us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(6);
 
  // освободить линию и ждать 14us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(10);
 
  // прочитать значение
  if (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ)) {
    bit = 1;
  }
 
  // ждать 45us и вернуть значение
  //sei();
  _delay_us(55);
  return bit;
}
 
 
/*
 * получить один байт
 */
uint8_t readByte() {
  uint8_t i = 8, byte = 0;
  while (i--) {
    byte >>= 1;
    byte |= (readBit() << 7);
  }
  return byte;
}
 
/*
 * читать ROM подчиненного устройства (код 64 бита)
 */
uint64_t readRoom(void) {
  uint64_t oneWireDevice;
  if(reset() == 0) {
    writeByte(CMD_READROM);
    //  код семейства
    oneWireDevice = readByte();
    // серийный номер
    oneWireDevice |= (uint16_t)readByte()<<8 | (uint32_t)readByte()<<16 | (uint32_t)readByte()<<24 | (uint64_t)readByte()<<32 | (uint64_t)readByte()<<40 | (uint64_t)readByte()<<48;
    // CRC
    oneWireDevice |= (uint64_t)readByte()<<56;
  } else {
    return 1;
  }
  return oneWireDevice;
}
 
/*
 * Команда соответствия ROM, сопровождаемая последовательностью 
 * кода ROM на 64 бита позволяет устройству управления шиной 
 * обращаться к определенному подчиненному устройству на шине.
 */
void setDevice(uint64_t rom) {
  uint8_t i = 64;
  reset();
  writeByte(CMD_MATCHROM);
  while (i--) {
    writeBit(rom & 1);
    rom >>= 1;
  }
}
 
/*
 * провеска CRC, возвращает "0", если нет ошибок
 * и не "0", если есть ошибки
 */
uint8_t crcCheck(uint64_t data8x8bit, uint8_t len) {
  uint8_t dat, crc = 0, fb, stByte = 0;
  do {
    dat = (uint8_t) (data8x8bit >> (stByte * 8));
    for (int i = 0; i < 8; i++) {  // счетчик битов в байте
      fb = crc ^ dat;
      fb &= 1;
      crc >>= 1;
      dat >>= 1;
      if (fb == 1) {
        crc ^= 0x8c; // полином
      }
    }
    stByte++;
  } while (stByte < len); // счетчик байтов в массиве
  return crc;
}
 
 
/*
 * поиск следующего подключенного устройства
 */
uint64_t searchNextAddress(uint64_t lastAddress, uint8_t * lastDiscrepancy) {
  uint8_t searchDirection = 0;
  uint64_t newAddress = 0;
  uint8_t idBitNumber = 1;
  uint8_t lastZero = 0;
  reset();
  writeByte(CMD_SEARCHROM);
 
  while (idBitNumber < 65) {
    uint8_t idBit = readBit();
    uint8_t cmpIdBit = readBit();
 
    // id_bit = cmp_id_bit = 1
    if (idBit == 1 && cmpIdBit == 1) {
      return DEVICES_ERROR;
    } else if (idBit == 0 && cmpIdBit == 0) {
      // id_bit = cmp_id_bit = 0
      if (idBitNumber == *lastDiscrepancy) {
        searchDirection = 1;
      } else if (idBitNumber > *lastDiscrepancy) {
        searchDirection = 0;
      } else {
        if ((uint8_t) (lastAddress >> (idBitNumber - 1)) & 1) {
          searchDirection = 1;
        } else {
          searchDirection = 0;
        }
      }
      if (searchDirection == 0) {
        lastZero = idBitNumber;
      }
    } else {
      // id_bit != cmp_id_bit
      searchDirection = idBit;
    }
    newAddress |= ((uint64_t) searchDirection) << (idBitNumber - 1);
    writeBit(searchDirection);
    idBitNumber++;
  }
  *lastDiscrepancy = lastZero;
  return newAddress;
}
 
/*
 * поиск устройств
 */
void searchRom(uint64_t * roms, uint8_t * n) {
  uint64_t lastAddress = 0;
  uint8_t lastDiscrepancy = 0;
  uint8_t err = 0;
  uint8_t i = 0;
  do {
    do {
      lastAddress = searchNextAddress(lastAddress, &lastDiscrepancy);
      if(lastAddress != DEVICES_ERROR) {
        uint8_t crc = crcCheck(lastAddress, 8);
        if (crc == 0) {
          roms[i++] = lastAddress;
          err = 0;
        } else {
          err++;
        }
      } else {
        err++;
      }
      if (err > 3) {
        return;
      }
    } while (err != 0);
  } while (lastDiscrepancy != 0 && i < *n);
  *n = i;
}
 
 
 
/*
 * пропустить ROM
 */
void skipRom() {
  reset();
  writeByte(CMD_SKIPROM);
}

Текст в main:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#define F_CPU               16000000UL
//================ОТНОСИТСЯ К 1-WIRE================
#define ONE_WIRE_PORT      PORTB
#define ONE_WIRE_DDR       DDRB
#define ONE_WIRE_PIN       PINB
//==============================================
//#include <asf.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <math.h>
//#include <avr/interrupt.h>
 
//#include "сonfig.h"
 
#include "OwnWire.h"
 
#include "OLED_Function.h" //включает функции для работы дисплея
#include "drawing.h"       //включает функции по прорисовке на дисплее определенных элементов, а также массивы шрифтов
#include "function_clock.h"
 
 
 
char Rel1 = 5;//переменные для хранения вкл/выкл реле
char Rel2 = 7;
char Rel3 = 9;
char Rel4 = 11;
char Rel5 = 13;
char D_time = 4;//переменная для хранения значения день- ночь
 
char hoursH = 0;//переменные для сохранения байтов с часов и вывода на экран
char hoursL = 0;
char minutesH = 0;
char minutesL = 0;
char colon = 10;//:
char secondsL = 0;
char secondsH = 0;
 
char int_t1 = 28;//переменные для хранения уставок температур и времени в формате +/- ХХ
char int_t2 = 99;
char int_t3 = 0;
char ext_t = 0;
 
char seconds = 0; //непереработанные данные с часов
char minutes = 0;
char hours = 0;
char days = 0;
char monthes = 0;
char years = 0;
char weekday = 0;
 
char hour_transf=0;//переработанные часы
 
char int_t1H = 0;//старшие и младшие разряды температур
char int_t1L = 0;
char sign1 =0;
char int_t2H = 0;
char int_t2L = 0;
char int_t3H = 0;
char int_t3L = 0;
char ext_tH = 0;
char ext_tL = 0;
 
char temperatura1=0;//с часов
char temperatura2=99;
char temperatura3=33;
char temperatura4=00;//уличная t
 
//char h=23; //уставки для записи времени в ds3231
//char m=00;
//char s=0;
 
//============ОТНОСИТСЯ К 1-WIRE===============================
char getTemp(uint64_t ds18b20s) { // must contain 64 bit
    char temperatureL=0;
    char temperatureH=0;
    char retd = 0;
 
 
    setDevice(ds18b20s);
    writeByte(CMD_CONVERTTEMP);
 
    _delay_ms(750);
 
    setDevice(ds18b20s);
    writeByte(CMD_RSCRATCHPAD);
 
    temperatureL = readByte();
    temperatureH = readByte();
 
    retd = ((temperatureL>>4)&0b00001111)|((temperatureH<<4)&0b01110000);       //прокатит, если положительная температура, вывод целых градусов.
//!!!!!!!!!!!!!!!!!!!!!!!!тут ставил выражения типа retd = 27; - дисплей выводит 27гр.
 
return retd;}
//==========================================================
 
int main(void){
    //board_init();
    DDRC |= (1<<0)|(1<<1)|(1<<2)|(1<<3);
    PORTC &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3));
    
    
    static_elements();                      //вывод статичных элементов на экран
    //ds3231_init();                //инициализация часов ds3231
    //ds3231_write_time(h,m,s);     //запись времени в часы
    
    //====================ОТНОСИТСЯ К 1-WIRE===============
    oneWireInit(PINB1);
    
    char n = 3;
    long long roms[n];                  //нужно вместить 64 бита
    searchRom(roms, &n);
    _delay_ms(2000);
    //=================================================
    
    while (1)
    {
        //=================ОТНОСИТСЯ К 1-WIRE===============
        temperatura2 = getTemp(roms[0]);     
        temperatura3 = getTemp(roms[1]);
        temperatura4 = getTemp(roms[2]);
        _delay_ms(1000);
        
        //==============================================
        
        ds3231_read_temper(&int_t1H,&int_t1L, &sign1, &temperatura1);//передал адреса переменных, куда часы сохранят температуру и знак
        ds3231_read_time(&seconds,&minutes,&hours,&days,&monthes,&years,&weekday);
        
        minutesL = minutes&0b00001111;
        minutesH = ((minutes&0b01110000)>>4);
        hour_transf = (((hours & 0xF0) >> 4)*10)+(hours & 0x0F);
        hoursL = hours&0b00001111;
        hoursH = ((hours&0b01110000)>>4);
        secondsL = seconds&0b00001111;
        secondsH = ((seconds&0b01110000)>>4);
        
        drawing_clock(hoursH,hoursL,minutesH,minutesL,colon);
        
        temper_transform(temperatura2,&int_t2H,&int_t2L);//по указателю
        temper_transform(temperatura3,&int_t3H,&int_t3L);
        temper_transform(temperatura4,&ext_tH,&ext_tL);
        
        if(temperatura1<int_t1) {       //реле1 в зависим от t1
            Rel1=6;
            PORTC |= (1<<2);
        }
        else {
            Rel1=5;
            PORTC &= ~(1<<2);
        }
        
        drawing_temperatures(ext_tH,int_t1H,ext_tL,int_t1L,int_t2H,int_t3H,int_t2L,int_t3L);
        
        if((hour_transf>0 && hour_transf<7) || (hour_transf==23)){//в ночное время вкл бойлер на 0 пине порта C
            D_time=15;
            PORTC |= (1<<0);
            Rel5 = 14;
        }
        else {                          //днем горит солнышко и бойлер выкл
            D_time=4;
            PORTC &= ~(1<<0);
            Rel5 = 13;
        }
        
        drawing_relay (Rel1,Rel2,Rel3,Rel4,Rel5,D_time);//вывод реле и времени дня
 
 
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
    }
}
Добавлено через 18 минут
да, подлючал gnd, 5v, а между ними на пин В1 с подтяжкой к нему 5v через резистор 4, потом еще 10 кОм пробовал

Добавлено через 1 час 2 минуты
написал проверку присутствия устройств на шине, если ответа нет, то мигает диод - мигает бл.... Ответа нет. Что делать?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uint8_t reset() {
  uint8_t response=0;
 
  // импульс сброса, минимум 480us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(480);
 
  // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(65);
 
  // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us.
  response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ));
  _delay_us(250);
  if (response){
      PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
  }
  // если 0, значит есть ответ от датчика, если 1 - нет
  return response;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2019, 01:49
Ответы с готовыми решениями:

Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111
Добрый вечер! ломаю голову над тем, как в signed char помещается диапазон -128,127 ведь если 127...

Программа на С, которая вводит число типа int с клавиатуры, преобразует ее в строку (str), выводит на дисплей число и строку.
Задача направленная на усвоение следующих понятий: прототип функции; заголовок функции; тело...

написать программу которая выводит на экран первую часть таблицы кодировки символов (от 0 до 127)
написать программу которая выводит на экран первую часть таблицы кодировки символов (от 0 до 127)...

Не выводит изо дисплей
Привет всем. Ребята нужна помощь по проекту. Есть плата собрана по заказу китайцами на чипе...

Как 127.0.0.1/index.phtml сделать 127.0.0.1?
Здравствуйте, установила апач и пхп на линукс все работает, но что-то не настроено, объясните...

36
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,618
Завершенные тесты: 1
19.04.2019, 08:33 2
Цитата Сообщение от SanNikM Посмотреть сообщение
// Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
Цитата Сообщение от SanNikM Посмотреть сообщение
_delay_us(65);
как то странно
0
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
19.04.2019, 21:26  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
как то странно
ждет до 60 секунд, потом притягивает шину к "0", а мастер ждет 65 секунд на всякий случай, потом смотрит что на пине

Добавлено через 1 минуту
можно и 200 мс подождать
0
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
21.04.2019, 11:48 4
Это надо в протеусе смотреть. Подключить к этой ножке осциллограф и все станет понятно.
0
21.04.2019, 11:48
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
21.04.2019, 11:57 5
В начале каждого цикла передачи ты должен увидеть:
0
Миниатюры
Греются ds18b20, программа выводит 127 градучов на дисплей  
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
21.04.2019, 12:31 6
В цикле измерения ты должен увидеть вот такие диаграммы:
1. Инициализация
2. Ответ датчика.
3. передача команды "СС" если безадресно
4. команда - запуск подсчета "44"
5. ожидание не менее 0,3 сек
6. снова Инициализация
7. Ответ датчика.
8. передача команды "СС" если безадресно
9. команда - выдать температуру "BE"

После девятой команды твой микроконтроллер сигнал на нодке должен опускать на 3 мкс, включать ножку на вход, потом поднимать (симитировать подключение кнопки к этой ножке) И через 15-20 мкс смотришь состояние ножки.
временные диаграммы каждого этапа выкладываю. Проверь - единицы и нули в правильной последовательности у тебя идут?
0
Миниатюры
Греются ds18b20, программа выводит 127 градучов на дисплей   Греются ds18b20, программа выводит 127 градучов на дисплей   Греются ds18b20, программа выводит 127 градучов на дисплей  

tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
21.04.2019, 12:39 7
Если на ножке сигналы присутствуют, подчета не может быть из-за 2х ошибкок:
1. команды к датчику передаются зеркально (например сс: должен быть 00110011 а у тебя 11001100). осциллограф подключишь сразу эту проблему решишь.
2. просто визуально посмотри наличие данных температуры после команды BE
1
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
22.04.2019, 21:36  [ТС] 8
Такая ситуевина получилась: 1)Грелся из-за переполюсовки(вид снизу был на рисунке, я это не прочитал)
2)Мастер дает 450-650 мс подтяжку к 0, далее при резисторе в 4-6 кОм (к +5 вольт) датчики не притягивают шину к 0, при резисторе в 7-9 кОм притягивают 2-3 датчика, а если на шине один датчик, то он не справляется будто бы. При резисторе более 10 кОм на шине мастер всегда 0 читает.
Схема стандарт землю на gnd, 5v на vcc, пин мастера к среднему с подтяжкой через резистор к +5.
3)мастер подтягивает до 0 стабильно, проверил тестером(
Цитата Сообщение от tatarva87 Посмотреть сообщение
Подключить к этой ножке осциллограф
-
осциллографа нет, где-то валяется самый дешевый китайский кит, надо найти, может подойдет)
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
34
35
36
37
38
39
40
41
42
43
44
#define F_CPU 16000000UL
#include <asf.h>
#include <util/delay.h>
 
char presence = 1;
 
int main (void)
{
    
    board_init();
    while(1){   DDRC |= (1<<3);//pc3 output диод подключен для тестировки
                //DDRC &= ~(1<<0);//pb0 input пробовал это, без результатов
                //PORTC |=(1<<0);
                DDRC  |=  (1<<0);// pb0 output
                PORTC &= ~(1<<0);//pb0 = 0
                _delay_ms(640); //450 тоже пробовал
                DDRC  &= ~(1<<0);//pb0 input
                while(PINC & (1<<0)){ // это вместо задержки, потому что при задержке датчики не подтягивали вообще, пробовал от 10 до 300мс
                    PORTC |= (1<<3);
                    _delay_ms(100);
                    PORTC &= ~(1<<3);
                    _delay_ms(100);
                }
                PORTC &= ~(1<<3);
                presence = (PINC & (1<<0));//read pb0
                if (presence==0)//если датчики ответили
                {
                    while(1) 
                    {
                        PORTC |= (1<<3);
                        _delay_ms(200);
                        PORTC &= ~(1<<3);
                        _delay_ms(200);
                    }
                }
                else {//если датчики молчат
                        while(1) 
                        {
                        PORTC |= (1<<3);
                        
                        }
                }
            }
}
0
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
23.04.2019, 22:34  [ТС] 9
Короче, я тупанул, задержка в миллисекундах была. А надо в микро. Отклик получился, но пока получить температуру не удалось.
0
locm
2196 / 956 / 121
Регистрация: 28.10.2011
Сообщений: 3,199
Записей в блоге: 6
24.04.2019, 13:35 10
Цитата Сообщение от SanNikM Посмотреть сообщение
но пока получить температуру не удалось.
Может потому что
Цитата Сообщение от SanNikM Посмотреть сообщение
Греются ds18b20
Если датчик греется, вероятно он неправильно подключен (обычно путают питание и общий провод) и есть вероятность выхода из строя.

Проверьте датчик заведомо рабочей программой.
0
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
24.04.2019, 17:52 11
Цитата Сообщение от SanNikM Посмотреть сообщение
осциллографа нет, где-то валяется самый дешевый китайский кит, надо найти, может подойдет
Имел ввиду: скачиваешь программу протеус. Делаешь схему (довольно легко). Ставишь только датчик температуры и атмегу. В атмегу двойным щелчком устанавливаешь хех файл прошивки. Слева в программе протеус есть строка с инструментами. ставишь оттуда осциллограф (похож на болт). подключаешь осциллограф к ножке датчика. те диаграммы, которые я выложил - это скриншоты моего проекта с датчиком температуры во время работы в протеусе. Настоящий осциллограф не нужен.
{del}
1
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
24.04.2019, 23:39  [ТС] 12
нее, я ж вроде написал выше, что грелся из-за переполюсовки. Reset проходит, но CRC не сходится к нулю, не может в итоге адреса прочитать почему-то.

Добавлено через 1 минуту
от спасибо, давненько хотел протеус поставить, нет выхода уже, придется заняться сейчас
0
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
05.05.2019, 23:10  [ТС] 13
ничего не пойму, в протеусе у осциллографа на деление получается 20 чего-то там(мс или мкс), получается мастер понижает уровень на 160 чего-то там, а у меня в ф-ции reset задержки 500, 65 микросекунд, если я в самой функции задержки меняю, на осциллографе ничего не меняется, как так?
C
1
2
3
4
5
6
7
8
9
10
11
12
PORTC |= (1<<3);
    
    reset();
    PORTC &= ~(1<<3);
    char n = 3;
    long long roms[n];                  //нужно вместить 64 бита
    roms[0] = 0;
    roms[1] = 0;
    roms[2] = 0;
    searchRom(roms, &n);
    if (roms[0] != 0) PORTC |= (1<<3);
    _delay_ms(500);
функция:
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
uint8_t reset() {
  uint8_t response=0;
  //ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  //ONE_WIRE_PORT |= (1 << ONE_WIRE_DQ);
  // импульс сброса, минимум 480us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  
  _delay_us(500);
 
  
  // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(65);
 
  // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us.
  response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ));
   _delay_us(100);
 
if (response==0)//если датчики ответили
 {}
else {//если датчики молчат
        PORTC |= (1<<3);     
// если 0, значит есть ответ от датчика, если 1 - нет
 }
  return response;
}
0
Миниатюры
Греются ds18b20, программа выводит 127 градучов на дисплей   Греются ds18b20, программа выводит 127 градучов на дисплей  
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
05.05.2019, 23:14  [ТС] 14
Цитата Сообщение от tatarva87 Посмотреть сообщение
Имел ввиду: скачиваешь программу протеус.
и все-таки сколько там микросекунд на деление выходит?
0
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
06.05.2019, 19:32 15
Цитата Сообщение от SanNikM Посмотреть сообщение
и все-таки сколько там микросекунд на деление выходит?
на моих рисунках я подписал. в каждом квадрате - 50 микросек.

Добавлено через 2 минуты
У тебя в протеусе не та тактовая частота микроконтроллера по ходу установлена. Так же задается двойным щелщком по микроконтроллеру.

Добавлено через 6 минут
Цитата Сообщение от SanNikM Посмотреть сообщение
если я в самой функции задержки меняю, на осциллографе ничего не меняется
Если ничего не меняется - значит ты в протеус загнал другую прошивку. проверь. в протеусе под крутилкой стоит цифра - 5м - значит в квадрате 5 миллисекунд. надо чуть развертку покрутить- изменения с 60 мкс до 70 в таком режиме не увидеть. даже с 500 до 600
1
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
06.05.2019, 23:23  [ТС] 16
Цитата Сообщение от tatarva87 Посмотреть сообщение
на моих рисунках я подписал. в каждом квадрате - 50 микросек.
подписали, но это не объясняет мне сколько на деление микросекунд у меня в осциллографе? Крутилки были бы видны, я бы понял как это работает.
Цитата Сообщение от tatarva87 Посмотреть сообщение
5м - значит в квадрате 5 миллисекунд
- миллисекунд, нихрена себе)
Кварц подключил, Ну вот есть ручка Position, я ею двигаю график, при сдвиге на 1 клетку число на позиции меняется на 20, что это за единицы измерения?
0
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
06.05.2019, 23:35  [ТС] 17
вот скрин настройки кварца и контроллера
0
Миниатюры
Греются ds18b20, программа выводит 127 градучов на дисплей   Греются ds18b20, программа выводит 127 градучов на дисплей  
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
07.05.2019, 00:28  [ТС] 18
Погуглил, вот рузультат и фьюзы
0
Миниатюры
Греются ds18b20, программа выводит 127 градучов на дисплей   Греются ds18b20, программа выводит 127 градучов на дисплей  
tatarva87
117 / 35 / 11
Регистрация: 23.03.2018
Сообщений: 139
07.05.2019, 20:04 19
скорее всего после сбросов должен передаваться "СС". это 00110011. А то,что у тебя передается, начинается с 000..... Значит точно не "сс". (как выглядит "СС" можешь посмотреть выше на выложенных мной картинках)
Цитата Сообщение от tatarva87 Посмотреть сообщение
В цикле измерения ты должен увидеть вот такие диаграммы:
1. Инициализация
2. Ответ датчика.
3. передача команды "СС" если безадресно
4. команда - запуск подсчета "44"
5. ожидание не менее 0,3 сек
6. снова Инициализация
7. Ответ датчика.
8. передача команды "СС" если безадресно
9. команда - выдать температуру "BE"
10. сразу после "BE" идет получение температуры
Добавлено через 2 минуты
У тебя на картинке я вижу:
1. инициализация - вижу
2. ответ датчика - вижу.
3. потом ожидани е -примерно 160 мкс
4. начало передачи команд (но команда как я сказал не "СС"

Добавлено через 1 минуту
Но главное пункт 10:
10. сразу после "BE" идет получение температуры
надо это смотреть. есть ли у тебя в той части какие нибудь сигналы?
1
SanNikM
-15 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 45
07.05.2019, 22:12  [ТС] 20
Цитата Сообщение от tatarva87 Посмотреть сообщение
4. начало передачи команд (но команда как я сказал не "СС"
нет, там идет команда 0хF0, то есть запуск процедуры поиска адресов. Еще не могу понять в какой то период включается пин3 портаС, но в программе я не нашел этого места, и медленно-медленно 5 вольт эти снисходят к 0. Что за хрень?
Вообще порт С использую для мигания диодом, как индикатор выполнения какой-то части кода, в общем далее запуска поиска ROM не выходит, далее буду разбираться
0
07.05.2019, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2019, 22:12

Дисплей DataVision ничего не выводит
Доброго времени суток! Дисплей DataVision DV-16210 на KS0066, МК ATmega16 на 16 МГц. Библиотеку...

При делении отрицательного числа выводит неправильный ответ. Если беру числа 127 13 10, пишет переполнение
; (a+b)/c-2 _stack segment STACK dw 256 dup(0) _stack ends _data segment msgA db 10,...

не работает программа. значение выхода 127. что делать?
Ребят,написал тут прогу,а она вроде компилится,но до запуска так и не доходит,битый час голову...


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

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

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