Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
171 eqlazer 1
/**
2
 * CAN Test. This program sends a CAN message once every second. The ID of the
3
 * message is increased each time for testing purposes.
4
 * Added LCD output
5
 *
6
 * @date    2006-11-21, LCD addition 2006-12-11
7
 * @author  Jimmy Myhrman, Erik Larsson
8
 *  
9
 *   Observera! Applikationen är helt otestad
175 eqlazer 10
 *   ADC=Vin*1024/Vref
176 eqlazer 11
 *   Vout=( 10 mV/C )( Temperature C ) + 500 mV
175 eqlazer 12
 *
176 eqlazer 13
 *  Transmitts: DATA: <temperature high byte> <temperature low byte> <relay status>
14
 *
171 eqlazer 15
 */
16
 
17
/*-----------------------------------------------------------------------------
18
 * Includes
19
 *---------------------------------------------------------------------------*/
20
/* system files */
21
#include <avr/io.h>
22
#include <avr/interrupt.h>
23
#include <avr/wdt.h>
24
#include <stdio.h>
25
/* lib files */
26
#include <can.h>
27
#include <serial.h>
28
#include <timebase.h>
29
 
30
#define OFF     0x00
31
#define ON      0x01
176 eqlazer 32
#define Vref    5
171 eqlazer 33
 
175 eqlazer 34
/*------------------------------------------------------------------------------
35
 * Read relay state (OPEN/CLOSED) and temperature
36
 * ---------------------------------------------------------------------------*/
176 eqlazer 37
void sendRelayStatus( Can_Message_t* msg, uint8_t state )
175 eqlazer 38
{
176 eqlazer 39
    int16_t temp;
175 eqlazer 40
 
176 eqlazer 41
    /* Start measureing */
42
    ADCSRA |= (1<<ADSC);
175 eqlazer 43
 
176 eqlazer 44
    /* Wait for conversion to complete */
45
    while( ADCSRA & (1<<ADSC) ){}
175 eqlazer 46
 
176 eqlazer 47
    msg->Id = 0x1201; // temporary ID
175 eqlazer 48
 
176 eqlazer 49
    msg->Data.bytes[0] = state;
50
 
51
    /* Convert voltage to temperature */
52
    temp = (ADCL & (ADCH<<8));
53
    temp = temp*Vref/1024;
54
    temp = (temp - 0.5)/(0.01);
55
 
56
    msg->Data.bytes[1]= temp;
57
    msg->Data.bytes[2]= (temp>>8);
58
    msg->DataLength = 3;
59
 
60
    Can_Send( &msg );
175 eqlazer 61
}
62
 
171 eqlazer 63
/*-----------------------------------------------------------------------------
64
 * Main Program
65
 *---------------------------------------------------------------------------*/
66
int main(void) {
67
 
68
    uint8_t relayStatus;
69
 
176 eqlazer 70
    Timebase_Init();
71
    Serial_Init();
72
    sei();
171 eqlazer 73
 
176 eqlazer 74
    /* Turn relay off */
75
    PORTC &= ~(1<<PC1);
171 eqlazer 76
    DDRC |= (1<<DDC1);
175 eqlazer 77
 
171 eqlazer 78
    relayStatus = OFF;
79
 
175 eqlazer 80
    /* Initiate ADC for reading temperature sensor */
171 eqlazer 81
 
175 eqlazer 82
    /* Wake up ADC */
83
    PRR &= ~(1<<PRADC);
84
    /* Enable AREF and ADC7 */
85
    ADMUX = 0x07;
86
    ADCSRA |= (1<<ADEN);
87
 
176 eqlazer 88
    printf("\n------------------------------------------------------------\n");
89
    printf(  "   CAN: Relay\n");
90
    printf(  "------------------------------------------------------------\n");
171 eqlazer 91
 
92
 
176 eqlazer 93
    printf("CanInit...");
94
    if (Can_Init() != CAN_OK) {
95
        printf("FAILED!\n");
175 eqlazer 96
    }else{
97
        printf("OK!\n");
98
    }
171 eqlazer 99
 
175 eqlazer 100
    uint32_t timeStamp = 0;
171 eqlazer 101
 
175 eqlazer 102
    Can_Message_t txMsg;
103
    Can_Message_t rxMsg;
104
    txMsg.Id = 0;
105
    txMsg.RemoteFlag = 0;
106
    txMsg.ExtendedFlag = 1;
107
 
108
 
109
    /* main loop */
110
    while (1) {
111
        /* service the CAN routines */
112
        Can_Service();
113
 
114
        /* check if any messages have been received */
115
        while (Can_Receive(&rxMsg) == CAN_OK) {
171 eqlazer 116
            /* This relay is adressed*/
117
            if( rxMsg.Id == 0x1200 ){
118
 
119
                if( rxMsg.Data.bytes[0] == 0x01 ){
120
                    /* Turn relay on */
121
 
175 eqlazer 122
                    /* Set as input and enable pull-up */
123
                    DDRC &= ~(1<<DDC1);
124
                    PORTC |= (1<<PC1);
125
 
171 eqlazer 126
                    relayStatus = ON;
127
 
128
                }else if(rxMsg.Data.bytes[0] == 0x02){
129
                    /* Turn relay off */
130
 
176 eqlazer 131
                    PORTC &= ~(1<<PC1);
175 eqlazer 132
                    DDRC |= (1<<DDC1);
133
 
171 eqlazer 134
                    relayStatus = OFF;
135
 
136
                }else if(rxMsg.Data.bytes[0] == 0x03){
137
                    /* Toggle relay */
138
 
139
                    if(relayStatus == ON){
176 eqlazer 140
                        PORTC &= ~(1<<PC1);
175 eqlazer 141
                        DDRC |= (1<<DDC1);
176 eqlazer 142
 
171 eqlazer 143
                        relayStatus = OFF;
175 eqlazer 144
 
171 eqlazer 145
                    }else{
175 eqlazer 146
                        DDRC &= ~(1<<DDC1);
147
                        PORTC |= (1<<PC1);
176 eqlazer 148
 
171 eqlazer 149
                        relayStatus = ON;
150
                    }
151
 
152
                }else if(rxMsg.Data.bytes[0] == 0x04){
153
                    /* Get relay status (ON/OFF?, temperature) */
176 eqlazer 154
                    sendRelayStatus( &txMsg, relayStatus );
171 eqlazer 155
                }
156
            }
157
        }
158
 
175 eqlazer 159
        // TODO
160
        // ska status på relä och temperatur skickas periodiskt?
161
        // tätare intervall om temperaturen kommer över en viss gräns?
162
 
171 eqlazer 163
        if( Timebase_PassedTimeMillis(timeStamp) >=5000){
164
            timeStamp = Timebase_CurrentTime();
175 eqlazer 165
            /* Get relay status (ON/OFF?, temperature) */
171 eqlazer 166
 
176 eqlazer 167
             sendRelayStatus( &txMsg, relayStatus );
171 eqlazer 168
        }
169
    }
170
    return 0;
171
}
175 eqlazer 172