Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
275 johboh 1
/*********************************************************************
129 johboh 2
 *
3
 *                  Main application
4
 *
5
 *********************************************************************
6
 * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canTemp/Source/Main.c $
7
 * Last changed:    $LastChangedDate: 2007-02-26 21:38:37 +0100 (Mon, 26 Feb 2007) $
8
 * By:              $LastChangedBy: johboh $
9
 * Revision:        $Revision: 342 $
10
 ********************************************************************/
11
 
12
 
13
#include <compiler.h>
14
#include <stackTasks.h>
15
#include <Tick.h>
16
#include <funcdefs.h>
260 johboh 17
#include <CAN.h>
339 johboh 18
#include "..\canBoot\Include\boot.h"
129 johboh 19
 
20
 
139 johboh 21
#ifdef USE_ADC
22
    #include <adc.h>
23
#endif
24
 
275 johboh 25
#ifdef USE_BLINDS
26
    #include <blinds.h>
27
#endif
28
 
129 johboh 29
static void mainInit(void);
30
 
31
void main()
32
{
275 johboh 33
 
129 johboh 34
    static TICK t = 0;
339 johboh 35
    CAN_PACKET outCp;
129 johboh 36
 
37
    // Inits
38
    mainInit();
275 johboh 39
 
260 johboh 40
    canInit();
129 johboh 41
 
139 johboh 42
    #ifdef USE_ADC
43
        adcInit(TRUE,0b1011);
44
    #endif
45
 
275 johboh 46
    #ifdef USE_BLINDS
47
        blindsInit();
339 johboh 48
        blindsTurn(0);
49
    #else
50
        BLINDS0P_IO=0;
275 johboh 51
    #endif
129 johboh 52
 
275 johboh 53
 
129 johboh 54
    while(1)
55
    {
56
        static TICK t = 0;
139 johboh 57
        static TICK temperature = 0;
339 johboh 58
        static BOOL getNewTemperature = TRUE;
139 johboh 59
        static BYTE lastTemperature = TEMPERATURE_INSIDE;
275 johboh 60
        static TICK blinds = 0;
129 johboh 61
 
62
        if ((tickGet()-t)>TICK_SECOND)
63
        {
64
            LED0_IO=~LED0_IO;
65
            t = tickGet();
66
        }
139 johboh 67
 
339 johboh 68
 
277 johboh 69
        #ifdef USE_BLINDS
339 johboh 70
        if ((tickGet()-blinds)>3*TICK_SECOND)
275 johboh 71
        {
339 johboh 72
            outCp.type=ptPGM;
73
            outCp.pgm.class=pcSENSOR;
74
            outCp.pgm.id=pstBLIND_TR;
75
            outCp.length=1;
76
            outCp.data[0]=blindsGetPrecent();
77
            while(!canSendMessage(outCp,PRIO_HIGH));
275 johboh 78
            blinds = tickGet();
79
        }
277 johboh 80
        #endif
339 johboh 81
 
275 johboh 82
 
139 johboh 83
        #ifdef USE_ADC
339 johboh 84
        if ((tickGet()-temperature)>TICK_SECOND*2 && getNewTemperature==TRUE) // Each 2 second, read temperature.
139 johboh 85
        {
86
            if (lastTemperature==TEMPERATURE_INSIDE) lastTemperature=TEMPERATURE_OUTSIDE; else lastTemperature=TEMPERATURE_INSIDE;
87
            adcConvert(lastTemperature);
88
            temperature = tickGet();
339 johboh 89
            getNewTemperature=FALSE;
139 johboh 90
        }
91
        #endif
92
 
93
 
94
        #ifdef USE_ADC
95
        if (adcDone()) // Has temperature, send it to the bus
96
        {
97
            BYTE decimal;
98
            signed char tenth;
339 johboh 99
            unsigned long q;
139 johboh 100
            temperatureRead(&tenth,&decimal);
339 johboh 101
            q = adcGetRaw();
102
            getNewTemperature=TRUE;
139 johboh 103
 
339 johboh 104
            outCp.type=ptPGM;
105
            outCp.pgm.class =pcSENSOR;
106
            outCp.pgm.id    =(lastTemperature==TEMPERATURE_INSIDE?pstTEMP_INSIDE:pstTEMP_OUTSIDE);
107
            outCp.length    =2;
342 johboh 108
            outCp.data[1]   = tenth; //  signed 10 an 1 decimal.
109
            outCp.data[0]   = decimal; //  Decimal value, 0-9
110
            while(!canSendMessage(outCp,PRIO_HIGH));
139 johboh 111
        }
112
        #endif
113
 
129 johboh 114
    }
115
}
116
 
117
 
118
#pragma interrupt high_isr
119
void high_isr(void)
120
{
260 johboh 121
    canISR();
129 johboh 122
}
123
 
124
 
125
#pragma interrupt low_isr
126
void low_isr(void)
127
{
139 johboh 128
    #ifdef USE_ADC
129
        adcISR();
130
    #endif
339 johboh 131
 
132
    #ifdef USE_BLINDS
133
        blindsISR();
134
    #endif
129 johboh 135
}
136
 
137
 
138
 
139
/*
140
*   Function: mainInit
141
*
142
*   Input:  none
143
*   Output: none
144
*   Pre-conditions: none
145
*   Affects: Se code
146
*   Depends: none.
147
*/
148
void mainInit()
149
{
275 johboh 150
    LED0_TRIS=0;
151
    BLINDS0_TRIS=0;
297 johboh 152
    BLINDS0P_TRIS=0;
129 johboh 153
 
154
    // Enable Interrupts
155
    INTCONbits.GIEH = 1;
156
    INTCONbits.GIEL = 1;
157
 
158
    // Enable interrupt prirority
159
    RCONbits.IPEN=1;
160
}
161
 
162
/*
163
*   Function: canParse
164
*
165
*   Input:  Received can message
166
*   Output: none
167
*   Pre-conditions: canInit and received packet.
168
*   Affects: Sensors/actuators/etc. See code.
169
*   Depends: none.
170
*/
260 johboh 171
 
339 johboh 172
void canParse(CAN_PACKET cp)
129 johboh 173
{
339 johboh 174
    #ifdef USE_BLINDS
175
    if (cp.pgm.class==pcACTUATOR && cp.pgm.id==patBLIND_TR)
176
    {
177
        blindsTurn(cp.data[0]);
178
    }
179
    #endif
129 johboh 180
}
181
 
182
 
183
// Below are mandantory when using bootloader
184
// define DEBUG_MODE to use without bootloader.
185
 
186
#ifndef DEBUG_MODE
187
extern void _startup (void);
339 johboh 188
#pragma code _RESET_INTERRUPT_VECTOR = RM_RESET_VECTOR
129 johboh 189
void _reset (void)
190
{
191
    _asm goto _startup _endasm
192
}
193
#pragma code
194
#endif
195
 
339 johboh 196
#pragma code _HIGH_INTERRUPT_VECTOR = RM_HIGH_INTERRUPT_VECTOR
129 johboh 197
void _high_ISR (void)
198
{
199
    _asm GOTO high_isr _endasm
200
}
201
#pragma code
202
 
339 johboh 203
#pragma code _LOW_INTERRUPT_VECTOR = RM_LOW_INTERRUPT_VECTOR
129 johboh 204
void _low_ISR (void)
205
{
206
    _asm GOTO low_isr _endasm
207
}
208
#pragma code