/* * File: newmain18.c * Author: J. K. Chytil * * Created on 12. duben 2013, 10:52 */ #define __18F24K22 #define _XTAL_FREQ 8000000 #include #include #include #include #include #include #include "hwprofile.h" #include "inits.h" #include "config.h" #include "define.h" // prototyps int data_main (void); void error (char err); void slave_main(void); void lap_master_main(void); void start_master_main(void); void finish_master_main(void); void start(void); void wstart(void); void stop(void); void clear(void); void lclear(void); void latch(void); void get(void); //FLAGS char DTR = 0; // Data ready to sand char CQR = 0; // Command ready to send char DRC = 0; // Data Recieved //STATES char STATE = STOP; // timer0 state char DEAF_TIME = OFF; // timer1 state char MODE = SLAVE; // device state //Time registers char hours = 0; // range 0 - 255 char mins = 0; // range 0 - 59 char secs = 0; // range 0 - 59 int msecs = 0; // range 0 - 999 //LATCH Time registers char LATCH_hours = 0; // same ranges as time regieters char LATCH_mins = 0; char LATCH_secs = 0; int LATCH_msecs = 0; // data char rxdBuffer[20]; char txdBuffer[20]; char i; void interrupt high_priority YourHighPriorityISRCode(void) { if (TMR0IE && TMR0IF) { TMR0IF = 0; // clear interupt flag msecs++; // inc milisecs if(msecs >= 1000){secs++; msecs = 0;} // msecs overflow if(secs >= 60){mins++; secs = 0;} // secs overflow if(mins >= 60){hours++; mins = 0;} // mins overflow TMR0L = 55; } if (INT0IE && INT0IF && (MODE == MASTER_LAP) && (STATE == WAIT)) { INT0IF = 0; // clear interupt flag STATE = RUN; // change state T0CON |= (1 << TMR0ON); // start Timer0 DEAF_TIME = ON; // set DEAF TIMER flag T1CON |= (1 << TMR1ON); // start DEAF TIMER 1 } if (INT0IE && INT0IF && (MODE == MASTER_LAP) && (STATE == RUN) && (DEAF_TIME == OFF)) { INT0IF = 0; // clear interupt flag LATCH_hours = hours; // DATA to LATCH LATCH_mins = mins; // LATCH_secs = secs; // LATCH_msecs = msecs; // DTR = 1; // set DATA READ flag } if (INT0IE && INT0IF && (MODE == MASTER_START) && (STATE == WAIT)) { INT0IF = 0; // clear interupt flag STATE = RUN; // change state T0CON |= (1 << TMR0ON); // start Timer0 DEAF_TIME = ON; // set DEAF TIMER flag T1CON |= (1 << TMR1ON); // start DEAF TIMER 1 } if (INT1IE && INT1IF && (MODE == MASTER_START) && (STATE == RUN) && (DEAF_TIME == OFF)) { INT1IF = 0; // clear interupt flag STATE = STOP; // change state T0CON &= (0 << TMR0ON); // stop Timer 0 LATCH_hours = hours; // DATA to LATCH LATCH_mins = mins; // LATCH_secs = secs; // LATCH_msecs = msecs; // DTR = 1; // set DATA READ flag } if (INT0IE && INT0IF && (MODE == MASTER_STOP) && (STATE == RUN) && (DEAF_TIME == OFF)) { INT0IF = 0; // clear interupt flag STATE = STOP; // change state T0CON &= (0 << TMR0ON); // stop Timer 0 LATCH_hours = hours; // DATA to LATCH LATCH_mins = mins; // LATCH_secs = secs; // LATCH_msecs = msecs; // DTR = 1; // set DATA READ flag } if (INT1IE && INT1IF && (MODE == MASTER_STOP) && (STATE == WAIT)) { INT1IF = 0; // clear interupt flag STATE = RUN; // change state T0CON |= (1 << TMR0ON); // start Timer0 DEAF_TIME = ON; // set DEAF TIMER flag T1CON |= (1 << TMR1ON); // start DEAF TIMER 1 } return; } void interrupt low_priority YourLowPriorityISRCode(void) { if (TMR1IE && TMR1IF) // Timer 1 Interrupt { TMR1IF = 0; // clear interrupt flag DEAF_TIME = OFF; // clear DEAF TIMER flag T1CON &= (0 << TMR1ON); // tunr off DEAF Timer1 } if (RC1IE && RC1IF) // USART 1 INTERRUPT { RC1IF = 0; i = 0; // clear interrupt flag while (DataRdy1USART()) // recieve data from USART { // rxdBuffer[i] = Read1USART(); // save to buffer i++; // inc index // ADD delay 1 us } // DRC = 1; // set DATA RECIEVD FLAG } if (RC2IE && RC2IF) // USART 2 INTERRUPT { RC2IF = 0; // clear interrupt flag while (DataRdy2USART()) // recieve data from USART { // rxdBuffer[i] = Read2USART(); // save to buffer i++; // inc index // ADD delay 1 us } DRC = 1; // set DATA RECIEVD FLAG } if (SSP1IE && SSP1IF) // SPI 1 INTERRUPT { SSP1IF = 0; // clear interrupt flag rxdBuffer[0] = SSP1BUF; // save data to IDAT DRC = 1; // set DATA RECIEVD FLAG } } int main(void) { init_ports(); // nastavní port? init_perifs(); // nastvení periferií INTCON |= (1 << GIEL); // povolení low p?eru?ení if (i < 10) error(0x01); // to low (SHORT to GND) else if (i < 128) slave_main(); // set as slave else if (i > 245) error(0x02); // to high (SHORT to VDD) else // set as master { while(STATE == 0) // ?ekání na nastvení { if (STATE == MASTER_LAP) lap_master_main(); if (STATE == MASTER_START) start_master_main(); if (STATE == MASTER_STOP) finish_master_main(); } } return 0; } void slave_main(void) { INTCON &= (0 << GIEH); // enable low interrupt INTCON &= (0 << GIEL); // preparad for other use while(1) { // preparad for other use } return; } void lap_master_main(void) { INTCON3 &= (0 << INT1IE); // slave unconnected INTCON |= (1 << GIEH); // enable high interrupts while(1) { data_main; // check data falgs // preparad for other use } return; } void start_master_main(void) { INTCON |= (1 << GIEH); // enable high interrupts while(1) { data_main; // check data falgs // preparad for other use } return; } void finish_master_main(void) { INTCON |= (1 << GIEH); // enable high interrupts while(1) { data_main; // check data falgs // preparad for other use } return; } int data_main (void) { if(DTR) // DATA READY TO SEND { char temp; DTR = 0; // CLEAR DTR FLAG Write2USART(LATCH_hours / 10); //send data Write2USART(LATCH_hours % 10); Write2USART(':'); Write2USART(LATCH_mins / 10); Write2USART(LATCH_mins % 10); Write2USART(':'); Write2USART(LATCH_secs / 10); Write2USART(LATCH_secs % 10); Write2USART(','); temp = LATCH_msecs / 100; Write2USART(temp); temp = (LATCH_msecs - temp * 100); Write2USART(temp / 10); Write2USART(temp % 10); } if(CQR) // COMMAND READY TO SEND { CQR = 0; // CLEAR CQR FLAG for (i = 0; i < 4; i++) { Write1USART(txdBuffer[i]); // send comamnd sequence } } if(DRC) // data recieved { DRC = 0; // celar data recived flag if (rxdBuffer[0] == 's') start(); // start command if (rxdBuffer[0] == 'w') wstart(); // delay start command if (rxdBuffer[0] == 'p') stop(); // stop command if (rxdBuffer[0] == 'c') clear(); // clear command if (rxdBuffer[0] == 'd') lclear(); // LATCH clear command if (rxdBuffer[0] == 'g') get(); // get time if (rxdBuffer[0] == 'l') latch(); // get LATCH time } return 0; } void start(void) // force start { TMR0L = 55; // preset time reg T0CON |= (1 << TMR0ON ); // start timer STATE = RUN; // change state INTCON |= (1 << GIEH); // enable H intrupts return; } void wstart(void) // delay start { TMR0L = 55; // preset time reg STATE = WAIT; // change state INTCON |= (1 << GIEH); // enable H intrupts return; } void stop(void) // stop { INTCON &= (0 << GIEH); // disable interupt T0CON &= (0 << TMR0ON ); // stop timer STATE = STOP; // change state return; } void clear(void) // clear time regs { hours = 0; mins = 0; secs = 0; msecs = 0; return; } void lclear(void) // clear latch regs { LATCH_hours = 0; LATCH_mins = 0; LATCH_secs = 0; LATCH_msecs = 0; return; } void latch(void) // time regs to latchs { LATCH_hours = hours; // DATA to LATCH LATCH_mins = mins; // LATCH_secs = secs; // LATCH_msecs = msecs; // return; } void get(void) // set flag to get time { DTR = 1; return; } void error(char err) // return error code { CQR = 1; txdBuffer[0] = 'e'; txdBuffer[0] = 'e'; txdBuffer[0] = 'r'; txdBuffer[0] = err; }