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

Diff of /trunk/PIC/main.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 17 by torben, Tue Jan 30 14:56:43 2007 UTC revision 27 by torben, Wed Jan 31 12:40:37 2007 UTC
# Line 4  Line 4 
4  //Includes  //Includes
5  #include <pic18.h>  #include <pic18.h>
6  #include <string.h>  #include <string.h>
7    #include <stdio.h>
8    
9  #include "delay.h"  #include "delay.h"
10  #include "i2c.h"  #include "i2c.h"
# Line 62  enum Targets { Line 63  enum Targets {
63    
64  unsigned char global_comm_buffer[BUFFERLEN];  unsigned char global_comm_buffer[BUFFERLEN];
65  unsigned char global_comm_length;  unsigned char global_comm_length;
 unsigned char global_comm_index;  
66    
67  bit global_comm_ready;  bit global_comm_ready;
68  bit global_comm_error;  bit global_comm_error;
69    
70  unsigned char global_comm_slipstate;  unsigned char global_comm_slipstate;
71  unsigned char global_comm_currentrate;  unsigned char global_comm_baudrate;
72    
73  unsigned char global_lcd_buffer[20];  unsigned char global_lcd_buffer[2][BUFFERLEN];
 unsigned char global_lcd_index;  
74    
75    
76  bit global_led_0;  bit global_led_0;
# Line 90  unsigned char global_potmeter_lo; Line 89  unsigned char global_potmeter_lo;
89  void recieve_interrupt(void)  void recieve_interrupt(void)
90  {  {
91          unsigned char data = RCREG;              unsigned char data = RCREG;    
92          RB2 = !RB2;          
93            if (global_comm_length == BUFFERLEN) //avoid buffer overrun
94                    global_comm_slipstate == SlipError;
95                    
96          switch (global_comm_slipstate)          switch (global_comm_slipstate)
97          {                        {              
# Line 141  void transmit_interrupt(void) Line 142  void transmit_interrupt(void)
142          RB2 = !RB2;          RB2 = !RB2;
143  }  }
144  */  */
145    //Timer1 er en 16 bit timer, der kører med en 1:8 prescaler,
146    // og er styret fra en ekstern 32768 Hz krystal
147    //Når at registrene preloades med 0xEFFF vil det resultere i en
148    //timer overflow ca hvert sekund
149    void timer1_interrupt(void)
150    {
151            TMR1H = 0xEF;
152            TMR1L = 0xFF;
153    }
154  void interrupt interrupt_handler(void)  void interrupt interrupt_handler(void)
155  {  {
156          if (RCIF == 1)          if (RCIF == 1)
# Line 155  void interrupt interrupt_handler(void) Line 164  void interrupt interrupt_handler(void)
164                  TXIF = 0;                  TXIF = 0;
165          }          }
166          */          */
167            
168            if (TMR1IF == 1)
169            {
170                    timer1_interrupt();
171                    TMR1IF = 0;
172            }
173  }  }
174    
175  ///////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////
176  // Slip funktioner  // Slip funktioner
177    
178    
179  void slip_reset(void)  void slip_reset(void)
180  {  {
181          global_comm_error = 0;          global_comm_error = 0;
# Line 207  void slip_highlevel_protocol(void) Line 223  void slip_highlevel_protocol(void)
223                                  break;                                  break;
224                          case TSwitch2:                          case TSwitch2:
225                                  if (cmd == CmdRead)                                  if (cmd == CmdRead)
226                                          global_comm_buffer[1] = RA4;                                          global_comm_buffer[1] = !RA4;
227                                  else                                  else
228                                          global_comm_error = 1;                                          global_comm_error = 1;
229                                  break;                                  break;
230                          case TSwitch3:                          case TSwitch3:
231                                  if (cmd == CmdRead)                                  if (cmd == CmdRead)
232                                          global_comm_buffer[1] = RB0;                                          global_comm_buffer[1] = !RB0;
233                                  else                                  else
234                                          global_comm_error = 1;                                          global_comm_error = 1;
235                                  break;                                  break;
# Line 240  void slip_highlevel_protocol(void) Line 256  void slip_highlevel_protocol(void)
256                                  {                                  {
257                                          //we can only handle 1200,2400,9600,19200                                          //we can only handle 1200,2400,9600,19200
258                                          if (data == 0 || data == 1 || data == 3 || data == 4)                                          if (data == 0 || data == 1 || data == 3 || data == 4)
259                                            {
260                                                  global_reset_baudrate = 1;                                                  global_reset_baudrate = 1;
261                                                    global_comm_baudrate = data;
262                                            }
263                                          else                                          else
264                                                  global_comm_error = 1;                                                  global_comm_error = 1;
265                                  }                                  }
# Line 299  void slip_send_response(void) Line 318  void slip_send_response(void)
318  }  }
319    
320  ///////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////
321  // Gennerelle funktioner  // init funktioner
322    
323  void interrupt_init(void)  void interrupt_init(void)
324  {  {
# Line 312  void interrupt_init(void) Line 331  void interrupt_init(void)
331                                    
332          TXIF = 0; //nulstil intterupt flag          TXIF = 0; //nulstil intterupt flag
333          RCIF = 0;          RCIF = 0;
334            
335            TMR1IE = 1; // Timer 1
336    
337          GIE = 1; //Global interrupt enable bit          GIE = 1; //Global interrupt enable bit
338  }  }
# Line 403  void i2c_init(void) Line 424  void i2c_init(void)
424  #endif  #endif
425  }  }
426    
427    void timer_init(void)
428    {
429            TMR1CS = 1; //use external clock
430            
431            T1CKPS1 = 1; //1:8 prescale
432            T1CKPS0 = 1;
433            
434            TMR1H = 0xEF;
435            TMR1L = 0xFF;
436    
437            T1OSCEN = 1; //enable oscillator circuit        
438            RD16 = 0; //normal 8 bit writes
439            TMR1ON = 1;
440    }
441    
442    ///////////////////////////////////////////////////////////////////
443    // Gennerelle funktioner
444    
445    
446  char ReadTemp(void)  char ReadTemp(void)
# Line 417  char ReadTemp(void) Line 455  char ReadTemp(void)
455  }  }
456    
457    
458    
459    void update_lcd(void)
460    {
461            static char current_row = 0;
462            static char current_char = 0;
463    
464            if ( current_char >= BUFFERLEN ||  global_lcd_buffer[current_row][current_char] == 0 )
465            {
466                    current_row++;
467                    current_char = 0;
468                    lcd_goto(0x40);
469            }
470            
471            if (current_row >= 2)
472            {
473                    sprintf(global_lcd_buffer[1], "T=%02d, P=%04d", global_temp, (global_potmeter_hi<<8) | global_potmeter_lo);
474                    lcd_goto(0x00);
475                    current_row = 0;
476            }
477            
478            lcd_putch(global_lcd_buffer[current_row][current_char]);
479            current_char++;
480    }
481    
482    void reset_baudrate(void)
483    {
484            SPEN = 0; //disable serial port
485            
486            //set baudrate generator, i henhold til side 171 af PIC18F452 dokumentationen
487            switch (global_comm_baudrate)
488            {
489                    case Baud1200:
490                            SPBRG = 207;
491                            strcpy(global_lcd_buffer[0],"Baud=1200 ");
492                            break;
493                    case Baud2400:
494                            SPBRG = 103;
495                            strcpy(global_lcd_buffer[0],"Baud=2400 ");
496                            break;
497                    case Baud9600:
498                            SPBRG = 25;
499                            strcpy(global_lcd_buffer[0],"Baud=9600 ");
500                            break;
501                    case Baud19200:
502                            SPBRG = 12;
503                            strcpy(global_lcd_buffer[0],"Baud=19200");
504                            break;
505                    default:
506                            strcpy(global_lcd_buffer[0],"Baud=9600 ");
507                            SPBRG = 25; // this should not be possible, but default to 9600 anyway
508            }
509            SPEN = 1; // enable the serial port again
510    }
511    
512  ///////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////
513  //Main  //Main
514    
515    
516  void main(void)  void main(void)
517  {  {
         char lcdbuf[20];  
         int i;  
           
           
518          lcd_init(0); //init in 4-bit mode          lcd_init(0); //init in 4-bit mode
519          i2c_init();          i2c_init();
520          serial_init(); //9600 8N1          serial_init(); //9600 8N1
521          ad_init();          ad_init();
522          io_init();          io_init();
523            timer_init();
524          interrupt_init();          interrupt_init();
525                    
526    
527          slip_reset(); //take SLIP FSM into normal state          slip_reset(); //take SLIP FSM into normal state
528          global_comm_currentrate = Baud9600; //default baudrate = 9600          global_comm_baudrate = Baud9600; //default baudrate = 9600 (allready set in serial_init)
529          global_reset_baudrate = 0;          global_reset_baudrate = 0;
530                    
531  //      initialisation completed and we are ready to recieve commands - enable serial reception  //      initialisation completed and we are ready to recieve commands - enable serial reception
532          CREN = 1;          CREN = 1;
533                    
534            strcpy(global_lcd_buffer[0], "Baud=9600 ");
535          while (1)          while (1)
536          {          {
537                  if (global_comm_ready == 1)                  if (global_comm_ready == 1)
# Line 453  void main(void) Line 543  void main(void)
543                                    
544                  if ( global_reset_baudrate == 1)                  if ( global_reset_baudrate == 1)
545                  {                  {
546                            reset_baudrate();
547                            global_reset_baudrate = 0;
548                  }                  }
549                                    
550                  RB1 = global_led_0;                  RB1 = global_led_0;
# Line 470  void main(void) Line 562  void main(void)
562                          GODONE = 1; //start ny konverering                          GODONE = 1; //start ny konverering
563                  }                  }
564                                    
565                                    update_lcd();
                 //just for fun - blink RB3  
 //              RB3 = !RB3;  
 //              DelayMs(250);  
566          }          }
567  }  }
568    

Legend:
Removed from v.17  
changed lines
  Added in v.27

  ViewVC Help
Powered by ViewVC 1.1.20