/Designs/MRAKOMER4/SW/2zone/TOUCH.C
0,0 → 1,258
///////////////////////////////////////////////////////////////////////////
//// Dallas Touch Driver ////
//// ////
//// ////
//// data = touch_read_bit() Reads one bit from a touch device ////
//// ////
//// data = touch_read_BYTE() Reads one byte from a touch device. ////
//// ////
//// ok = touch_write_bit(data) Writes one bit to a touch device ////
//// and returns true if all went ok. ////
//// A false indicates a collision with ////
//// another device. ////
//// ////
//// ok = touch_write_byte(data) Writes one byte to a touch device ////
//// and returns true if all went ok. ////
//// A false indicates a collision with ////
//// another device. ////
//// ////
//// present = touch_present() Issues a reset and returns true ////
//// if the touch device is there. ////
//// ////
//// reset_pulse() Issues a reset and waits for a ////
//// present pulse. ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2010 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
 
#ifndef TOUCH_C
#define TOUCH_C
 
#ifndef TOUCH_PIN
#define TOUCH_PIN PIN_B0
#endif
 
#define TOUCH_PIN_LOW() output_drive(TOUCH_PIN); output_low(TOUCH_PIN)
#define TOUCH_PIN_HIGH() output_drive(TOUCH_PIN); output_high(TOUCH_PIN)
#define TOUCH_PIN_FLOAT() output_float(TOUCH_PIN)
#define TOUCH_PIN_READ() input_state(TOUCH_PIN)
 
/////////////////////////////
//// ////
//// Function Prototypes ////
//// ////
/////////////////////////////
 
/*
int1 touch_read_bit()
This will read back a bit from the DS1993
PARAMS: none
RETURNS: A bit from the DS1993
*/
int1 touch_read_bit();
 
/*
BYTE touch_read_byte()
This will read back a byte from the DS1993
PARAMS: none
RETURNS: A byte from the DS1993
*/
BYTE touch_read_byte();
 
/*
BOOLEAN touch_write_bit(int1 data)
This will write a bit to the DS1993
PARAMS: The bit to write
RETURNS: True if completed successfully, false if otherwise
*/
BOOLEAN touch_write_bit(int1 data);
 
/*
BOOLEAN touch_write_byte(BYTE data)
This will write a byte to the DS1993
PARAMS: The byte to write
RETURNS: True if completed successfully, false if otherwise
*/
BOOLEAN touch_write_byte(BYTE data);
 
/*
BOOLEAN touch_present()
This will evaluate whether or not there is a touch present on the DS1993
PARAMS: none
RETURNS: True if a touch is present, false if otherwise
*/
BOOLEAN touch_present();
 
/*
void reset_pulse()
This will send the DS1993 a reset pulse
PARAMS: none
RETURNS: none
*/
void reset_pulse();
 
//////////////////////////////////
//// ////
//// Function Implementations ////
//// ////
//////////////////////////////////
 
/*
int1 touch_read_bit()
This will read back a bit from the DS1993
PARAMS: none
RETURNS: A bit from the DS1993
*/
int1 touch_read_bit()
{
int1 data;
 
TOUCH_PIN_LOW();
delay_us(14);
TOUCH_PIN_FLOAT();
delay_us(5);
data = TOUCH_PIN_READ();
delay_us(100);
toggle_dome();
 
return data;
}
 
/*
BYTE touch_read_byte()
This will read back a byte from the DS1993
PARAMS: none
RETURNS: A byte from the DS1993
*/
BYTE touch_read_byte()
{
BYTE i,data;
 
for(i=1; i <= 8; ++i)
shift_right(&data, 1, touch_read_bit());
 
return data;
}
 
/*
BOOLEAN touch_write_bit(int1 data)
This will write a bit to the DS1993
PARAMS: The bit to write
RETURNS: True if completed successfully, false if otherwise
*/
BOOLEAN touch_write_bit(int1 data)
{
TOUCH_PIN_LOW();
delay_us(10);
if(data)
{
TOUCH_PIN_HIGH();
delay_us(10);
if(!TOUCH_PIN_READ())
return FALSE;
}
else
{
TOUCH_PIN_LOW();
delay_us(10);
if(TOUCH_PIN_READ())
return FALSE;
}
delay_us(50);
TOUCH_PIN_HIGH();
toggle_dome();
delay_us(50);
return TRUE;
}
 
/*
BOOLEAN touch_write_byte(BYTE data)
This will write a byte to the DS1993
PARAMS: The byte to write
RETURNS: True if completed successfully, false if otherwise
*/
BOOLEAN touch_write_byte(BYTE data)
{
BYTE i;
 
for(i=1; i<=8; ++i)
if(!touch_write_bit(shift_right(&data, 1, 0)))
return FALSE;
 
return TRUE;
}
 
/*
BOOLEAN touch_present()
This will evaluate whether or not there is a touch present on the DS1993
PARAMS: none
RETURNS: True if a touch is present, false if otherwise
*/
BOOLEAN touch_present()
{
BOOLEAN present;
TOUCH_PIN_LOW();
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
TOUCH_PIN_FLOAT();
delay_us(5);
 
if(!TOUCH_PIN_READ())
return FALSE;
 
delay_us(65);
toggle_dome();
present = !TOUCH_PIN_READ();
toggle_dome(); // Puvodne pauza 240us
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(30);
toggle_dome();
return present;
}
 
/*
void reset_pulse()
This will send the DS1993 a reset pulse
PARAMS: none
RETURNS: none
*/
void reset_pulse()
{
TOUCH_PIN_LOW();
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
delay_us(100);
toggle_dome();
TOUCH_PIN_FLOAT();
delay_us(5);
while(!touch_present());
}
 
 
#endif