/[H7]/trunk/PIC/main.c
ViewVC logotype

Annotation of /trunk/PIC/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 20 - (hide annotations) (download)
Tue Jan 30 22:16:53 2007 UTC (17 years, 4 months ago) by torben
File MIME type: text/plain
File size: 9511 byte(s)
Removed some unused vars.
1 torben 2 /* H7 -projekt opgave */
2 torben 10
3     ///////////////////////////////////////////////////////////////////////
4     //Includes
5 torben 2 #include <pic18.h>
6 torben 17 #include <string.h>
7    
8 torben 2 #include "delay.h"
9     #include "i2c.h"
10     #include "lcd.h"
11    
12 torben 10 /////////////////////////////////////////////////////////////////////
13     //Defines
14 torben 2 #define TC74 0x9A /* I2C TC74 IC */
15    
16 torben 17 #define SLIP_END 192
17     #define SLIP_ESC 219
18     #define SLIP_ESCAPED_END 220
19     #define SLIP_ESCAPED_ESC 221
20 torben 10
21 torben 17 #define BUFFERLEN 16
22    
23     //////////////////////////////////////////////////////////////////
24     // Enumerations
25    
26 torben 10 enum SlipState{
27     SlipNormal,
28     SlipEscaped,
29     SlipError,
30     SlipStopped
31     };
32    
33 torben 17 enum BaudRates{
34     Baud1200,
35     Baud2400,
36     Baud4800,
37     Baud9600,
38     Baud19200
39     };
40    
41     enum Commands{
42     CmdRead,
43     CmdWrite,
44     CmdAck,
45     CmdNAck
46     };
47    
48     enum Targets {
49     TLed3, //0
50     TLed4,
51     TLed5,
52     TSwitch2,
53     TSwitch3,
54     TPotmeter,
55     TTemp,
56     TBaud = 10
57     };
58    
59 torben 10 //////////////////////////////////////////////////////////////////
60     //Globale data
61     // Alle globale variabler bruger "global_" som prefix
62 torben 17
63     unsigned char global_comm_buffer[BUFFERLEN];
64 torben 10 unsigned char global_comm_length;
65 torben 17
66 torben 10 bit global_comm_ready;
67 torben 17 bit global_comm_error;
68 torben 10
69 torben 17 unsigned char global_comm_slipstate;
70     unsigned char global_comm_currentrate;
71 torben 10
72 torben 17 unsigned char global_lcd_buffer[20];
73     unsigned char global_lcd_index;
74 torben 10
75    
76 torben 17 bit global_led_0;
77     bit global_led_1;
78     bit global_led_2;
79    
80     bit global_reset_baudrate;
81    
82     char global_temp;
83     unsigned char global_potmeter_hi;
84     unsigned char global_potmeter_lo;
85    
86 torben 10 ///////////////////////////////////////////////////////////////////
87     // Interrupt funktioner
88    
89     void recieve_interrupt(void)
90     {
91 torben 17 unsigned char data = RCREG;
92     RB2 = !RB2;
93    
94     switch (global_comm_slipstate)
95     {
96     case SlipNormal:
97     if (data == SLIP_END)
98     {
99     global_comm_ready = 1;
100     global_comm_slipstate = SlipStopped;
101     }
102     else if (data == SLIP_ESC)
103     {
104     global_comm_slipstate = SlipEscaped;
105     }
106     else
107     global_comm_buffer[ global_comm_length++ ] = data;
108     break;
109    
110     case SlipEscaped:
111     if (data == SLIP_ESCAPED_ESC)
112     {
113     global_comm_buffer[ global_comm_length++ ] = SLIP_ESC;
114     global_comm_slipstate = SlipNormal;
115     }
116     else if (data ==SLIP_ESCAPED_END)
117     {
118     global_comm_buffer[ global_comm_length++ ] = SLIP_END;
119     global_comm_slipstate = SlipNormal;
120     }
121     else
122     {
123     global_comm_slipstate = SlipError;
124     }
125     case SlipError:
126     if (data == SLIP_END)
127     {
128     global_comm_error = 1;
129     global_comm_slipstate = SlipStopped;
130     global_comm_ready = 1;
131     }
132     case SlipStopped: //vi var ikke klar til at modtage data
133     global_comm_error = 1;
134     }
135 torben 10 }
136    
137 torben 17 /*
138 torben 10 void transmit_interrupt(void)
139     {
140 torben 17 RB2 = !RB2;
141 torben 10 }
142 torben 17 */
143 torben 10
144     void interrupt interrupt_handler(void)
145     {
146     if (RCIF == 1)
147     {
148     recieve_interrupt();
149     RCIF = 0;
150     }
151 torben 17 /*if (TXIF == 1)
152 torben 10 {
153     transmit_interrupt();
154     TXIF = 0;
155     }
156 torben 17 */
157 torben 10 }
158    
159     ///////////////////////////////////////////////////////////////////
160 torben 17 // Slip funktioner
161 torben 10
162 torben 17 void slip_reset(void)
163     {
164     global_comm_error = 0;
165     global_comm_slipstate = SlipNormal;
166     global_comm_ready = 0;
167     global_comm_length = 0;
168     memset(global_comm_buffer, 0, BUFFERLEN);
169     }
170    
171     void slip_highlevel_protocol(void)
172     {
173     unsigned char cmd,target,data;
174    
175     cmd = global_comm_buffer[0] & 0x0F;
176     target = ( global_comm_buffer[0] >> 4 ) & 0x0F;
177     data = global_comm_buffer[1];
178    
179     if (cmd == CmdRead || cmd == CmdWrite)
180     {
181     //sæt standart længde - da længden kun varierer ved læsning af potmeter
182     if (cmd == CmdRead)
183     global_comm_length = 2;
184     else
185     global_comm_length = 1;
186    
187     switch(target)
188     {
189     case TLed3:
190     if (cmd == CmdRead)
191     global_comm_buffer[1] = global_led_0;
192     else
193     global_led_0 = data;
194     break;
195     case TLed4:
196     if(cmd == CmdRead)
197     global_comm_buffer[1] = global_led_1;
198     else
199     global_led_1 = data;
200     break;
201     case TLed5:
202     if (cmd == CmdRead)
203     global_comm_buffer[1] = global_led_2;
204     else
205     global_led_2 = data;
206     break;
207     case TSwitch2:
208     if (cmd == CmdRead)
209     global_comm_buffer[1] = RA4;
210     else
211     global_comm_error = 1;
212     break;
213     case TSwitch3:
214     if (cmd == CmdRead)
215     global_comm_buffer[1] = RB0;
216     else
217     global_comm_error = 1;
218     break;
219     case TPotmeter:
220     if (cmd == CmdRead)
221     {
222     global_comm_buffer[1] = global_potmeter_hi;
223     global_comm_buffer[2] = global_potmeter_lo;
224     global_comm_length = 3;
225     }
226     else
227     global_comm_error = 1;
228     break;
229     case TTemp:
230     if (cmd == CmdRead)
231     global_comm_buffer[1] = global_temp;
232     else
233     global_comm_error = 1;
234     break;
235     case TBaud:
236     if (cmd == CmdRead)
237     global_comm_error = 1;
238     else
239     {
240     //we can only handle 1200,2400,9600,19200
241     if (data == 0 || data == 1 || data == 3 || data == 4)
242     global_reset_baudrate = 1;
243     else
244     global_comm_error = 1;
245     }
246     break;
247     default:
248     global_comm_error = 1;
249    
250     }
251     }
252     else //kommandoen var noget andet end read/write
253     {
254     global_comm_error = 1;
255     }
256    
257    
258     if (global_comm_error == 1) //we saw an error
259     {
260     global_comm_buffer[0] = CmdNAck | target<<4;
261     global_comm_length = 1;
262     }
263     else
264     {
265     global_comm_buffer[0] = CmdAck | target<<4; //skriv acknowledge feltet
266     }
267     }
268    
269     void slip_send_byte(char data)
270     {
271     TXREG = data;
272     while (TRMT==0) ;
273     DelayUs(20);
274     }
275    
276     void slip_send_response(void)
277     {
278     int i;
279     for (i=0; i< global_comm_length;i++)
280     {
281     if ( global_comm_buffer[i] == SLIP_ESC)
282     {
283     slip_send_byte(SLIP_ESC);
284     slip_send_byte(SLIP_ESCAPED_ESC);
285     }
286     else if (global_comm_buffer[i] == SLIP_END)
287     {
288     slip_send_byte(SLIP_ESC);
289     slip_send_byte(SLIP_ESCAPED_END);
290     }
291     else
292     {
293     slip_send_byte( global_comm_buffer[i]);
294     }
295     }
296    
297     slip_send_byte(SLIP_END);
298     }
299    
300     ///////////////////////////////////////////////////////////////////
301     // Gennerelle funktioner
302    
303 torben 10 void interrupt_init(void)
304     {
305 torben 17 TXIE = 0; //Disable AUX TX interrupt - testes med TXIF;
306 torben 10 RCIE = 1; //Enable AUX Recieve interrupt - testes med RCIF;
307    
308     IPEN = 0; // IPEN=Interrupt Priority ENable bit - her bruges ingen prioritet
309    
310     PEIE = 1; // PEIE = PEriphal Interrupt Enable
311    
312     TXIF = 0; //nulstil intterupt flag
313     RCIF = 0;
314    
315     GIE = 1; //Global interrupt enable bit
316     }
317    
318     void serial_init(void)
319     {
320     SPEN = 0; //Make sure serial port is disabled
321    
322     // snupset fra Kim H Pedersens serialmain.c
323     // Set Port C bit 6 output (TxD) and bit 7 input (RxD)
324     TRISC6 = 0;
325     TRISC7 = 1;
326    
327     SPBRG = 25; // x = Fosc/(16 * Baud Rate) - 1
328     // x = 4000000/(16 * 9600) - 1
329     // x = 25.0417 ~ 25
330     // Baud Rate = Fosc/(16 * (x+1))
331     // Baud Rate = 4000000/(16 * (25+1))
332     // Baud Rate = 9615
333     TXSTA = 0x24; // TXSTA7 = 0 Don't care in asynchronous
334     // TXSTA6 = 0 8-bit transmission
335     // TXSTA5 = 1 Transmit enabled
336     // TXSTA4 = 0 Asynchronous mode
337     // TXSTA3 = 0 Unimplemented
338     // TXSTA2 = 1 High speed
339     // TXSTA1 = 0 TSR empty
340     // TXSTA0 = 0 9th bit */
341     RCSTA = 0x90; // RCSTA7 = 0 Serial port disabled
342     // RCSTA6 = 0 8-bit reception
343     // RCSTA5 = 0 Don't care in asynchronous
344     // RCSTA4 = 1 Receiver enabled
345     // RCSTA3 = 0 Don't care (8-bit operation)
346     // RCSTA2 = 0 No framing error
347     // RCSTA1 = 0 Overrun error bit
348     // RCSTA0 = 0 9th bit */
349 torben 17
350 torben 10 //config completed
351     SPEN = 1; //Enable Serial port
352     }
353    
354 torben 17 /* basic I/O ports */
355     void io_init(void)
356     {
357     TRISB3 = 0; //LED ports = output
358     TRISB2 = 0;
359     TRISB1 = 0;
360    
361     TRISB0 = 1; //Switch porte = input
362     TRISA0 = 1;
363     }
364 torben 10
365 torben 17 void ad_init(void)
366     {
367     // AD Conversion clock
368     ADCS0 = 0;
369     ADCS1 = 0;
370     ADCS2 = 0;
371 torben 10
372 torben 17 //Select AN0/RA0 for AD source
373     CHS0=0;
374     CHS1=0;
375     CHS2=0;
376    
377     //Only AN0 is selected for AD and with Vdd/Vss as limits
378     PCFG0=0;
379     PCFG1=1;
380     PCFG2=1;
381     PCFG3=1;
382    
383     //Result is right justified
384     ADFM=1;
385    
386     //Fire up for A/D converter module
387     ADON=1;
388     }
389    
390 torben 2 void i2c_init(void)
391     {
392 torben 17 // I2C_MODULE hører hjemme i i2c.h
393 torben 2 #ifdef I2C_MODULE
394     SSPMode(MASTER_MODE);
395     SSPEN = 1;
396     CKP = 1;
397     #else
398     SCL_DIR = I2C_OUTPUT;
399     SDA_DIR = I2C_OUTPUT;
400     SDA = 0;
401     SCL = 0;
402     #endif
403     }
404    
405 torben 10
406    
407 torben 2 char ReadTemp(void)
408     {
409     char temp;
410 torben 10 i2c_WriteTo(TC74); //write to, will automatically send a start condition
411 torben 2 i2c_PutByte(0x00); //tell TC74 we want to read
412     i2c_ReadFrom(TC74);
413     temp = i2c_GetByte(I2C_LAST);
414     i2c_Stop(); //assert a stop condition on SDA & SCL
415     return temp;
416 torben 10 }
417    
418    
419     ///////////////////////////////////////////////////////////////////
420     //Main
421 torben 2
422 torben 10
423 torben 2 void main(void)
424     {
425     lcd_init(0); //init in 4-bit mode
426     i2c_init();
427 torben 10 serial_init(); //9600 8N1
428 torben 17 ad_init();
429     io_init();
430 torben 10 interrupt_init();
431    
432    
433 torben 17 slip_reset(); //take SLIP FSM into normal state
434     global_comm_currentrate = Baud9600; //default baudrate = 9600
435     global_reset_baudrate = 0;
436 torben 10
437     // initialisation completed and we are ready to recieve commands - enable serial reception
438     CREN = 1;
439    
440 torben 2 while (1)
441     {
442 torben 17 if (global_comm_ready == 1)
443     {
444     slip_highlevel_protocol(); //parse the slip frame recieved & generate response
445     slip_send_response();
446     slip_reset();
447     }
448    
449     if ( global_reset_baudrate == 1)
450     {
451     }
452    
453     RB1 = global_led_0;
454     RB2 = global_led_1;
455     RB3 = global_led_2;
456    
457     global_temp = ReadTemp();
458    
459     //potmeter
460     if (GODONE ==0 )//hvis A/D-conv er færdig
461     {
462    
463     global_potmeter_hi = ADRESH;//gem AD resultat
464     global_potmeter_lo = ADRESL;
465     GODONE = 1; //start ny konverering
466     }
467 torben 2 }
468     }

  ViewVC Help
Powered by ViewVC 1.1.20