wuchy143
Member
Hi All,
I'm trying to get a 4Mhz external oscillator to work on a piece of code I have already got to work with the internal oscillator. I"m using C and the HIgh Tech C Compiler lite. Any thoughts on what else I need to do in my config work other than selecting XT? Code below.
I'm trying to get a 4Mhz external oscillator to work on a piece of code I have already got to work with the internal oscillator. I"m using C and the HIgh Tech C Compiler lite. Any thoughts on what else I need to do in my config work other than selecting XT? Code below.
Code:
#include <htc.h>
#define _XTAL_FREQ 4000000 // oscillator frequency for delay
__CONFIG(MCLREN & UNPROTECT & BORDIS & WDTDIS & PWRTEN & INTIO & XT);
void CountTime(void); //Function responsible for doing the actual
//counting of time
void send_8bit_serial_data(int data);
void TurnOnLED(void); //Function to turn on LED once an hour has elapsed
void time_to_send_data(void); //Function to check if it's time to send data to LCD
void WriteToEEprom(int min); //Function to write data to EEPROM at address 0x01
void ReadFromEEprom(void); //Function to write data to EEPROM at address 0x01
void HexToBCD(int min); //Function to Convert to BCD and Transmit result to LCD
unsigned int c = 0; //c keeps track of how many times TMRO overflows
unsigned int hour = 0; //16 bit variable hour is time in hours
unsigned int min = 0; //16 bit variable min is time in minutes
unsigned int data = 0; //buffer for RS232 data to be sent to LCD
unsigned int c2 = 0; //c2 keeps track of how many times TMR1 overflows
void main()
{
OPTION = 0b00000111; //Assigning Prescalar
//----111- prescaler assigned to timer0 (PSA = 1)
//prescale = 256 (PS = 111)
//-> timeout = 255us
ei(); //all interrupts enabled(macro from High Tech C)
T0IE = 1; //enable Timer0 interrupt
CMCON = 0x07; // Digital I/O
ANSEL = 0; // Digital I/O
TRISIO = 0b00001000; // Set Pin I/O
STATUS = 0x00;
T1CON =0b10000101; //setting up Timer1
ReadFromEEprom(); //Checking to see if this is the first powerup of chip
if(EEDATA == 0xFF){ //if it's the first power up initialize min to 0
min = 0;
EEDATA = 0;
}
else{ //if it isn't the first powerup set min = to eprom data
ReadFromEEprom();
min = EEDATA;
}
//***************************************************************************//
//**************************** MAIN LOOP ********************************//
//***************************************************************************//
for(;;){
CountTime();
time_to_send_data();
}
}
//********************* INTERRUPT SERVICE ROUTINE #1 *********************//
//Interrupt goes off whenever Timer0 overflows which is every 256uS ********//
//given how the prescalar is set up above in OPTION ************************//
void interrupt Timer0(void)
{
// if(c > 916) //bootstrap and suspenders so c doesn't overflow past 923
// c = 0;
while(T0IF == 1){
T0IF = 0; //clear Timer0 interrupt overflow bit
c = c + 1; //increase c to show Timer0 has overflowed
}
while(EEIF == 1) //eeprom write finished bit
EEIF = 0; //clear it for next write
}
//*********************** COUNTING TIME FUNCTION ************************//
void CountTime(void)
{
while(c == 916){
c = 0; //c ranges from 0-59 to simulate seconds
min = min + 1; //it clears seconds to start counting again
HexToBCD(min);
WriteToEEprom(min); //update eeprom with min value
}
while(min == 60){ //min value ranges from 0-59 to simulate minutes
hour = hour + 1; //it clears minutes to start counting again
min = 0;
}
}
/************ TURN ON LED FUNCTION **********************/
void TurnOnLED(void){
CMCON = 0x07; // Digital I/O
ANSEL = 0; // Digital I/O
TRISIO = 0b00001000; // Set Pin I/O
STATUS = 0x00;
GPIO = 1; //Turn LED on
for(;;) { //keep it on forever
;
}
}
/*********** SERIAL TRANSMITTER FUNCTION ********************/
void send_8bit_serial_data(int data)
{
unsigned char i;
GPIO = 0; //start bit from high to low
_delay(390); //delay to sync loop
for(i = 0; i < 8; i++)
{
if (data & 0x01){ // consider rightmost bit
GPIO = 1; // set line high if bit is 1, low if bit is 0
}
else
GPIO = 0;
_delay(390); //delay to sync loop
data >>= 1; // shift byte left so next bit will be leftmost
}
GPIO = 1; //stop bit
_delay(400); //delay to sync loop
}
/********* CHECKING IF TIME TO TRANSMIT FUNCTION **************/
void time_to_send_data(void)
{
while(TMR1IF == 1){ //checking overflow bit on Timer1
TMR1IF = 0; //clearing overflow bit
c2 = c2 + 1; //increment counter(c2)
}
while(c2 == 100){ //change c2 = 10,000 for about 10 mins
c2 = 0; //clear c2 to continue counting again
data = min; //shove minute into data buffer
//HexToBCD(hour); //converts to BCD and trasmits to LCD
}
}
/************ WRITING TO THE EEPROM **********************/
void WriteToEEprom(min)
{
EEADR = 0b00000001; //location where data goes in memory
EEDATA = min; //set data into eeprom data reg.
WREN = 1; //enable write cycle
di(); //disable all interrupts
EECON2 = 0x55; //unlock write(aling with this line
EECON2 = 0xAA; //the following 2 lines are required
WR = 1; //to start write seq. WR starts write
ei(); //enable all interrupts
WREN = 0; //disable write cycle
}
/************ READING FROM THE EEPROM **********************/
void ReadFromEEprom(void)
{
RP0 = 1; //register bank select bit(bank 1)
EEADR = 0b00000001; //setting the address to be accessed in EEPROM
RD = 1; //Enabling/Performing a read to EEADR
min = EEDATA; //loading whats in EEPROM to min
}
/************* LCD Stuff ***********************/
void HexToBCD(min){
unsigned int division = 0;
unsigned int min2 = 0;
unsigned int division2 = 0;
GPIO = 1;
//_delay(100);
data = 0xFE; //clear screen
send_8bit_serial_data(data);
data = 0x51;
send_8bit_serial_data(data);
data = 0xFE;
send_8bit_serial_data(data);
data = 0x46;
send_8bit_serial_data(data); //set curson home
min2 = min;
division = min2 / 10000;
division = division + 0x30;
data = division;
send_8bit_serial_data(data);
division = min2 % 10000;
division = division / 1000;
division = division + 0x30;
data = division;
send_8bit_serial_data(data);
division = min2 % 1000;
division = division / 100;
division = division + 0x30;
data = division;
send_8bit_serial_data(data);
division = min2 % 100;
division = division / 10;
division = division + 0x30;
data = division;
send_8bit_serial_data(data);
division = min2 % 10;
division = division / 1;
division = division + 0x30;
data = division;
send_8bit_serial_data(data);
data = 0xFE; //move curson one space to right
send_8bit_serial_data(data);
data = 0x4A;
send_8bit_serial_data(data);
data = 0x4D; //put a M to LCD
send_8bit_serial_data(data);
data = 0x69; //put a i to LCD
send_8bit_serial_data(data);
data = 0x6E; //put a n to LCD
send_8bit_serial_data(data);
// data = 0x72; //put a u to LCD
// send_8bit_serial_data(data);
//
// data = 0x73; //put a t to LCD
// send_8bit_serial_data(data);
//
}