Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
171 eqlazer 1
/**
177 eqlazer 2
 * CAN Relay.
3
 *
4
 *
5
 * @date    2006-12-17
6
 * @author  Erik Larsson
7
 *
185 eqlazer 8
 *   Observera! Applikationen är endast testad på labplatta med m88, pot och lysdiod
177 eqlazer 9
 *
175 eqlazer 10
 *   ADC=Vin*1024/Vref
176 eqlazer 11
 *   Vout=( 10 mV/C )( Temperature C ) + 500 mV
175 eqlazer 12
 *
185 eqlazer 13
 *  Transmitts: DATA: <temperature low byte> <temperature high byte> <relay status>
176 eqlazer 14
 *
187 eqlazer 15
 *  TODO
184 eqlazer 16
 *  fixa så adcn inte pollas hela tiden, det tar för mycket tid
185 eqlazer 17
 *  kunna använda Vref = 1.1
184 eqlazer 18
 *
187 eqlazer 19
 *
171 eqlazer 20
 */
21
 
184 eqlazer 22
#define DEBUG   0 /* Prints debug messages to uart */
177 eqlazer 23
 
171 eqlazer 24
/*-----------------------------------------------------------------------------
25
 * Includes
26
 *---------------------------------------------------------------------------*/
27
/* system files */
28
#include <avr/io.h>
29
#include <avr/interrupt.h>
30
#include <avr/wdt.h>
31
#include <stdio.h>
32
/* lib files */
33
#include <can.h>
34
#include <serial.h>
35
#include <timebase.h>
187 eqlazer 36
 
37
#include <tc1047.h>
38
 
177 eqlazer 39
/* defines */
187 eqlazer 40
#define RELAY_OFF           0x01
41
#define RELAY_ON            0x02
42
#define FAILSAFE_MODE       0x0F
43
#define FAILSAFE_TRESHOLD   60  /* Degrees when nodeRelay goes into failsafe mode */
171 eqlazer 44
 
187 eqlazer 45
#define RELAY_CMD_GET       0x1200
46
#define RELAY_CMD_SEND      0x1201
47
#define RELAY_CMD_ON        0x01
48
#define RELAY_CMD_OFF       0x02
49
#define RELAY_CMD_TOGGLE    0x03
50
#define RELAY_CMD_STATUS    0x04
51
#define RELAY_CMD_RESET     0x05
52
#define STATUS_SEND_PERIOD  10000 /* milliseconds */
53
#define FAILSAFE_SEND_PERIOD  10000 /* milliseconds */
54
 
55
/*----------------------------------------------------------------------------
56
 * Functions
57
 * -------------------------------------------------------------------------*/
58
uint8_t relayOff();
59
uint8_t relayOn();
60
void relayFailsafe();
61
 
171 eqlazer 62
/*-----------------------------------------------------------------------------
63
 * Main Program
64
 *---------------------------------------------------------------------------*/
65
int main(void) {
66
 
67
    uint8_t relayStatus;
187 eqlazer 68
    uint32_t boardTemperature = 0;
171 eqlazer 69
 
187 eqlazer 70
    adcTemperatureInit();
71
 
176 eqlazer 72
    Timebase_Init();
185 eqlazer 73
#if DEBUG
176 eqlazer 74
    Serial_Init();
185 eqlazer 75
#endif
176 eqlazer 76
    sei();
171 eqlazer 77
 
176 eqlazer 78
    /* Turn relay off */
187 eqlazer 79
    relayStatus = relayOff();
175 eqlazer 80
 
184 eqlazer 81
#if DEBUG
176 eqlazer 82
    printf("\n------------------------------------------------------------\n");
83
    printf(  "   CAN: Relay\n");
84
    printf(  "------------------------------------------------------------\n");
171 eqlazer 85
 
86
 
176 eqlazer 87
    printf("CanInit...");
88
    if (Can_Init() != CAN_OK) {
89
        printf("FAILED!\n");
175 eqlazer 90
    }else{
91
        printf("OK!\n");
92
    }
185 eqlazer 93
#else
94
    Can_Init();
184 eqlazer 95
#endif
175 eqlazer 96
    uint32_t timeStamp = 0;
171 eqlazer 97
 
175 eqlazer 98
    Can_Message_t txMsg;
99
    Can_Message_t rxMsg;
187 eqlazer 100
    txMsg.Id = RELAY_CMD_SEND;
175 eqlazer 101
    txMsg.RemoteFlag = 0;
102
    txMsg.ExtendedFlag = 1;
187 eqlazer 103
    txMsg.DataLength = 3;
175 eqlazer 104
 
105
    /* main loop */
106
    while (1) {
107
        /* service the CAN routines */
108
        Can_Service();
109
 
110
        /* check if any messages have been received */
111
        while (Can_Receive(&rxMsg) == CAN_OK) {
171 eqlazer 112
            /* This relay is adressed*/
187 eqlazer 113
            if( rxMsg.Id == RELAY_CMD_GET ){
171 eqlazer 114
 
187 eqlazer 115
                if( rxMsg.Data.bytes[0] == RELAY_CMD_ON ){
171 eqlazer 116
                    /* Turn relay on */
187 eqlazer 117
                    relayStatus = relayOn();
171 eqlazer 118
 
187 eqlazer 119
                }else if(rxMsg.Data.bytes[0] == RELAY_CMD_OFF){
120
                    /* Turn relay off */
121
                    relayStatus = relayOff();
175 eqlazer 122
 
187 eqlazer 123
                }else if(rxMsg.Data.bytes[0] == RELAY_CMD_TOGGLE ){
124
                    /* Toggle relay */
171 eqlazer 125
 
187 eqlazer 126
                    if(relayStatus == RELAY_OFF){
127
                        relayStatus = relayOn();
128
                    }else{
129
                        relayStatus = relayOff();
130
                    }
171 eqlazer 131
 
187 eqlazer 132
                }else if(rxMsg.Data.bytes[0] == RELAY_CMD_STATUS){
133
                    /* Send relay status to CAN */
175 eqlazer 134
 
187 eqlazer 135
                    boardTemperature = getTC1047temperature();
171 eqlazer 136
 
187 eqlazer 137
                    if( boardTemperature >= FAILSAFE_TRESHOLD ){
138
                        relayFailsafe();
139
                    }else{
140
                        txMsg.Data.bytes[0] = boardTemperature & 0x00FF;
141
                        txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8;
142
                        txMsg.Data.bytes[2] = relayStatus;
171 eqlazer 143
 
187 eqlazer 144
                        Can_Send( &txMsg );
145
                    }
146
                }
147
            }
148
        }
149
 
150
        if( Timebase_PassedTimeMillis(timeStamp) >= STATUS_SEND_PERIOD ){
151
            timeStamp = Timebase_CurrentTime();
152
            /* Send relay status to CAN */
153
 
154
            boardTemperature = getTC1047temperature();
155
 
156
            if( boardTemperature >= FAILSAFE_TRESHOLD ){
157
                relayFailsafe();
158
            }else{
159
                txMsg.Data.bytes[0] = boardTemperature & 0x00FF;
160
                txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8;
161
                txMsg.Data.bytes[2] = relayStatus;
162
 
163
                Can_Send( &txMsg );
184 eqlazer 164
#if DEBUG
187 eqlazer 165
                printf("Periodic message sent...\n");
166
                printf("Temperature: %d\nRelay status: %u\n", boardTemperature, relayStatus);
184 eqlazer 167
#endif
187 eqlazer 168
            }
169
        }
170
    }
171
    return 0;
172
}
176 eqlazer 173
 
187 eqlazer 174
uint8_t relayOff()
175
{
176
    /* Set as output and sink */
177
    PORTC &= ~(1<<PC1);
178
    DDRC |= (1<<DDC1);
175 eqlazer 179
 
184 eqlazer 180
#if DEBUG
187 eqlazer 181
    printf("relay turned off\n");
184 eqlazer 182
#endif
176 eqlazer 183
 
187 eqlazer 184
    return RELAY_OFF;
185
}
171 eqlazer 186
 
187 eqlazer 187
uint8_t relayOn()
188
{
189
    /* Set as input and enable pull-up */
190
    DDRC &= ~(1<<DDC1);
191
    PORTC |= (1<<PC1);
184 eqlazer 192
 
187 eqlazer 193
#if DEBUG
194
    printf("relay turned on\n");
195
#endif
184 eqlazer 196
 
187 eqlazer 197
    return RELAY_ON;
198
}
184 eqlazer 199
 
187 eqlazer 200
void relayFailsafe()
201
{
202
    uint8_t relayStatus;
203
    uint32_t boardTemperature = 0, timeStamp = 0;
184 eqlazer 204
 
187 eqlazer 205
    Can_Message_t txMsg;
206
    Can_Message_t rxMsg;
207
    txMsg.Id = RELAY_CMD_SEND;
208
    txMsg.RemoteFlag = 0;
209
    txMsg.ExtendedFlag = 1;
210
    txMsg.DataLength = 4;
184 eqlazer 211
 
187 eqlazer 212
    relayStatus = relayOff();
184 eqlazer 213
 
187 eqlazer 214
    while(1){
215
        /* service the CAN routines */
216
        Can_Service();
184 eqlazer 217
 
187 eqlazer 218
        /* check if any messages have been received */
219
        while (Can_Receive(&rxMsg) == CAN_OK) {
220
            /* This relay is adressed*/
221
            if( rxMsg.Id == RELAY_CMD_GET ){
222
                if( rxMsg.Data.bytes[0] == RELAY_CMD_RESET ){
223
                    /* Return from failsafe mode */
224
                    return 0;
171 eqlazer 225
                }
226
            }
227
        }
228
 
187 eqlazer 229
        if( Timebase_PassedTimeMillis(timeStamp) >= FAILSAFE_SEND_PERIOD ){
171 eqlazer 230
            timeStamp = Timebase_CurrentTime();
187 eqlazer 231
            /* Send relay status to CAN */
171 eqlazer 232
 
187 eqlazer 233
            boardTemperature = getTC1047temperature();
184 eqlazer 234
 
187 eqlazer 235
            txMsg.Data.bytes[0] = boardTemperature & 0x00FF;
236
            txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8;
185 eqlazer 237
            txMsg.Data.bytes[2] = relayStatus;
187 eqlazer 238
            txMsg.Data.bytes[3] = FAILSAFE_MODE;
184 eqlazer 239
 
240
            Can_Send( &txMsg );
171 eqlazer 241
        }
177 eqlazer 242
    }
171 eqlazer 243
}
175 eqlazer 244