Subversion Repositories HomeAutomation

Rev

Rev 129 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 129 Rev 140
1
/*********************************************************************
1
/*********************************************************************
2
 *
2
 *
3
 *                  Main application
3
 *                  Main application
4
 *
4
 *
5
 *********************************************************************
5
 *********************************************************************
6
 * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canLCD/Source/Main.c $
6
 * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canLCD/Source/Main.c $
7
 * Last changed:    $LastChangedDate: 2006-11-20 17:54:03 +0100 (Mon, 20 Nov 2006) $
7
 * Last changed:    $LastChangedDate: 2006-11-21 10:28:39 +0100 (Tue, 21 Nov 2006) $
8
 * By:              $LastChangedBy: johboh $
8
 * By:              $LastChangedBy: johboh $
9
 * Revision:        $Revision: 129 $
9
 * Revision:        $Revision: 140 $
10
 ********************************************************************/
10
 ********************************************************************/
11
 
11
 
12
 
12
 
13
#include <compiler.h>
13
#include <compiler.h>
14
#include <stackTasks.h>
14
#include <stackTasks.h>
15
#include <Tick.h>
15
#include <Tick.h>
16
#include <funcdefs.h>
16
#include <funcdefs.h>
17
#include <EEaccess.h>
17
#include <EEaccess.h>
-
 
18
 
-
 
19
#ifdef USE_LCD
-
 
20
    #include "lcd.h"
-
 
21
#endif
18
 
22
 
19
#ifdef USE_CAN
23
#ifdef USE_CAN
20
    #include <CAN.h>
24
    #include <CAN.h>
21
#endif
25
#endif
22
 
26
 
23
static void mainInit(void);
27
static void mainInit(void);
24
 
28
 
25
 
29
 
26
static int MY_ID = DEFAULT_ID;
30
static int MY_ID = DEFAULT_ID;
27
static BYTE MY_NID = DEFAULT_NID;
31
static BYTE MY_NID = DEFAULT_NID;
28
 
32
 
29
void main()
33
void main()
30
{
34
{
31
    static TICK t = 0;
35
    static TICK t = 0;
32
    CAN_MESSAGE outCm;
36
    CAN_MESSAGE outCm;
33
 
37
 
34
    // Inits
38
    // Inits
35
 
39
 
36
    mainInit();
40
    mainInit();
37
 
41
 
38
    #ifdef USE_CAN
42
    #ifdef USE_CAN
39
        canInit();
43
        canInit();
-
 
44
    #endif
-
 
45
 
-
 
46
    #ifdef USE_LCD
-
 
47
        lcdInit();
-
 
48
        lcdClear();
-
 
49
        lcdPutrs("Welcome!");
40
    #endif
50
    #endif
41
 
51
 
42
    tickInit();
52
    tickInit();
43
 
53
 
44
    // Read ID and NID if exist.
54
    // Read ID and NID if exist.
45
    if (EERead(NODE_ID_EE)==NODE_HAS_ID)
55
    if (EERead(NODE_ID_EE)==NODE_HAS_ID)
46
    {
56
    {
47
        MY_ID=(((WORD)EERead(NODE_ID_EE + 1))<<8)+EERead(NODE_ID_EE + 2);
57
        MY_ID=(((WORD)EERead(NODE_ID_EE + 1))<<8)+EERead(NODE_ID_EE + 2);
48
        MY_NID=EERead(NODE_ID_EE + 3);
58
        MY_NID=EERead(NODE_ID_EE + 3);
49
    }
59
    }
50
 
60
 
51
    // Send user program startup heatbeat
61
    // Send user program startup heatbeat
52
    outCm.funct                     = FUNCT_BOOTLOADER;
62
    outCm.funct                     = FUNCT_BOOTLOADER;
53
    outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
63
    outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
54
    outCm.nid                       = MY_NID;
64
    outCm.nid                       = MY_NID;
55
    outCm.sid                       = MY_ID;
65
    outCm.sid                       = MY_ID;
56
    outCm.data_length               = 1;
66
    outCm.data_length               = 1;
57
    outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_USER_STARTUP;
67
    outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_USER_STARTUP;
58
    while(!canSendMessage(outCm,PRIO_HIGH));
68
    while(!canSendMessage(outCm,PRIO_HIGH));
59
 
69
 
60
 
70
 
61
    while(1)
71
    while(1)
62
    {
72
    {
63
        static TICK t = 0;
73
        static TICK t = 0;
64
        static TICK heartbeat = 0;
74
        static TICK heartbeat = 0;
65
 
75
 
66
       
76
       
67
        if ((tickGet()-heartbeat)>TICK_SECOND*5)
77
        if ((tickGet()-heartbeat)>TICK_SECOND*5)
68
        {
78
        {
69
            // Send alive heartbeat
79
            // Send alive heartbeat
70
            outCm.funct                     = FUNCT_BOOTLOADER;
80
            outCm.funct                     = FUNCT_BOOTLOADER;
71
            outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
81
            outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
72
            outCm.nid                       = MY_NID;
82
            outCm.nid                       = MY_NID;
73
            outCm.sid                       = MY_ID;
83
            outCm.sid                       = MY_ID;
74
            outCm.data_length               = 1;
84
            outCm.data_length               = 1;
75
            outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_ALIVE;
85
            outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_ALIVE;
76
            while(!canSendMessage(outCm,PRIO_HIGH));
86
            while(!canSendMessage(outCm,PRIO_HIGH));
77
           
87
           
78
            heartbeat = tickGet();
88
            heartbeat = tickGet();
79
        }
89
        }
80
        if ((tickGet()-t)>TICK_SECOND)
90
        if ((tickGet()-t)>TICK_SECOND)
81
        {
91
        {
82
            LED0_IO=~LED0_IO;
92
            LED0_IO=~LED0_IO;
83
            t = tickGet();
93
            t = tickGet();
84
        }
94
        }
85
    }
95
    }
86
}
96
}
87
 
