--- trunk/PIC/main.c 2007/01/30 14:56:43 17 +++ trunk/PIC/main.c 2007/01/31 12:40:37 27 @@ -4,6 +4,7 @@ //Includes #include #include +#include #include "delay.h" #include "i2c.h" @@ -62,16 +63,14 @@ unsigned char global_comm_buffer[BUFFERLEN]; unsigned char global_comm_length; -unsigned char global_comm_index; bit global_comm_ready; 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][BUFFERLEN]; bit global_led_0; @@ -90,7 +89,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) { @@ -141,7 +142,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) @@ -155,11 +164,18 @@ TXIF = 0; } */ + + if (TMR1IF == 1) + { + timer1_interrupt(); + TMR1IF = 0; + } } /////////////////////////////////////////////////////////////////// // Slip funktioner + void slip_reset(void) { global_comm_error = 0; @@ -207,13 +223,13 @@ break; case TSwitch2: if (cmd == CmdRead) - global_comm_buffer[1] = RA4; + global_comm_buffer[1] = !RA4; else global_comm_error = 1; break; case TSwitch3: if (cmd == CmdRead) - global_comm_buffer[1] = RB0; + global_comm_buffer[1] = !RB0; else global_comm_error = 1; break; @@ -240,7 +256,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; } @@ -299,7 +318,7 @@ } /////////////////////////////////////////////////////////////////// -// Gennerelle funktioner +// init funktioner void interrupt_init(void) { @@ -312,6 +331,8 @@ TXIF = 0; //nulstil intterupt flag RCIF = 0; + + TMR1IE = 1; // Timer 1 GIE = 1; //Global interrupt enable bit } @@ -403,6 +424,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) @@ -417,31 +455,83 @@ } + +void update_lcd(void) +{ + static char current_row = 0; + static char current_char = 0; + + if ( current_char >= BUFFERLEN || global_lcd_buffer[current_row][current_char] == 0 ) + { + current_row++; + current_char = 0; + lcd_goto(0x40); + } + + if (current_row >= 2) + { + sprintf(global_lcd_buffer[1], "T=%02d, P=%04d", global_temp, (global_potmeter_hi<<8) | global_potmeter_lo); + lcd_goto(0x00); + current_row = 0; + } + + lcd_putch(global_lcd_buffer[current_row][current_char]); + current_char++; +} + +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; + strcpy(global_lcd_buffer[0],"Baud=1200 "); + break; + case Baud2400: + SPBRG = 103; + strcpy(global_lcd_buffer[0],"Baud=2400 "); + break; + case Baud9600: + SPBRG = 25; + strcpy(global_lcd_buffer[0],"Baud=9600 "); + break; + case Baud19200: + SPBRG = 12; + strcpy(global_lcd_buffer[0],"Baud=19200"); + break; + default: + strcpy(global_lcd_buffer[0],"Baud=9600 "); + SPBRG = 25; // this should not be possible, but default to 9600 anyway + } + SPEN = 1; // enable the serial port again +} + /////////////////////////////////////////////////////////////////// //Main void main(void) { - char lcdbuf[20]; - int i; - - lcd_init(0); //init in 4-bit mode i2c_init(); 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 CREN = 1; + strcpy(global_lcd_buffer[0], "Baud=9600 "); while (1) { if (global_comm_ready == 1) @@ -453,6 +543,8 @@ if ( global_reset_baudrate == 1) { + reset_baudrate(); + global_reset_baudrate = 0; } RB1 = global_led_0; @@ -470,10 +562,7 @@ GODONE = 1; //start ny konverering } - - //just for fun - blink RB3 -// RB3 = !RB3; -// DelayMs(250); + update_lcd(); } }