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
 *
184 eqlazer 15
 *  TODO fixa så status/temp ligger i en funktion
185 eqlazer 16
 *  temperaturomvandlingen fungerar fint
184 eqlazer 17
 *  fixa så adcn inte pollas hela tiden, det tar för mycket tid
185 eqlazer 18
 *  kunna använda Vref = 1.1
184 eqlazer 19
 *
171 eqlazer 20
 */
21
 
177 eqlazer 22
/*
23
 * For testing with ATmega88 PDIP enable this fetaure
24
 * Since PDIP doesn't have ADC7 it will use the ADC0 instead
25
 */
184 eqlazer 26
#define PDIP    1
27
#define DEBUG   0 /* Prints debug messages to uart */
177 eqlazer 28
 
171 eqlazer 29
/*-----------------------------------------------------------------------------
30
 * Includes
31
 *---------------------------------------------------------------------------*/
32
/* system files */
33
#include <avr/io.h>
34
#include <avr/interrupt.h>
35
#include <avr/wdt.h>
36
#include <stdio.h>
37
/* lib files */
38
#include <can.h>
39
#include <serial.h>
40
#include <timebase.h>
177 eqlazer 41
/* defines */
185 eqlazer 42
#define OFF     0x00
43
#define ON      0x01
44
#define Vref    5 /* For Aref use 5, internal ref 1.1 */
171 eqlazer 45
 
46
/*-----------------------------------------------------------------------------
47
 * Main Program
48
 *---------------------------------------------------------------------------*/