97
 
88
 
98
 
89
#pragma interrupt high_isr
99
#pragma interrupt high_isr
90
void high_isr(void)
100
void high_isr(void)
91
{
101
{
92
    ClrWdt();
102
    ClrWdt();
93
 
103
 
94
    #ifdef USE_CAN
104
    #ifdef USE_CAN
95
        canISR();
105
        canISR();
96
    #endif
106
    #endif
97
 
107
 
98
    tickUpdate();
108
    tickUpdate();
99
 
109
 
100
}
110
}
101
 
111
 
102
 
112
 
103
#pragma interrupt low_isr
113
#pragma interrupt low_isr
104
void low_isr(void)
114
void low_isr(void)
105
{
115
{
106
 
116
 
107
}
117
}
108
 
118
 
109
 
119
 
110
 
120
 
111
/*
121
/*
112
*   Function: mainInit
122
*   Function: mainInit
113
*
123
*
114
*   Input:  none
124
*   Input:  none
115
*   Output: none
125
*   Output: none
116
*   Pre-conditions: none
126
*   Pre-conditions: none
117
*   Affects: Se code
127
*   Affects: Se code
118
*   Depends: none.
128
*   Depends: none.
119
*/
129
*/
120
void mainInit()
130
void mainInit()
121
{
131
{
122
    LED0_TRIS=0;   
132
    LED0_TRIS=0;   
123
 
133
 
124
    // Enable Interrupts
134
    // Enable Interrupts
125
    INTCONbits.GIEH = 1;
135
    INTCONbits.GIEH = 1;
126
    INTCONbits.GIEL = 1;
136
    INTCONbits.GIEL = 1;
127
 
137
 
128
    // Enable interrupt prirority
138
    // Enable interrupt prirority
129
    RCONbits.IPEN=1;
139
    RCONbits.IPEN=1;
130
   
140
   
131
 
141
 
132
}
142
}
133
 
143
 
