Subversion Repositories HomeAutomation

Rev

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

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