Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • leger/avrcte
  • leger/avrcwa
2 results
Show changes
#include "common.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ds18b20(
prefix="thermometer_cold",
pindesc=conf.SENSOR_T_COLD,
header=False,
)
)
]]]*/
uint8_t thermometer_cold_reset()
{
THERMOMETER_COLD_port.DIRSET = THERMOMETER_COLD_pin;
THERMOMETER_COLD_port.OUTCLR = THERMOMETER_COLD_pin;
_delay_us(480); // 480 min (480)
THERMOMETER_COLD_port.DIRCLR = THERMOMETER_COLD_pin;
_delay_us(60); // 60-255 (60)
uint8_t ret = THERMOMETER_COLD_port.IN & THERMOMETER_COLD_pin; // 0: ok
_delay_us(420); // (420)
return ret;
}
void thermometer_cold_writebit(uint8_t bit)
{
THERMOMETER_COLD_port.DIRSET = THERMOMETER_COLD_pin;
THERMOMETER_COLD_port.OUTCLR = THERMOMETER_COLD_pin;
_delay_us(1);
// write 1: release the line
if(bit)
THERMOMETER_COLD_port.DIRCLR = THERMOMETER_COLD_pin;
_delay_us(60); // 59 min
THERMOMETER_COLD_port.DIRCLR = THERMOMETER_COLD_pin;
_delay_us(10);
}
uint8_t thermometer_cold_readbit(void)
{
uint8_t ret=0;
THERMOMETER_COLD_port.DIRSET = THERMOMETER_COLD_pin;
THERMOMETER_COLD_port.OUTCLR = THERMOMETER_COLD_pin;
_delay_us(1);
THERMOMETER_COLD_port.DIRCLR = THERMOMETER_COLD_pin;
_delay_us(13);
if(THERMOMETER_COLD_port.IN & THERMOMETER_COLD_pin)
ret=1;
_delay_us(60);
return ret;
}
void thermometer_cold_writebyte(uint8_t byte)
{
uint8_t i;
for(i=0;i<8;i++)
{
thermometer_cold_writebit( byte & 0x01);
byte >>= 1;
}
}
uint8_t thermometer_cold_readbyte(void)
{
uint8_t ret=0;
uint8_t i;
for(i=0;i<8;i++)
{
ret >>= 1;
ret |= (thermometer_cold_readbit()<<7);
}
return ret;
}
int8_t thermometer_cold_gettemp(int16_t* temp, uint16_t timeout_ms)
{
uint8_t buf[9];
if(thermometer_cold_reset())
return 3;
thermometer_cold_writebyte(THERMOMETER_COLD_CMD_SKIPROM);
thermometer_cold_writebyte(THERMOMETER_COLD_CMD_CONVERTTEMP);
int16_t delay=0;
while(!thermometer_cold_readbit())
{
if(delay>timeout_ms)
return(2); // timeout
_delay_ms(1);
delay++;
}
if(thermometer_cold_reset())
return(4);
thermometer_cold_writebyte(THERMOMETER_COLD_CMD_SKIPROM);
thermometer_cold_writebyte(THERMOMETER_COLD_CMD_RSCRATCHPAD);
uint8_t i;
for(i=0;i<9;i++)
buf[i] = thermometer_cold_readbyte();
uint8_t crc=0x00;
for(i=0;i<8;i++)
crc = _crc_ibutton_update(crc,buf[i]);
if(crc == buf[8])
{
*temp = ( (int16_t)(((uint16_t)(buf[1]))<<8) | buf[0] );
return(0); // ok
}
return(1);
}
///[[[end]]]
#include "common.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ds18b20(
prefix="thermometer_cold",
pindesc=conf.SENSOR_T_COLD,
header=True,
)
)
]]]*/
#ifndef H_DS18B20_thermometer_cold
#define H_DS18B20_thermometer_cold 1
#define THERMOMETER_COLD_port PORTD
#define THERMOMETER_COLD_pin PIN0_bm
#define THERMOMETER_COLD_CMD_CONVERTTEMP 0x44
#define THERMOMETER_COLD_CMD_RSCRATCHPAD 0xbe
#define THERMOMETER_COLD_CMD_WSCRATCHPAD 0x4e
#define THERMOMETER_COLD_CMD_CPYSCRATCHPAD 0x48
#define THERMOMETER_COLD_CMD_RECEEPROM 0xb8
#define THERMOMETER_COLD_CMD_RPWRSUPPLY 0xb4
#define THERMOMETER_COLD_CMD_SEARCHROM 0xf0
#define THERMOMETER_COLD_CMD_READROM 0x33
#define THERMOMETER_COLD_CMD_MATCHROM 0x55
#define THERMOMETER_COLD_CMD_SKIPROM 0xcc
#define THERMOMETER_COLD_CMD_ALARMSEARCH 0xec
#include <util/delay.h>
#include <util/crc16.h>
uint8_t thermometer_cold_reset();
void thermometer_cold_writebit(uint8_t bit);
uint8_t thermometer_cold_readbit(void);
void thermometer_cold_writebyte(uint8_t byte);
uint8_t thermometer_cold_readbyte(void);
int8_t thermometer_cold_gettemp(int16_t* temp, uint16_t timeout_ms);
#endif
///[[[end]]]
......@@ -10,92 +10,92 @@ import avrxmegastuff as ams
/*[[[cog
cog.out(
ams.ds18b20(
prefix="thermometer",
pindesc=conf.SENSOR_T,
prefix="thermometer_hot",
pindesc=conf.SENSOR_T_HOT,
header=False,
)
)
]]]*/
uint8_t thermometer_reset()
uint8_t thermometer_hot_reset()
{
THERMOMETER_port.DIRSET = THERMOMETER_pin;
THERMOMETER_port.OUTCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRSET = THERMOMETER_HOT_pin;
THERMOMETER_HOT_port.OUTCLR = THERMOMETER_HOT_pin;
_delay_us(480); // 480 min (480)
THERMOMETER_port.DIRCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRCLR = THERMOMETER_HOT_pin;
_delay_us(60); // 60-255 (60)
uint8_t ret = THERMOMETER_port.IN & THERMOMETER_pin; // 0: ok
uint8_t ret = THERMOMETER_HOT_port.IN & THERMOMETER_HOT_pin; // 0: ok
_delay_us(420); // (420)
return ret;
}
void thermometer_writebit(uint8_t bit)
void thermometer_hot_writebit(uint8_t bit)
{
THERMOMETER_port.DIRSET = THERMOMETER_pin;
THERMOMETER_port.OUTCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRSET = THERMOMETER_HOT_pin;
THERMOMETER_HOT_port.OUTCLR = THERMOMETER_HOT_pin;
_delay_us(1);
// write 1: release the line
if(bit)
THERMOMETER_port.DIRCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRCLR = THERMOMETER_HOT_pin;
_delay_us(60); // 59 min
THERMOMETER_port.DIRCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRCLR = THERMOMETER_HOT_pin;
_delay_us(10);
}
uint8_t thermometer_readbit(void)
uint8_t thermometer_hot_readbit(void)
{
uint8_t ret=0;
THERMOMETER_port.DIRSET = THERMOMETER_pin;
THERMOMETER_port.OUTCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRSET = THERMOMETER_HOT_pin;
THERMOMETER_HOT_port.OUTCLR = THERMOMETER_HOT_pin;
_delay_us(1);
THERMOMETER_port.DIRCLR = THERMOMETER_pin;
THERMOMETER_HOT_port.DIRCLR = THERMOMETER_HOT_pin;
_delay_us(13);
if(THERMOMETER_port.IN & THERMOMETER_pin)
if(THERMOMETER_HOT_port.IN & THERMOMETER_HOT_pin)
ret=1;
_delay_us(60);
return ret;
}
void thermometer_writebyte(uint8_t byte)
void thermometer_hot_writebyte(uint8_t byte)
{
uint8_t i;
for(i=0;i<8;i++)
{
thermometer_writebit( byte & 0x01);
thermometer_hot_writebit( byte & 0x01);
byte >>= 1;
}
}
uint8_t thermometer_readbyte(void)
uint8_t thermometer_hot_readbyte(void)
{
uint8_t ret=0;
uint8_t i;
for(i=0;i<8;i++)
{
ret >>= 1;
ret |= (thermometer_readbit()<<7);
ret |= (thermometer_hot_readbit()<<7);
}
return ret;
}
int8_t thermometer_gettemp(int16_t* temp, uint16_t timeout_ms)
int8_t thermometer_hot_gettemp(int16_t* temp, uint16_t timeout_ms)
{
uint8_t buf[9];
if(thermometer_reset())
if(thermometer_hot_reset())
return 3;
thermometer_writebyte(THERMOMETER_CMD_SKIPROM);
thermometer_writebyte(THERMOMETER_CMD_CONVERTTEMP);
thermometer_hot_writebyte(THERMOMETER_HOT_CMD_SKIPROM);
thermometer_hot_writebyte(THERMOMETER_HOT_CMD_CONVERTTEMP);
int16_t delay=0;
while(!thermometer_readbit())
while(!thermometer_hot_readbit())
{
if(delay>timeout_ms)
return(2); // timeout
......@@ -103,14 +103,14 @@ int8_t thermometer_gettemp(int16_t* temp, uint16_t timeout_ms)
delay++;
}
if(thermometer_reset())
if(thermometer_hot_reset())
return(4);
thermometer_writebyte(THERMOMETER_CMD_SKIPROM);
thermometer_writebyte(THERMOMETER_CMD_RSCRATCHPAD);
thermometer_hot_writebyte(THERMOMETER_HOT_CMD_SKIPROM);
thermometer_hot_writebyte(THERMOMETER_HOT_CMD_RSCRATCHPAD);
uint8_t i;
for(i=0;i<9;i++)
buf[i] = thermometer_readbyte();
buf[i] = thermometer_hot_readbyte();
uint8_t crc=0x00;
for(i=0;i<8;i++)
......
#include "common.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ds18b20(
prefix="thermometer_hot",
pindesc=conf.SENSOR_T_HOT,
header=True,
)
)
]]]*/
#ifndef H_DS18B20_thermometer_hot
#define H_DS18B20_thermometer_hot 1
#define THERMOMETER_HOT_port PORTD
#define THERMOMETER_HOT_pin PIN1_bm
#define THERMOMETER_HOT_CMD_CONVERTTEMP 0x44
#define THERMOMETER_HOT_CMD_RSCRATCHPAD 0xbe
#define THERMOMETER_HOT_CMD_WSCRATCHPAD 0x4e
#define THERMOMETER_HOT_CMD_CPYSCRATCHPAD 0x48
#define THERMOMETER_HOT_CMD_RECEEPROM 0xb8
#define THERMOMETER_HOT_CMD_RPWRSUPPLY 0xb4
#define THERMOMETER_HOT_CMD_SEARCHROM 0xf0
#define THERMOMETER_HOT_CMD_READROM 0x33
#define THERMOMETER_HOT_CMD_MATCHROM 0x55
#define THERMOMETER_HOT_CMD_SKIPROM 0xcc
#define THERMOMETER_HOT_CMD_ALARMSEARCH 0xec
#include <util/delay.h>
#include <util/crc16.h>
uint8_t thermometer_hot_reset();
void thermometer_hot_writebit(uint8_t bit);
uint8_t thermometer_hot_readbit(void);
void thermometer_hot_writebyte(uint8_t byte);
uint8_t thermometer_hot_readbyte(void);
int8_t thermometer_hot_gettemp(int16_t* temp, uint16_t timeout_ms);
#endif
///[[[end]]]
#include "vanne.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ev(
prefix="vanne",
**conf.VANNE,
header=False,
)
)
]]]*/
volatile ev_state_t vanne_internal_status;
void vanne_init()
{
VANNE_CMD_PORT.DIRSET = VANNE_CMD_OPEN_bm | VANNE_CMD_CLOSE_bm;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_OPEN_bm | VANNE_CMD_CLOSE_bm;
VANNE_SENSOR_PORT.DIRCLR = VANNE_SENSOR_OPEN_bm | VANNE_SENSOR_CLOSE_bm;
VANNE_SENSOR_OPEN_PINCTRL = PORT_OPC_PULLUP_gc;
VANNE_SENSOR_CLOSE_PINCTRL = PORT_OPC_PULLUP_gc;
vanne_internal_status = EV_MID;
}
uint8_t vanne_internal_step_close(uint16_t d)
{
if(vanne_internal_status == EV_CLOSED)
return 1;
if(d<VANNE_ACTION_LIMIT)
return 0;
if(vanne_internal_status == EV_OPENED)
d = 500;
vanne_internal_status = EV_MID;
vanne_callback_close();
uint16_t k;
VANNE_CMD_PORT.OUTSET = VANNE_CMD_CLOSE_bm;
for(k=0;k<d;k++)
_delay_ms(1);
if(!(VANNE_SENSOR_PORT.IN & VANNE_SENSOR_CLOSE_bm))
vanne_internal_status = EV_CLOSED;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_CLOSE_bm;
if(vanne_internal_status == EV_CLOSED)
return 1;
return 0;
}
uint8_t vanne_internal_step_open(uint16_t d)
{
if(vanne_internal_status == EV_OPENED)
return 1;
if(d<VANNE_ACTION_LIMIT)
return 0;
if(vanne_internal_status == EV_CLOSED)
d = 500;
vanne_internal_status = EV_MID;
vanne_callback_open();
uint16_t k;
VANNE_CMD_PORT.OUTSET = VANNE_CMD_OPEN_bm;
for(k=0;k<d;k++)
_delay_ms(1);
if(!(VANNE_SENSOR_PORT.IN & VANNE_SENSOR_OPEN_bm))
vanne_internal_status = EV_OPENED;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_OPEN_bm;
if(vanne_internal_status == EV_OPENED)
return 1;
return 0;
}
uint8_t vanne_step_close(uint16_t d)
{
uint16_t steps = d/(d/101+1);
uint16_t k;
uint8_t ret;
for(k=0;k<d;k+=steps)
{
if(k+steps<=d)
ret = vanne_internal_step_close(steps);
else
ret = vanne_internal_step_close(d-k);
if(ret)
return ret;
}
return ret;
}
uint8_t vanne_step_open(uint16_t d)
{
uint16_t steps = d/(d/101+1);
uint16_t k;
uint8_t ret;
for(k=0;k<d;k+=steps)
{
if(k+steps<=d)
ret = vanne_internal_step_open(steps);
else
ret = vanne_internal_step_open(d-k);
if(ret)
return ret;
}
return ret;
}
void vanne_close()
{
uint16_t k;
for(k=0;k<1000;k++)
if(vanne_internal_step_close(10))
break;
vanne_internal_status = EV_CLOSED;
}
void vanne_open()
{
uint16_t k;
for(k=0;k<1000;k++)
if(vanne_internal_step_open(10))
break;
vanne_internal_status = EV_OPENED;
}
void vanne_vidange()
{
uint16_t kclose;
uint16_t kopen;
vanne_close();
for(kopen=0;kopen<1000;kopen++)
if(vanne_internal_step_open(10))
break;
for(kclose=0;kclose<1000;kclose++)
if(vanne_internal_step_close(10))
break;
uint8_t kmin;
if(kopen<900)
kmin = kopen/2;
else
{
if(kclose<900)
kmin = kclose/2;
else
kmin = 50;
}
uint16_t k2=0;
for(k2=0;k2<kmin;k2++)
if(vanne_internal_step_open(10))
break;
}
///[[[end]]]
void vanne_callback_open()
{
led_alert.open = 4;
}
void vanne_callback_close()
{
led_alert.close = 4;
}
#include "common.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ev(
prefix="vanne",
**conf.VANNE,
header=True,
)
)
]]]*/
#ifndef H_EV_vanne
#define H_EV_vanne 1
#define VANNE_CMD_PORT PORTE
#define VANNE_CMD_OPEN_bm PIN0_bm
#define VANNE_CMD_CLOSE_bm PIN1_bm
#define VANNE_SENSOR_PORT PORTE
#define VANNE_SENSOR_OPEN_bm PIN3_bm
#define VANNE_SENSOR_CLOSE_bm PIN4_bm
#define VANNE_SENSOR_OPEN_PINCTRL PORTE.PIN3CTRL
#define VANNE_SENSOR_CLOSE_PINCTRL PORTE.PIN4CTRL
#define VANNE_ACTION_LIMIT cconfig.minimum_step
#ifndef H_ELECTROVANNE_TYPES
#define H_ELECTROVANNE_TYPES 1
typedef enum state_ev
{
EV_MID,
EV_OPENED,
EV_CLOSED,
} ev_state_t;
#endif
extern volatile ev_state_t vanne_internal_status;
void vanne_init();
uint8_t vanne_internal_step_close(uint16_t d);
uint8_t vanne_internal_step_open(uint16_t d);
uint8_t vanne_step_close(uint16_t d);
uint8_t vanne_step_open(uint16_t d);
void vanne_close();
void vanne_open();
void vanne_vidange();
#endif
///[[[end]]]
void vanne_callback_open();
void vanne_callback_close();