Subversion Repositories HomeAutomation

Rev

Rev 1896 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
834 linlun 1
/*
2
 * FOST02 temperature and humidity sensor
3
 *
4
 * Using "two-wire" interface for reading sensor values.
5
 *
6
 * Author: Linus Lundin
7
 * Date: 2007-08-12
8
 *
9
 */
10
 
11
/*-----------------------------------------------
12
 * Includes
13
 * ---------------------------------------------*/
14
#include <avr/io.h>
15
#include <stdio.h>
16
#include <stdlib.h>
17
 
1932 arune 18
#include <config.h>
1896 arune 19
#include <util/delay.h>
834 linlun 20
#include "FOST02.h"
21
 
22
/*----------------------------------------------
23
 * Functions
24
 * --------------------------------------------*/
25
 
26
 
27
/*
28
 * Initiate FOST02 for reading temperature and humidity from sensor.
29
 */
30
void FOST02Init(void)
31
{
1140 linlun 32
    gpio_clr_pin(FOST02_CLK);
33
    gpio_set_out(FOST02_CLK);  
34
    gpio_set_in(FOST02_DATA);
35
    gpio_clr_pin(FOST02_DATA);
834 linlun 36
}
37
void sendReset(void)
38
{
1140 linlun 39
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 40
    _delay_us(2);
1140 linlun 41
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 42
    _delay_us(2);
1140 linlun 43
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 44
    _delay_us(2);
1140 linlun 45
    gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
1896 arune 46
    _delay_us(2);
1140 linlun 47
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 48
    _delay_us(2);
1140 linlun 49
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 50
    _delay_us(2);
1140 linlun 51
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 52
    _delay_us(2);
1140 linlun 53
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 54
    _delay_us(2);
834 linlun 55
}
56
uint8_t sendCommand(uint8_t cmd)
57
{
58
    sendReset();
59
    uint8_t i,ret;
60
    for (i = 0; i<8 ; i++)
61
    {
62
        if ((cmd & 0x80) == 0x80)
1140 linlun 63
            gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
834 linlun 64
        else
1140 linlun 65
            gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
1896 arune 66
        _delay_us(2);
1140 linlun 67
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
834 linlun 68
        cmd = cmd << 1;
1896 arune 69
        _delay_us(2);
1140 linlun 70
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 71
        _delay_us(2);
834 linlun 72
    }
1140 linlun 73
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 74
    _delay_us(2);
1140 linlun 75
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
834 linlun 76
 
1896 arune 77
    _delay_us(2);
1140 linlun 78
    if ( !gpio_get_state(FOST02_DATA))
834 linlun 79
    {
80
        ret = 1;
1140 linlun 81
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 82
        _delay_us(2);
1140 linlun 83
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
84
        while (!gpio_get_state(FOST02_DATA));
1896 arune 85
        _delay_us(2);
834 linlun 86
    }
87
    else
88
        ret = 0;
1140 linlun 89
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 90
    _delay_us(2);
834 linlun 91
    return ret;
92
}
93
 
94
uint8_t getFOST02PinStatus(void)
95
{
1140 linlun 96
    if ( gpio_get_state(FOST02_DATA))
834 linlun 97
        return 1;
98
    else
99
        return 0;
100
}
101
uint16_t getFOST02Data(void)
102
{
103
    uint8_t i,data1, data2;
104
    uint16_t data = 0;
105
    data=0;
106
    data1=0;
107
    data2=0;
108
    for (i = 0; i<8 ; i++)
109
    {
1140 linlun 110
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 111
        _delay_us(2);
834 linlun 112
        data1 = data1 << 1;
1140 linlun 113
        if ( gpio_get_state(FOST02_DATA))
834 linlun 114
            data1 = data1 | 0x0001;
1140 linlun 115
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 116
        _delay_us(2);
834 linlun 117
    }
1140 linlun 118
    gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
1896 arune 119
    _delay_us(2);
1140 linlun 120
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 121
    _delay_us(2);
1140 linlun 122
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
123
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 124
    _delay_us(2);
834 linlun 125
    for (i = 0; i<8 ; i++)
126
    {
1140 linlun 127
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 128
        _delay_us(2);
834 linlun 129
        data2 = data2 << 1;
1140 linlun 130
        if ( gpio_get_state(FOST02_DATA))
834 linlun 131
            data2 = data2 | 0x0001;
1140 linlun 132
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 133
        _delay_us(2);
834 linlun 134
    }
135
    //skip Ack
1140 linlun 136
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 137
    _delay_us(2);
1140 linlun 138
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 139
    _delay_us(2);
1140 linlun 140
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
834 linlun 141
    data = (uint16_t) (data1<<8);
142
    data += data2;
143
    return data;
144
}
145
 
146
void getFOST02DataByte(uint8_t *data1in, uint8_t *data2in)
147
{
148
    uint8_t i;
149
    uint16_t data = 0;
150
    uint8_t data1 = 0;
151
    uint8_t data2 = 0;
152
    for (i = 0; i<8 ; i++)
153
    {
1140 linlun 154
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 155
        _delay_us(2);
834 linlun 156
        data1 = data1 << 1;
1140 linlun 157
        if ( gpio_get_state(FOST02_DATA))
834 linlun 158
            data1 = data1 | 0x0001;
1140 linlun 159
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 160
        _delay_us(2);
834 linlun 161
    }
1140 linlun 162
    gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
1896 arune 163
    _delay_us(2);
1140 linlun 164
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 165
    _delay_us(2);
1140 linlun 166
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
167
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 168
    _delay_us(2);
834 linlun 169
    for (i = 0; i<8 ; i++)
170
    {
1140 linlun 171
        gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 172
        _delay_us(2);
834 linlun 173
        data2 = data2 << 1;
1140 linlun 174
        if ( gpio_get_state(FOST02_DATA))
834 linlun 175
            data2 = data2 | 0x0001;
1140 linlun 176
        gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
1896 arune 177
        _delay_us(2);
834 linlun 178
    }
179
    //skip Ack
1140 linlun 180
    gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
1896 arune 181
    _delay_us(2);
1140 linlun 182
    gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
1896 arune 183
    _delay_us(2);
1140 linlun 184
    gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
834 linlun 185
    *data1in = data1;
186
    *data2in = data2;
187
}
188
/*
189
 * Start reading and return the temperature value.
190
 */
191
void measureFOST02temperature(void) {}
192
void measureFOST02humidity(void) {}
193
uint16_t getFOST02temperature(void) {return 0;}
194
uint16_t getFOST02humidity(void) {return 0;}