134
/*
144
/*
135
*   Function: canParse
145
*   Function: canParse
136
*
146
*
137
*   Input:  Received can message
147
*   Input:  Received can message
138
*   Output: none
148
*   Output: none
139
*   Pre-conditions: canInit and received packet.
149
*   Pre-conditions: canInit and received packet.
140
*   Affects: Sensors/actuators/etc. See code.
150
*   Affects: Sensors/actuators/etc. See code.
141
*   Depends: none.
151
*   Depends: none.
142
*/
152
*/
143
#ifdef USE_CAN
153
#ifdef USE_CAN
144
void canParse(CAN_MESSAGE cm)
154
void canParse(CAN_MESSAGE cm)
145
{
155
{
146
    CAN_MESSAGE outCm;
156
    CAN_MESSAGE outCm;
147
 
157
 
148
    ClrWdt();
158
    ClrWdt();
149
 
159
 
150
    switch(cm.funct)
160
    switch(cm.funct)
151
    {
161
    {
152
        case FUNCT_BOOTLOADER:
162
        case FUNCT_BOOTLOADER:
153
            if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
163
            if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
154
            {
164
            {
155
                switch(cm.funcc)
165
                switch(cm.funcc)
156
                {
166
                {
157
                    case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
167
                    case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
158
                    case FUNCC_BOOT_SET_ID:
168
                    case FUNCC_BOOT_SET_ID:
159
                        // Change my ID and NID
169
                        // Change my ID and NID
160
                        MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW_INDEX];
170
                        MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW_INDEX];
161
                        MY_NID=cm.data[BOOT_DATA_NEW_NID_INDEX];
171
                        MY_NID=cm.data[BOOT_DATA_NEW_NID_INDEX];
162
                        EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX]);
172
                        EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX]);
163
                        EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW_INDEX]);
173
                        EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW_INDEX]);
164
                        EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID_INDEX]);
174
                        EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID_INDEX]);
165
                        EEWrite(NODE_ID_EE,NODE_HAS_ID);
175
                        EEWrite(NODE_ID_EE,NODE_HAS_ID);
166
                        // Send ack with new id.
176
                        // Send ack with new id.
167
                        outCm.funct                     = FUNCT_BOOTLOADER;
177
                        outCm.funct                     = FUNCT_BOOTLOADER;
168
                        outCm.funcc                     = FUNCC_BOOT_ACK;
178
                        outCm.funcc                     = FUNCC_BOOT_ACK;
169
                        outCm.nid                       = MY_NID;
179
                        outCm.nid                       = MY_NID;
170
                        outCm.sid                       = MY_ID;
180
                        outCm.sid                       = MY_ID;
171
                        outCm.data_length               = 8;
181
                        outCm.data_length               = 8;
172
                        outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
182
                        outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
173
                        while(!canSendMessage(outCm,PRIO_HIGH));
183
                        while(!canSendMessage(outCm,PRIO_HIGH));
174
                    break;
184
                    break;
175
                }
185
                }
176
            }
186
            }
177
 
187
 
178
 
188
 
179
        break;
189
        break;
180
    }
190
    }
181
}
191
}
182
#endif
192
#endif
183
 
193
 
184
 
194
 
185
 
195
 
186
// Below are mandantory when using bootloader
196
// Below are mandantory when using bootloader
187
// define DEBUG_MODE to use without bootloader.
197
// define DEBUG_MODE to use without bootloader.
188
 
198
 
189
#ifndef DEBUG_MODE
199
#ifndef DEBUG_MODE
190
extern void _startup (void);
200
extern void _startup (void);
191
#pragma code _RESET_INTERRUPT_VECTOR = 0x001000
201
#pragma code _RESET_INTERRUPT_VECTOR = 0x001000
192
void _reset (void)
202
void _reset (void)
193
{
203
{
194
    _asm goto _startup _endasm
204
    _asm goto _startup _endasm
195
}
205
}
196
#pragma code
206
#pragma code
197
#endif
207
#endif
198
 
208
 
199
#pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
209
#pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
200
void _high_ISR (void)
210
void _high_ISR (void)
201
{
211
{
202
    _asm GOTO high_isr _endasm
212
    _asm GOTO high_isr _endasm
203
}
213
}
204
#pragma code
214
#pragma code
205
 
215
 
206
#pragma code _LOW_INTERRUPT_VECTOR = 0x001018
216
#pragma code _LOW_INTERRUPT_VECTOR = 0x001018
207
void _low_ISR (void)
217
void _low_ISR (void)
208
{
218
{
209
    _asm GOTO low_isr _endasm
219
    _asm GOTO low_isr _endasm
210
}
220
}
211
#pragma code
221
#pragma code
212
 
222