CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

GLCD oscilloscope

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
alarassi



Joined: 28 Mar 2010
Posts: 8
Location: Malaysia

View user's profile Send private message

GLCD oscilloscope
PostPosted: Sun Apr 11, 2010 1:50 pm     Reply with quote

hello guys

I'm doing a project of GLCD oscilloscope that I have found online.
http://www.semifluid.com/?p=15

The code was written in CCS and I found some difficulty to understand some parts of it.

Can you pls explain to me what were the steps taken in the following part and how !
Code:

void displayFloat(int8 x, int8 y, float oldValue, float theValue) {
   char toPrintOld[9];
   char toPrint[9];
   sprintf(toPrintOld, "%f", oldValue);
   sprintf(toPrint, "%f", theValue);
   toPrintOld[4] = '\0';
   toPrint[4] = '\0';                              // Limit shown digits to 3
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
}

void displayInt8(int8 x, int8 y, int8 oldValue, int8 theValue) {
   char toPrintOld[4];
   char toPrint[4];
   sprintf(toPrintOld, "%u", oldValue);
   sprintf(toPrint, "%u", theValue);
   toPrintOld[3] = '\0';
   toPrint[3] = '\0';                              // Limit shown digits to 3
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
}

void displayInt16(int8 x, int8 y, int16 oldValue, int16 theValue) {
   char toPrintOld[6];
   char toPrint[6];
   sprintf(toPrintOld, "%lu", oldValue);
   sprintf(toPrint, "%lu", theValue);
   toPrintOld[5] = '\0';
   toPrint[5] = '\0';                              // Limit shown digits to 5
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
alarassi



Joined: 28 Mar 2010
Posts: 8
Location: Malaysia

View user's profile Send private message

PostPosted: Sun Apr 11, 2010 1:52 pm     Reply with quote

This is the full code for reference.

Hope I can find help.
Code:

#include <18F2550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#use rs232(stream=PC, baud=115200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

#include <GLCD - modified.c>

#INT_RDA
void serial_isr()                         // Serial Interrupt
{
   if (fgetc(PC) == 0x12 & fgetc(PC) == 0x34 & fgetc(PC) == 0x56 & fgetc(PC) == 0x78 & fgetc(PC) == 0x90) #asm reset #endasm
}

void displayFloat(int8 x, int8 y, float oldValue, float theValue) {
   char toPrintOld[9];
   char toPrint[9];
   sprintf(toPrintOld, "%f", oldValue);
   sprintf(toPrint, "%f", theValue);
   toPrintOld[4] = '\0';
   toPrint[4] = '\0';                              // Limit shown digits to 3
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
}

void displayInt8(int8 x, int8 y, int8 oldValue, int8 theValue) {
   char toPrintOld[4];
   char toPrint[4];
   sprintf(toPrintOld, "%u", oldValue);
   sprintf(toPrint, "%u", theValue);
   toPrintOld[3] = '\0';
   toPrint[3] = '\0';                              // Limit shown digits to 3
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
}

void displayInt16(int8 x, int8 y, int16 oldValue, int16 theValue) {
   char toPrintOld[6];
   char toPrint[6];
   sprintf(toPrintOld, "%lu", oldValue);
   sprintf(toPrint, "%lu", theValue);
   toPrintOld[5] = '\0';
   toPrint[5] = '\0';                              // Limit shown digits to 5
   glcd_text35(x, y, toPrintOld, OFF);
   glcd_text35(x, y, toPrint, ON);
}

int8 useThreshold = 0;           // 0 = Off, 1 = Rising, 2 = Falling
int8 theThreshold = 127;
int8 timeType = 2;               // 1 = us, 2 = ms
int8 timePeriod = 4;             // us or ms per measurement (* 25 for each div)
int8 voltageRange = 1;           // 1 = 0 - 5V, 2 = 0 - 2.5V, 3 = 0 - 1.25V
float voltageConst = 0.079365;   // For displaying the scaled voltage
char strAverageV[] = "Av";
char strVMaximum[] = "Mx";
char strVMinimum[] = "Mn";
char strVPtoP[] =    "PP";
char strThreshold[] ="Th";
char strOff[] =      "Off";
char strRising[] =   "Rise";
char strFalling[] =  "Fall";
char strTime[] =     "Tm";
char strMs[] =       "ms/div";
char strHz[] =       "Hz";
char strRange[] =    "R";
char strR0to5[] =    "0-5";
char strR0to25[] =   "0-2.5";
char strR0to12[] =   "0-1.2";

void changeThreshold(int8 theUsage, int8 theValue) {
   float tempFloat = 0.0;

   tempFloat = (theThreshold>>2) * voltageConst;

   if (theUsage == 0)
      glcd_text35(12, 24, strOff, OFF);
   else if (theUsage == 1) {
      glcd_text35(12, 24, strRising, OFF);
      displayFloat(12, 30, tempFloat, (theValue>>2) * voltageConst);
   }
   else if (theUsage == 2) {
      glcd_text35(12, 24, strFalling, OFF);
      displayFloat(12, 30, tempFloat, (theValue>>2) * voltageConst);
   }

   useThreshold = theUsage;
   theThreshold = theValue;

   glcd_text35(0, 24, strThreshold, ON);
   if (useThreshold == 0) glcd_text35(12, 24, strOff, ON);
   else if (useThreshold == 1) glcd_text35(12, 24, strRising, ON);
   else if (useThreshold == 2) glcd_text35(12, 24, strFalling, ON);
}

void changeTimeDivision(int8 theType, int16 theValue) {
   float tempFloat = 0.0, tempFloat2 = 0.0;

   glcd_text35(0, 36, strTime, ON);
   if (theType == 1) {
      tempFloat = timePeriod * 25;
      tempFloat2 = theValue * 25;
      displayFloat(12, 36, tempFloat/1000, tempFloat2/1000);
   }
   else if (theType == 2)
      displayFloat(12, 36, timePeriod * 25, theValue * 25);

   timeType = theType;
   timePeriod = theValue;

   if ((theType == 1) && (timePeriod < 16)) timePeriod = 16;

   glcd_text35(4, 42, strMs, ON);
}

void changeVoltageRange(int8 theType) {
   glcd_text35(0, 54, strRange, ON);
   if (voltageRange == 1) glcd_text35(8, 54, strR0to5, OFF);
   else if (voltageRange == 2) glcd_text35(8, 54, strR0to25, OFF);
   else if (voltageRange == 3) glcd_text35(8, 54, strR0to12, OFF);

   voltageRange = theType;

   if (voltageRange == 1) voltageConst = 0.079365;
   else if (voltageRange == 2) voltageConst = 0.039683;
   else if (voltageRange == 3) voltageConst = 0.019841;

   if (voltageRange == 1) glcd_text35(8, 54, strR0to5, ON);
   else if (voltageRange == 2) glcd_text35(8, 54, strR0to25, ON);
   else if (voltageRange == 3) glcd_text35(8, 54, strR0to12, ON);
}

void main() {
   int8 const numOfSamples = 100;
   int16 HQadcReadings[numOfSamples];
   int8 adcReadings[numOfSamples], adcReadingsOld[numOfSamples];
   int8 i = 0;
   int8 thres2 = 1;
   int16 tempThres = 0, k = 0;
   float avgV = 0.0, avgVOld = 0.0;
   float maxV = 0.0, maxVOld = 0.0;
   float minV = 0.0, minVOld = 0.0;
   float ptopV = 0.0, ptopVOld = 0.0;
   int16 theFreq = 0.0, theFreqOld = 0.0;

   SETUP_ADC_PORTS(AN0 | VSS_VDD);           // Setup ADC Pins
   SETUP_ADC(ADC_CLOCK_DIV_64);              // Setup ADC
   SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);  // Use the int. osc. for Timer 0
   SETUP_TIMER_1(T1_DISABLED);               // Disable Timer 1
   SETUP_TIMER_2(T2_DISABLED, 127, 1);       // Disable Timer 2
   SETUP_TIMER_3(T3_DISABLED);               // Disable Timer 3
   SETUP_CCP1(CCP_OFF);                      // Disable CCP1
   SETUP_CCP2(CCP_OFF);                      // Disable CCP2

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   glcd_init(ON);                            // Must initialize the LCD
   glcd_line((128-numOfSamples),0,(128-numOfSamples),63,ON);

   // Draw static text
   glcd_text35(0, 0, strAverageV, ON);
   glcd_text35(0, 6, strVMaximum, ON);
   glcd_text35(0, 12, strVMinimum, ON);
   glcd_text35(0, 18, strVPtoP, ON);
   glcd_text35(20, 48, strHz, ON);
   // Setup variable ranges
   changeVoltageRange(1);                    // Set voltage range
   changeTimeDivision(2, 100);                // Set time divisions
   changeThreshold(1, 127);                  // Set threshold level

   set_adc_channel(0);
   delay_ms(10);

   delay_ms(100);
   while (TRUE) {
      // If using threshold, wait until it has been reached
      if (voltageRange == 1) tempThres = (int16) theThreshold << 2;
      else if (voltageRange == 2) tempThres = (int16) theThreshold << 1;
      else if (voltageRange == 3) tempThres = (int16) theThreshold;
      if (useThreshold == 1) {
         k = 0;
         while ((READ_ADC()>tempThres) && (k<65535)) (k++);
         k = 0;
         while ((READ_ADC()<tempThres) && (k<65535)) (k++);
      }
      else if (useThreshold == 2) {
         k = 0;
         while ((READ_ADC()<tempThres) && (k<65535)) (k++);
         k = 0;
         while ((READ_ADC()>tempThres) && (k<65535)) (k++);
      }

      // Collect ADC readings
      if (timeType == 1)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = read_adc();
            delay_us(timePeriod-16);
         }
      else if (timeType == 2)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = read_adc();
            delay_ms(timePeriod);
         }
      for (i=0; i<numOfSamples; i++) {
         if (voltageRange == 1) adcReadings[i] = 63-(HQadcReadings[i]>>4);
         else if (voltageRange == 2) adcReadings[i] = 63-(HQadcReadings[i]>>3);
         else if (voltageRange == 3) adcReadings[i] = 63-(HQadcReadings[i]>>2);
      }

      // Draw ADC readings
      for (i=1; i<numOfSamples; i++)
         glcd_pixel(i+(128-numOfSamples),adcReadingsOld[i],OFF);
      for (i=1; i<numOfSamples; i++)
         glcd_pixel(i+(128-numOfSamples),adcReadings[i],ON);
      for (i=0; i<numOfSamples; i++)
         adcReadingsOld[i] = adcReadings[i];

      // Calculate and display frequency of signal using zero crossing
      // displayint8(0, 54, thres2, 0);
      if (useThreshold != 0) {
         for (i=0; i<63; i+=3)
               glcd_pixel(thres2+(128-numOfSamples),i,OFF);
         if (useThreshold == 1) {
            thres2 = 1;
            while ((adcReadings[thres2]<(63-(theThreshold>>2))) && (thres2<numOfSamples-1)) (thres2++);
            thres2++;
            while ((adcReadings[thres2]>(63-(theThreshold>>2))) && (thres2<numOfSamples-1)) (thres2++);
         }
         else if (useThreshold == 2) {
            thres2 = 1;
            while ((adcReadings[thres2]>(63-(theThreshold>>2))) && (thres2<numOfSamples-1)) (thres2++);
            thres2++;
            while ((adcReadings[thres2]<(63-(theThreshold>>2))) && (thres2<numOfSamples-1)) (thres2++);
         }
         // displayint8(0, 54, 0, thres2);
         for (i=0; i<63; i+=3)
            glcd_pixel(thres2+(128-numOfSamples),i,ON);

         k = (int16) thres2 * timePeriod;
         if (timeType == 1) theFreq = (float) 1000/k * 1000;
         if (timeType == 2) theFreq = (float) 1000/k;
         displayInt16(0, 48, theFreqOld, theFreq);
         theFreqOld = theFreq;
      }

      // Calculate and display Average V
      avgV = 0;
      for (i=0; i<numOfSamples; i++)
         avgV = (float) avgV + adcReadings[i];
      avgV = (float) (63-(avgV / numOfSamples)) * voltageConst;
      displayFloat(12, 0, avgVOld, avgV);
      avgVOld = avgV;

      // Calculate and display Maximum V
      maxV = 63;
      for (i=0; i<numOfSamples; i++)
         if (adcReadings[i]<maxV) maxV = adcReadings[i];
      maxV = (float) (63-maxV) * voltageConst;
      displayFloat(12, 6, maxVOld, maxV);
      maxVOld = maxV;

      // Calculate and display Minimum V
      minV = 0;
      for (i=0; i<numOfSamples; i++)
         if (adcReadings[i]>minV) minV = adcReadings[i];
      minV = (float) (63-minV) * voltageConst;
      displayFloat(12, 12, minVOld, minV);
      minVOld = minV;

      // Calculate and display Peak-to-peak V
      ptopV = maxV - minV;
      displayFloat(12, 18, ptopVOld, ptopV);
      ptopVOld = ptopV;

      // Display graph lines
      if (useThreshold != 0)
         for (i=29; i<127; i+=3)
            glcd_pixel(i,63-(theThreshold>>2),ON);
      for (i=0; i<63; i+=5) {
         glcd_pixel(53,i,ON);
         glcd_pixel(78,i,ON);
         glcd_pixel(103,i,ON);
         glcd_pixel(127,i,ON);
      }

      delay_ms(100);    // Reduces flicker by allowing pixels to be on
                       // much longer than off
   }
}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Apr 12, 2010 12:52 pm     Reply with quote

These are functions to display numbers on the Graphic LCD.
The sprintf() function is used to convert the number into an ASCII string.
The ASCII string is then given to the glcd_text35() function. That
function converts each ASCII character into graphic dots, and writes
the dots on the Graphic LCD.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group