From 56d9bdd39ed36c36e9a61411b86c76d5228b2133 Mon Sep 17 00:00:00 2001 From: sicarius Date: Sun, 11 Feb 2007 18:32:03 +0000 Subject: Added lot's of code-files used during work --- source/ct-Bot/mcu/srf10.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 source/ct-Bot/mcu/srf10.c (limited to 'source/ct-Bot/mcu/srf10.c') diff --git a/source/ct-Bot/mcu/srf10.c b/source/ct-Bot/mcu/srf10.c new file mode 100644 index 0000000..ca5a4bb --- /dev/null +++ b/source/ct-Bot/mcu/srf10.c @@ -0,0 +1,171 @@ +/* + * c't-Sim - Robotersimulator fuer den c't-Bot + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your + * option) any later version. + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307, USA. + * + */ + +/*! @file srf10.c + * @brief Ansteuerung des Ultraschall Entfernungssensors SRF10 + * @author Carsten Giesen (info@cnau.de) + * @date 08.04.06 +*/ +#ifdef MCU +#include +#include "TWI_driver.h" +#include "srf10.h" +#include "delay.h" + +static uint8 address=SRF10_UNIT_0; + +/*! + * SRF10 initialsieren + */ + +void srf10_init(void){ + srf10_set_range(SRF10_MAX_RANGE); + //srf10_set_range(6); //Mit diesem Wert muss man spielen um das Optimum zu ermitteln +return; +} + +/*! + * Verstaerkungsfaktor setzen + * @param gain Verstaerkungsfaktor + */ + +void srf10_set_gain(unsigned char gain){ + if(gain>16) { gain=16; } + + uint8 temp[2]; + uint8 state; + tx_type tx_frame[2]; + + state = SUCCESS; + + tx_frame[0].slave_adr = address+W; + tx_frame[0].size = 2; + tx_frame[0].data_ptr = temp; + tx_frame[0].data_ptr[0] = 1; + tx_frame[0].data_ptr[1] = gain; + + tx_frame[1].slave_adr = OWN_ADR; + + state = Send_to_TWI(tx_frame); +} + +/*! + * Reichweite setzen, hat auch Einfluss auf die Messdauer + * @param millimeters Reichweite in mm + */ + +void srf10_set_range(unsigned int millimeters){ + uint8 temp[2]; + uint8 state; + tx_type tx_frame[2]; + + state = SUCCESS; + + millimeters= (millimeters/43); + + tx_frame[0].slave_adr = address+W; + tx_frame[0].size = 2; + tx_frame[0].data_ptr = temp; + tx_frame[0].data_ptr[0] = 2; + tx_frame[0].data_ptr[1] = millimeters; + + tx_frame[1].slave_adr = OWN_ADR; + + state = Send_to_TWI(tx_frame); +} + +/*! + * Messung ausloesen + * @param metric_unit 0x50 in Zoll, 0x51 in cm, 0x52 ms + * @return Resultat der Aktion + */ + +uint8 srf10_ping(uint8 metric_unit){ + uint8 temp[2]; + uint8 state; + tx_type tx_frame[2]; + + state = SUCCESS; + + tx_frame[0].slave_adr = address+W; + tx_frame[0].size = 2; + tx_frame[0].data_ptr = temp; + tx_frame[0].data_ptr[0] = SRF10_COMMAND; + tx_frame[0].data_ptr[1] = metric_unit; + + tx_frame[1].slave_adr = OWN_ADR; + + state = Send_to_TWI(tx_frame); + + return state; +} + +/*! + * Register auslesen + * @param srf10_register welches Register soll ausgelsen werden + * @return Inhalt des Registers + */ + +uint8 srf10_read_register(uint8 srf10_register){ + uint8 temp; + uint8 value; + uint8 state; + tx_type tx_frame[3]; + + state = SUCCESS; + value = 0; + + tx_frame[0].slave_adr = address+W; + tx_frame[0].size = 1; + tx_frame[0].data_ptr = &temp; + tx_frame[0].data_ptr[0] = srf10_register; + + tx_frame[1].slave_adr = address+R; + tx_frame[1].size = 1; + tx_frame[1].data_ptr = &value; + + tx_frame[2].slave_adr = OWN_ADR; + + state = Send_to_TWI(tx_frame); + + return value; +} + +/*! + * Messung starten Ergebniss aufbereiten und zurueckgeben + * @return Messergebniss + */ + +uint16 srf10_get_measure(){ + char hib; + char lob; + char state; + + state = SUCCESS; + + state = srf10_ping(SRF10_CENTIMETERS); + delay(10); //Optimierungs Potential + lob=srf10_read_register(SRF10_LOB); + delay(10); //Optimierungs Potential + hib=srf10_read_register(SRF10_HIB); + + return (hib*256)+lob; +} + +#endif -- cgit v1.2.3