ds18b20 code added
This commit is contained in:
parent
b1c0b0292b
commit
275e012695
5 changed files with 148 additions and 2 deletions
|
@ -3,7 +3,9 @@
|
|||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-volatile")
|
||||
|
||||
# Initialise pico_sdk from installed location
|
||||
# (note this can come from environment, CMake cache etc)
|
||||
|
@ -19,7 +21,7 @@ pico_sdk_init()
|
|||
|
||||
# Add executable. Default name is the project name, version 0.1
|
||||
|
||||
add_executable(gbmanager gbmanager.cpp lcd.cpp)
|
||||
add_executable(gbmanager gbmanager.cpp lcd.cpp ds18b20.cpp)
|
||||
|
||||
pico_set_program_name(gbmanager "gbmanager")
|
||||
pico_set_program_version(gbmanager "0.1")
|
||||
|
@ -27,12 +29,16 @@ pico_set_program_version(gbmanager "0.1")
|
|||
pico_enable_stdio_uart(gbmanager 1)
|
||||
pico_enable_stdio_usb(gbmanager 0)
|
||||
|
||||
pico_generate_pio_header(gbmanager ${CMAKE_CURRENT_LIST_DIR}/ds18b20.pio)
|
||||
|
||||
# Add the standard library to the build
|
||||
target_link_libraries(gbmanager pico_stdlib)
|
||||
|
||||
# Add any user requested libraries
|
||||
target_link_libraries(gbmanager
|
||||
hardware_i2c
|
||||
hardware_gpio
|
||||
hardware_pio
|
||||
)
|
||||
|
||||
pico_add_extra_outputs(gbmanager)
|
||||
|
|
72
ds18b20.cpp
Normal file
72
ds18b20.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include "ds18b20.h"
|
||||
|
||||
DS18B20::DS18B20(PIO pio, uint8_t gpio) : pio{pio}, gpio{gpio} {
|
||||
uint offset = pio_add_program(pio, &ds18b20_program);
|
||||
stateMachineIndex = pio_claim_unused_sm(pio, true);
|
||||
pio_gpio_init(pio, gpio);
|
||||
pio_sm_config c = ds18b20_program_get_default_config(offset);
|
||||
sm_config_set_clkdiv_int_frac(&c, 255, 0);
|
||||
sm_config_set_set_pins(&c, gpio, 1);
|
||||
sm_config_set_out_pins(&c, gpio, 1);
|
||||
sm_config_set_in_pins(&c, gpio);
|
||||
sm_config_set_in_shift(&c, true, true, 8);
|
||||
pio_sm_init(pio0, stateMachineIndex, offset, &c);
|
||||
pio_sm_set_enabled(pio0, stateMachineIndex, true);
|
||||
}
|
||||
|
||||
void DS18B20::writeBytes(uint8_t bytes[], int len) {
|
||||
pio_sm_put_blocking(pio, stateMachineIndex, 250);
|
||||
pio_sm_put_blocking(pio, stateMachineIndex, len - 1);
|
||||
for (int i = 0; i < len; i++) {
|
||||
pio_sm_put_blocking(pio, stateMachineIndex, bytes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DS18B20::readBytes(uint8_t bytes[], int len) {
|
||||
pio_sm_put_blocking(pio, stateMachineIndex, 0);
|
||||
pio_sm_put_blocking(pio, stateMachineIndex, len - 1);
|
||||
for (int i = 0; i < len; i++) {
|
||||
bytes[i] = pio_sm_get_blocking(pio, stateMachineIndex) >> 24;
|
||||
}
|
||||
}
|
||||
|
||||
void DS18B20::convert() {
|
||||
uint8_t d[2] = {0xCC, 0x44};
|
||||
writeBytes(d, 2);
|
||||
}
|
||||
|
||||
uint8_t DS18B20::crc8(uint8_t *data, uint8_t len) {
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
uint8_t temp;
|
||||
uint8_t databyte;
|
||||
uint8_t crc = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
databyte = data[i];
|
||||
for (j = 0; j < 8; j++) {
|
||||
temp = (crc ^ databyte) & 0x01;
|
||||
crc >>= 1;
|
||||
if (temp)
|
||||
crc ^= 0x8C;
|
||||
databyte >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
float DS18B20::getTemperature() {
|
||||
uint8_t d[2] = {0xCC, 0xBE};
|
||||
writeBytes(d, 2);
|
||||
uint8_t data[9];
|
||||
readBytes(data, 9);
|
||||
uint8_t crc = crc8(data, 9);
|
||||
if (crc != 0)
|
||||
return -2000;
|
||||
int t1 = data[0];
|
||||
int t2 = data[1];
|
||||
int16_t temp1 = (t2 << 8 | t1);
|
||||
volatile float temp = (float)temp1 / 16;
|
||||
return temp;
|
||||
}
|
23
ds18b20.h
Normal file
23
ds18b20.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef DS18B20_H
|
||||
#define DS18B20_H
|
||||
|
||||
#include "ds18b20.pio.h"
|
||||
#include "hardware/gpio.h"
|
||||
#include "pico/stdlib.h"
|
||||
|
||||
class DS18B20 {
|
||||
public:
|
||||
DS18B20(PIO pio, uint8_t gpio);
|
||||
float getTemperature();
|
||||
void convert();
|
||||
|
||||
private:
|
||||
uint8_t crc8(uint8_t *data, uint8_t len);
|
||||
void writeBytes(uint8_t bytes[], int len);
|
||||
void readBytes(uint8_t bytes[], int len);
|
||||
PIO pio;
|
||||
uint8_t gpio;
|
||||
uint stateMachineIndex;
|
||||
};
|
||||
|
||||
#endif
|
44
ds18b20.pio
Normal file
44
ds18b20.pio
Normal file
|
@ -0,0 +1,44 @@
|
|||
|
||||
.program ds18b20
|
||||
.wrap_target
|
||||
again:
|
||||
pull block
|
||||
mov x, osr
|
||||
jmp !x, read
|
||||
|
||||
write: set pindirs, 1
|
||||
set pins, 0
|
||||
loop1:
|
||||
jmp x--,loop1
|
||||
set pindirs, 0 [31]
|
||||
wait 1 pin 0 [31]
|
||||
|
||||
pull block
|
||||
mov x, osr
|
||||
bytes1:
|
||||
pull block
|
||||
set y, 7
|
||||
set pindirs, 1
|
||||
bit1:
|
||||
set pins, 0 [1]
|
||||
out pins,1 [31]
|
||||
set pins, 1 [20]
|
||||
jmp y--,bit1
|
||||
jmp x--,bytes1
|
||||
|
||||
set pindirs, 0 [31]
|
||||
jmp again
|
||||
|
||||
read:
|
||||
pull block
|
||||
mov x, osr
|
||||
bytes2:
|
||||
set y, 7
|
||||
bit2:
|
||||
set pindirs, 1
|
||||
set pins, 0 [1]
|
||||
set pindirs, 0 [5]
|
||||
in pins,1 [10]
|
||||
jmp y--,bit2
|
||||
jmp x--,bytes2
|
||||
.wrap
|
|
@ -4,6 +4,7 @@
|
|||
#include "pico/stdlib.h"
|
||||
|
||||
#include "lcd.h"
|
||||
#include "ds18b20.h"
|
||||
|
||||
constexpr uint I2C_SDA_PIN = 26;
|
||||
constexpr uint I2C_SCL_PIN = 27;
|
||||
|
|
Loading…
Reference in a new issue