--- trunk/PIC/main.c 2007/01/30 22:16:53 20 +++ trunk/PIC/main.c 2007/01/31 10:45:20 26 @@ -67,10 +67,9 @@ bit global_comm_error; unsigned char global_comm_slipstate; -unsigned char global_comm_currentrate; +unsigned char global_comm_baudrate; -unsigned char global_lcd_buffer[20]; -unsigned char global_lcd_index; +unsigned char global_lcd_buffer[2][20]; bit global_led_0; @@ -89,7 +88,9 @@ void recieve_interrupt(void) { unsigned char data = RCREG; - RB2 = !RB2; + + if (global_comm_length == BUFFERLEN) //avoid buffer overrun + global_comm_slipstate == SlipError; switch (global_comm_slipstate) { @@ -140,7 +141,15 @@ RB2 = !RB2; } */ - +//Timer1 er en 16 bit timer, der kører med en 1:8 prescaler, +// og er styret fra en ekstern 32768 Hz krystal +//Når at registrene preloades med 0xEFFF vil det resultere i en +//timer overflow ca hvert sekund +void timer1_interrupt(void) +{ + TMR1H = 0xEF; + TMR1L = 0xFF; +} void interrupt interrupt_handler(void) { if (RCIF == 1) @@ -154,11 +163,18 @@ TXIF = 0; } */ + + if (TMR1IF == 1) + { + timer1_interrupt(); + TMR1IF = 0; + } } /////////////////////////////////////////////////////////////////// // Slip funktioner + void slip_reset(void) { global_comm_error = 0; @@ -239,7 +255,10 @@ { //we can only handle 1200,2400,9600,19200 if (data == 0 || data == 1 || data == 3 || data == 4) + { global_reset_baudrate = 1; + global_comm_baudrate = data; + } else global_comm_error = 1; } @@ -298,7 +317,7 @@ } /////////////////////////////////////////////////////////////////// -// Gennerelle funktioner +// init funktioner void interrupt_init(void) { @@ -311,6 +330,8 @@ TXIF = 0; //nulstil intterupt flag RCIF = 0; + + TMR1IE = 1; // Timer 1 GIE = 1; //Global interrupt enable bit } @@ -402,6 +423,23 @@ #endif } +void timer_init(void) +{ + TMR1CS = 1; //use external clock + + T1CKPS1 = 1; //1:8 prescale + T1CKPS0 = 1; + + TMR1H = 0xEF; + TMR1L = 0xFF; + + T1OSCEN = 1; //enable oscillator circuit + RD16 = 0; //normal 8 bit writes + TMR1ON = 1; +} + +/////////////////////////////////////////////////////////////////// +// Gennerelle funktioner char ReadTemp(void) @@ -415,6 +453,34 @@ return temp; } +void update_lcd(void) +{ +} + +void reset_baudrate(void) +{ + SPEN = 0; //disable serial port + + //set baudrate generator, i henhold til side 171 af PIC18F452 dokumentationen + switch (global_comm_baudrate) + { + case Baud1200: + SPBRG = 207; + break; + case Baud2400: + SPBRG = 103; + break; + case Baud9600: + SPBRG = 25; + break; + case Baud19200: + SPBRG = 12; + break; + default: + SPBRG = 25; // this should not be possible, but default to 9600 anyway + } + SPEN = 1; // enable the serial port again +} /////////////////////////////////////////////////////////////////// //Main @@ -427,11 +493,12 @@ serial_init(); //9600 8N1 ad_init(); io_init(); + timer_init(); interrupt_init(); slip_reset(); //take SLIP FSM into normal state - global_comm_currentrate = Baud9600; //default baudrate = 9600 + global_comm_baudrate = Baud9600; //default baudrate = 9600 (allready set in serial_init) global_reset_baudrate = 0; // initialisation completed and we are ready to recieve commands - enable serial reception @@ -448,6 +515,7 @@ if ( global_reset_baudrate == 1) { + reset_baudrate(); } RB1 = global_led_0;