Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
153 arune 1
/**
2
 * DS18S20 over CAN program.
3
 *
4
 * @target  AVR
5
 * @date    2006-12-09
6
 * @author  Jimmy Myhrman, Anders Runeson
7
 *  
8
 * Högst experimentell, decimaldel fel vid negativ temperatur?
9
 * negativ temperatur helt otestad!
10
 *
11
 */
12
 
13
/*-----------------------------------------------------------------------------
14
 * Includes
15
 *---------------------------------------------------------------------------*/
16
/* system files */
17
#include <avr/io.h>
18
#include <avr/interrupt.h>
19
#include <avr/wdt.h>
20
#include <stdio.h>
21
/* lib files */
22
#include <can.h>
23
#include <uart.h>
24
#include <timebase.h>
25
 
26
#include <onewire.h>
27
#include <ds18x20.h>
28
 
29
#include <delay.h>
30
 
31
 
169 arune 32
 
153 arune 33
#define MAXSENSORS 4
34
 
35
uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE];
36
 
37
uint8_t search_sensors(void)
38
{
39
    uint8_t i;
40
    uint8_t id[OW_ROMCODE_SIZE];
41
    uint8_t diff, nSensors;
42
 
43
    printf( "\nScanning Bus for DS18X20\n" );
44
 
45
    nSensors = 0;
46
 
47
    for( diff = OW_SEARCH_FIRST;
48
        diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; )
49
    {
50
        DS18X20_find_sensor( &diff, &id[0] );
51
 
52
        if( diff == OW_PRESENCE_ERR ) {
53
            printf( "No Sensor found\n" );
54
            break;
55
        }
56
 
57
        if( diff == OW_DATA_ERR ) {
58
            printf( "Bus Error\n" );
59
            break;
60
        }
61
 
62
        for (i=0;i<OW_ROMCODE_SIZE;i++)
63
            gSensorIDs[nSensors][i]=id[i];
64
 
65
        nSensors++;
66
    }
67
 
68
    return nSensors;
69
}
70
 
71
 
169 arune 72
 
153 arune 73
/*-----------------------------------------------------------------------------
74
 * Main Program
75
 *---------------------------------------------------------------------------*/
76
int main(void) {
77
    uint8_t nSensors, i;
78
    uint8_t subzero, cel, cel_frac_bits;
79
 
221 arune 80
    Mcu_Init();
153 arune 81
    Timebase_Init();
82
    Serial_Init();
83
 
202 arune 84
    sei();
85
 
153 arune 86
    printf( "\nDS18X20 1-Wire-Reader\n" );
87
    printf( "-----------------------" );
88
    nSensors = search_sensors();
89
    printf( "%i DS18X20 Sensor(s) available:\n", (int) nSensors );
90
 
91
    for (i=0; i<nSensors; i++) {
92
        printf("Sensor# %i is a ", (int) i+1);
93
        if ( gSensorIDs[i][0] == DS18S20_ID)
94
            printf("DS18S20/DS1820");
95
        else printf("DS18B20");
96
        printf(" which is ");
97
        if ( DS18X20_get_power_status( &gSensorIDs[i][0] ) ==
98
            DS18X20_POWER_PARASITE )
99
            printf( "parasite" );
100
        else printf( "externally" );
101
        printf( " powered\n" );
102
    }
103
 
104
    printf("CanInit...\n");
105
    if (Can_Init() != CAN_OK) {
106
        printf("FAILED!\n");
107
    }
108
    else {
109
        printf("OK!\n");
110
    }
111
 
169 arune 112
    uint32_t timeStamp = 0;
113
 
153 arune 114
    Can_Message_t txMsg;
115
    Can_Message_t rxMsg;
116
 
117
    txMsg.DataLength = 2;
167 eqlazer 118
    txMsg.Id = 0;
153 arune 119
    txMsg.RemoteFlag = 0;
120
    txMsg.ExtendedFlag = 1;
169 arune 121
 
122
    /* main loop */
153 arune 123
    while (1) {
124
        /* service the CAN routines */
125
        Can_Service();
126
 
127
        /* check if any messages have been received */
128
        while (Can_Receive(&rxMsg) == CAN_OK) {
169 arune 129
 
130
        }
153 arune 131
 
132
        /* check temperature and send on CAN once every other second */
133
        if (Timebase_PassedTimeMillis(timeStamp) >= 2000) {
134
            timeStamp = Timebase_CurrentTime();
135
 
136
            if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) == DS18X20_OK) {
169 arune 137
                printf("Measuring temperature... ");
153 arune 138
                delay_ms(DS18B20_TCONV_12BIT);
139
                for ( i=0; i<nSensors; i++ ) {
140
                    if ( DS18X20_read_meas( &gSensorIDs[i][0], &subzero,
141
                            &cel, &cel_frac_bits) == DS18X20_OK ) {
142
 
143
                        //txMsg.Data.bytes[0] = subzero;
144
                        if (subzero) {
145
                            txMsg.Data.bytes[i*2] = -cel;
169 arune 146
                            txMsg.Data.bytes[i*2+1] = ~(cel_frac_bits<<4);
153 arune 147
                        } else {
148
                            txMsg.Data.bytes[i*2] = cel;
169 arune 149
                            txMsg.Data.bytes[i*2+1] = (cel_frac_bits<<4);
153 arune 150
                        }
169 arune 151
 
153 arune 152
                    }
154 arune 153
                    else printf("CRC Error (lost connection?)\n");
153 arune 154
                }
169 arune 155
 
156
                txMsg.DataLength = nSensors*2;
157
                printf("sending...\n");
158
                /* send txMsg */
159
                Can_Send(&txMsg);
153 arune 160
            }
154 arune 161
            else printf("Start meas. failed (short circuit?)\n");
153 arune 162
 
163
        }
164
    }
165
 
166
    return 0;
167
}