49
int main(void) {
50
 
51
    uint8_t relayStatus;
184 eqlazer 52
    uint32_t boardTemperature;
171 eqlazer 53
 
176 eqlazer 54
    Timebase_Init();
185 eqlazer 55
#if DEBUG
176 eqlazer 56
    Serial_Init();
185 eqlazer 57
#endif
176 eqlazer 58
    sei();
171 eqlazer 59
 
176 eqlazer 60
    /* Turn relay off */
61
    PORTC &= ~(1<<PC1);
171 eqlazer 62
    DDRC |= (1<<DDC1);
175 eqlazer 63
 
171 eqlazer 64
    relayStatus = OFF;
65
 
175 eqlazer 66
    /* Initiate ADC for reading temperature sensor */
171 eqlazer 67
 
175 eqlazer 68
    /* Wake up ADC */
69
    PRR &= ~(1<<PRADC);
177 eqlazer 70
#if PDIP
71
    /* Enable AREF and ADC0 (For PDIP package) */
184 eqlazer 72
    ADMUX = 0x00; // TODO 0x00 för aref, 0xc0 för internal 1,1
177 eqlazer 73
#else
74
    /* Enable AREF and ADC7 (For TQFP package) */
175 eqlazer 75
    ADMUX = 0x07;
177 eqlazer 76
#endif
175 eqlazer 77
    ADCSRA |= (1<<ADEN);
78
 
184 eqlazer 79
#if DEBUG
176 eqlazer 80
    printf("\n------------------------------------------------------------\n");
81
    printf(  "   CAN: Relay\n");
82
    printf(  "------------------------------------------------------------\n");
171 eqlazer 83
 
84
 
176 eqlazer 85
    printf("CanInit...");
86
    if (Can_Init() != CAN_OK) {
87
        printf("FAILED!\n");
175 eqlazer 88
    }else{
89
        printf("OK!\n");
90
    }
185 eqlazer 91
#else
92
    Can_Init();
184 eqlazer 93
#endif
175 eqlazer 94
    uint32_t timeStamp = 0;
171 eqlazer 95
 
175 eqlazer 96
    Can_Message_t txMsg;
97
    Can_Message_t rxMsg;
98
    txMsg.Id = 0;
99
    txMsg.RemoteFlag = 0;
100
    txMsg.ExtendedFlag = 1;
101
 
102
    /* main loop */
103
    while (1) {
104
        /* service the CAN routines */
105
        Can_Service();
106
 
107
        /* check if any messages have been received */
108
        while (Can_Receive(&rxMsg) == CAN_OK) {
171 eqlazer 109
            /* This relay is adressed*/
110
            if( rxMsg.Id == 0x1200 ){
111
 
112
                if( rxMsg.Data.bytes[0] == 0x01 ){
113
                    /* Turn relay on */
114
 
175 eqlazer 115
                    /* Set as input and enable pull-up */
116
                    DDRC &= ~(1<<DDC1);
117
                    PORTC |= (1<<PC1);
118
 
171 eqlazer 119
                    relayStatus = ON;
184 eqlazer 120
#if DEBUG
121
                    printf("turn on\n");
122
#endif
171 eqlazer 123
 
124
                }else if(rxMsg.Data.bytes[0] == 0x02){
125
                    /* Turn relay off */
126
 
176 eqlazer 127
                    PORTC &= ~(1<<PC1);
175 eqlazer 128
                    DDRC |= (1<<DDC1);
129
 
171 eqlazer 130
                    relayStatus = OFF;
184 eqlazer 131
#if DEBUG
132
                    printf("turn off\n");
133
#endif
171 eqlazer 134
 
135
                }else if(rxMsg.Data.bytes[0] == 0x03){
136
                    /* Toggle relay */
137
 
138
                    if(relayStatus == ON){
176 eqlazer 139
                        PORTC &= ~(1<<PC1);
175 eqlazer 140
                        DDRC |= (1<<DDC1);
184 eqlazer 141
#if DEBUG
142
                        printf("toggle: turn off\n");
143
#endif
176 eqlazer 144
 
171 eqlazer 145
                        relayStatus = OFF;
175 eqlazer 146
 
171 eqlazer 147
                    }else{
175 eqlazer 148
                        DDRC &= ~(1<<DDC1);
149
                        PORTC |= (1<<PC1);
184 eqlazer 150
#if DEBUG
151
                        printf("toggle: turn on\n");
152
#endif
176 eqlazer 153
 
171 eqlazer 154
                        relayStatus = ON;
155
                    }
156
 
157
                }else if(rxMsg.Data.bytes[0] == 0x04){
158
                    /* Get relay status (ON/OFF?, temperature) */
184 eqlazer 159
                    ADCSRA |= (1<<ADSC);
160
 
161
                    /* Wait for conversion to complete */
162
                    while( ADCSRA & (1<<ADSC) ){}
163
 
164
                    txMsg.Id = 0x1201; // temporary ID
165
 
185 eqlazer 166
                    txMsg.Data.bytes[2] = relayStatus;
184 eqlazer 167
 
168
                    /* Convert voltage to temperature */
169
 
170
                    boardTemperature = ADCW;
171
 
172
                    boardTemperature = boardTemperature*Vref;
173
                    boardTemperature = (boardTemperature*100/1024)-50;
174
 
175
                    /* Save and send */
185 eqlazer 176
                    txMsg.Data.bytes[0]= boardTemperature & 0x00FF;
177
                    txMsg.Data.bytes[1]= (boardTemperature & 0xFF00)>>8;
184 eqlazer 178
 
179
                    txMsg.DataLength = 3;
180
 
181
                    Can_Send( &txMsg );
171 eqlazer 182
                }
183
            }
184
        }
185
 
175 eqlazer 186
        // TODO
187
        // ska status på relä och temperatur skickas periodiskt?
188
        // tätare intervall om temperaturen kommer över en viss gräns?
189
 
184 eqlazer 190
        if( Timebase_PassedTimeMillis(timeStamp) >=10000){
171 eqlazer 191
            timeStamp = Timebase_CurrentTime();
177 eqlazer 192
            /* Get relay status (ON/OFF?, temperature) and send */
171 eqlazer 193
 
184 eqlazer 194
            ADCSRA |= (1<<ADSC);
195
 
196
            /* Wait for conversion to complete */
197
            while( ADCSRA & (1<<ADSC) ){}
198
 
199
            txMsg.Id = 0x1201; // temporary ID
200
 
185 eqlazer 201
            txMsg.Data.bytes[2] = relayStatus;
184 eqlazer 202
 
203
            /* Convert voltage to temperature */
204
 
205
            boardTemperature = ADCW;
206
 
207
            boardTemperature = boardTemperature*Vref;
208
            boardTemperature = (boardTemperature*100/1024)-50;
209
 
210
            /* Save and send */
185 eqlazer 211
            txMsg.Data.bytes[0]= boardTemperature & 0x00FF;
212
            txMsg.Data.bytes[1]= (boardTemperature & 0xFF00)>>8;
184 eqlazer 213
 
214
            txMsg.DataLength = 3;
215
            Can_Send( &txMsg );
216
#if DEBUG
217
            printf("Message sent...\n");
218
            printf("Temperature: %d\nRelay status: %x, %u\n", boardTemperature, relayStatus, relayStatus);
219
#endif
220
 
171 eqlazer 221
        }
177 eqlazer 222
    }
223
    return 0;
171 eqlazer 224
}
175 eqlazer 225