It's alive! New code all working.
The OneWire library works. It's a bit hacked together, as neither the software timer or hardware timer APIs would have worked well, because they are implemented terribly by Espressif. The easiest way to get around this was to just use system_get_time() and work off of that for timing in one-wire comms. Split the publish function into two separate functions: one to publish floating point numbers, and one to publish integers. In a language like Lua or C++ you could have these as one function, but in C it's easier to just split them. The main.c has a new function called dataLog that deals with getting the DS18B20 data and then handing that off to pubfloat(). I updated the timer names to be more descriptive. I grabbed some code to convert integers and floats to strings, as I can't be bothered to write that code myself for the millionth time. If something goes wrong and we are disconnected from our TCP connection, all timers are halted so we don't blindly keep trying to send packets over a non-existent link. Unfortunately the onewire library is hardcoded to use pin 5. That will be the next update. Signed-off-by: A.M. Rowsell <amrowsell@frozenelectronics.ca>
This commit is contained in:
parent
48702bf328
commit
5e3be0f561
7 changed files with 231 additions and 75 deletions
120
onewire.c
120
onewire.c
|
@ -5,17 +5,23 @@
|
|||
#include "gpio.h"
|
||||
#include "onewire.h"
|
||||
|
||||
sint8 ICACHE_FLASH_ATTR init(oneWire_t *owDev) {
|
||||
#define OWBUS BIT5
|
||||
|
||||
sint8 ICACHE_FLASH_ATTR reset(void) {
|
||||
uint32_t time;
|
||||
// reset the ow line, check for presence?
|
||||
time = system_get_time() + 500;
|
||||
gpio_output_set(0, BIT4, BIT4, 0); // pull GPIO4 low
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0); // pull GPIO4 low
|
||||
while(system_get_time() < time); // delay 500uS
|
||||
gpio_output_set(0, 0, 0, BIT4); // let go of GPIO4
|
||||
gpio_output_set(0, 0, 0, OWBUS); // let go of GPIO4
|
||||
time = system_get_time() + 60;
|
||||
while(system_get_time() < time);
|
||||
uint8_t presence = (uint8_t)(gpio_input_get() >> 4) & 0x1;
|
||||
if(presence) {
|
||||
uint8_t presence = (uint8_t)(gpio_input_get() >> 5) & 0x1;
|
||||
// give a 480uS pause so the next onewire event doesn't get trampled
|
||||
time = system_get_time() + 480;
|
||||
while(system_get_time() < time);
|
||||
|
||||
if(!presence) {
|
||||
return 1;
|
||||
} else {
|
||||
return -1;
|
||||
|
@ -27,47 +33,73 @@ void ICACHE_FLASH_ATTR transact(oneWire_t *owDev, ds18b20_cmds cmd) {
|
|||
uint8_t sendBit;
|
||||
uint8_t inBit = 0x00;
|
||||
uint8_t inByte = 0x00;
|
||||
if((cmd == SKIP_ROM) | (cmd == CONVERT_T)) {
|
||||
for(uint8_t i = 7; i >= 0; i--) {
|
||||
sendBit = (cmd >> i) & 0x1;
|
||||
if(sendBit == 1) {
|
||||
time = system_get_time() + 10;
|
||||
gpio_output_set(0, BIT4, BIT4, 0); // pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, BIT4); // let go
|
||||
} else {
|
||||
time = system_get_time() + 100;
|
||||
gpio_output_set(0, BIT4, BIT4, 0); //pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, BIT4);
|
||||
switch(cmd) {
|
||||
os_printf("\nOnewire command: %d\n", cmd);
|
||||
case SKIP_ROM:
|
||||
case CONVERT_T:
|
||||
for(uint8_t i = 0; i < 8; i++) {
|
||||
sendBit = (cmd >> i) & 0x1;
|
||||
//os_printf("\nThe bit is: %d \t i is %d\n", sendBit, i);
|
||||
if(sendBit == 1) {
|
||||
//os_printf("\nWe are in sendBit == 1\n");
|
||||
time = system_get_time() + 10;
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0); // pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, OWBUS); // let go
|
||||
time = system_get_time() + 50;
|
||||
while(system_get_time() < time);
|
||||
} else {
|
||||
//os_printf("\nWe are in the sendBit else\n");
|
||||
time = system_get_time() + 100;
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0); //pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, OWBUS); // let go
|
||||
time = system_get_time() + 10;
|
||||
while(system_get_time() < time);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(cmd == SCRATCH_READ) {
|
||||
for(uint8_t i = 7; i >= 0; i--) {
|
||||
sendBit = (cmd >> i) & 0x1;
|
||||
if(sendBit == 1) {
|
||||
time = system_get_time() + 10;
|
||||
gpio_output_set(0, BIT4, BIT4, 0); // pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, BIT4); // let go
|
||||
} else {
|
||||
time = system_get_time() + 100;
|
||||
gpio_output_set(0, BIT4, BIT4, 0); //pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, BIT4);
|
||||
break;
|
||||
case SCRATCH_READ:
|
||||
for(uint8_t i = 0; i < 8; i++) {
|
||||
sendBit = (cmd >> i) & 0x1;
|
||||
if(sendBit == 1) {
|
||||
//os_printf("\nWe are in sendBit == 1\n");
|
||||
time = system_get_time() + 10;
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0); // pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, OWBUS); // let go
|
||||
time = system_get_time() + 50;
|
||||
while(system_get_time() < time);
|
||||
} else {
|
||||
//os_printf("\nWe are in the sendBit else\n");
|
||||
time = system_get_time() + 100;
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0); //pull low
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, OWBUS); // let go
|
||||
time = system_get_time() + 10;
|
||||
while(system_get_time() < time);
|
||||
}
|
||||
}
|
||||
}
|
||||
// now read the scratchpad
|
||||
for(uint8_t i = 0; i < 2; i++) {
|
||||
for(uint8_t j = 0; j < 8; j++) {
|
||||
time = system_get_time() + 8;
|
||||
gpio_output_set(0, BIT4, BIT4, 0);
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, BIT4);
|
||||
inBit = (uint8_t)(gpio_input_get() >> 4) & 0x01;
|
||||
inByte |= inBit << j;
|
||||
// now read the scratchpad
|
||||
for(uint8_t i = 0; i < 2; i++) {
|
||||
for(uint8_t j = 0; j < 8; j++) {
|
||||
time = system_get_time() + 8;
|
||||
gpio_output_set(0, OWBUS, OWBUS, 0);
|
||||
while(system_get_time() < time);
|
||||
gpio_output_set(0, 0, 0, OWBUS);
|
||||
time = system_get_time() + 15;
|
||||
while(system_get_time() < time);
|
||||
inBit = (uint8_t)(gpio_input_get() >> 5) & 0x01;
|
||||
inByte |= inBit << j;
|
||||
time = system_get_time() + 45;
|
||||
while(system_get_time() < time);
|
||||
}
|
||||
owDev->scratchpad[i] = inByte;
|
||||
inByte = 0; // clear inByte
|
||||
}
|
||||
owDev->scratchpad[i] = inByte;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
os_printf("\nIncorrect command\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue