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