Halloween Offer 2014
It is currently 01 Nov 2014 03:23

All times are UTC + 1 hour




Post new topic Reply to topic  [ 25 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: 31 Aug 2009 12:48 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
I'm fairly new to mE products, but this is making me crazy.

I'm trying to port a nice little 18F2550 LCD oscilloscope project I found from another C compiler to mE C Pro. I've modified the syntax and most of the functions for diferences in the libraries, but I'm getting several compile/linker errors such as:

"Unresolved extern 'GLCD_RST_Direcetion'". (They are all related to the GLCD. )

I started by creating a new empty project, added the OScope .c source code, added the needed ADC, GLCD, fonts, and sprintf libraries from the lib. mgr. Everything was going well until I got to this problem.

What am I missing?


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 13:47 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
Hi, the Glcd library has to be checked in the Library Manger. :)


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 13:51 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
VCC wrote:
Hi, the Glcd library has to be checked in the Library Manger. :)


Thanks, but it is already checked.


Top
 Profile  
 
 Post subject: Here's my code....
PostPosted: 31 Aug 2009 14:05 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
////////////////////////////////////////////////////////////////////////////////
//                      KS0108 128 x 64 Graphical LCD
//                          Oscilloscope Example
//
// Filename     : 18F2550 GLCD Oscilloscope DR1r1.c
// Programmer   : Steven Cholewiak, www.semifluid.com
// Version      : Version 1.0  08/21/2006
//              : Modified for MikroC compiler and librarie by Doug Slocum
// Remarks      : This example draws a digital oscilloscope display to a KS0108
//                graphical LCD. Please note the limitations of the PIC's analog
//                port and make sure to buffer the input for the most accurate
//                reading.
//
//                More information on the circuit can be found at:
//                http://www.semifluid.com/PIC18F2550_GLCD_Oscilloscope.php
////////////////////////////////////////////////////////////////////////////////

unsigned short useThreshold = 0;           // 0 = Off, 1 = Rising, 2 = Falling
unsigned short theThreshold = 127;
unsigned short timeType = 1;               // 1 = us, 2 = ms
unsigned long timePeriod = 4;             // us or ms per measurement (* 25 for each div)
unsigned short 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 displayFloat(unsigned short x, unsigned short 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

void displayShort(unsigned short x, unsigned short y, unsigned short oldValue, unsigned short 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

void displayInt(unsigned short x, unsigned short y, unsigned int oldValue, unsigned int 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

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

   tempFloat = (theThreshold>>2) * voltageConst;

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

   useThreshold = theUsage;
   theThreshold = theValue;

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

void changeTimeDivision(unsigned short theType, unsigned int theValue) {
   float tempFloat = 0.0, tempFloat2 = 0.0;

   Glcd_Write_Text(strTime, 0, 36, 1);
   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_Write_Text(strMs, 4, 42, 1);
}

void changeVoltageRange(unsigned short theType) {
   Glcd_Write_Text(strRange, 0, 54, 1);
   if (voltageRange == 1) Glcd_Write_Text(strR0to5, 8, 54, 0);
   else if (voltageRange == 2) Glcd_Write_Text(strR0to25, 8, 54, 0);
   else if (voltageRange == 3) Glcd_Write_Text(strR0to12, 8, 54, 0);

   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_Write_Text(strR0to5, 8, 54, 1);
   else if (voltageRange == 2) Glcd_Write_Text(strR0to25, 8, 54, 1);
   else if (voltageRange == 3) Glcd_Write_Text(strR0to12, 8, 54, 1);
}

void main() {
   unsigned short const numOfSamples = 100;
   unsigned int HQadcReadings[numOfSamples];
   unsigned short adcReadings[numOfSamples], adcReadingsOld[numOfSamples];
   unsigned short i = 0;
   unsigned short thres2 = 1;
   unsigned int 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;
   unsigned int theFreq = 0.0, theFreqOld = 0.0;

   //SETUP_ADC_PORTS(AN0 | VSS_VDD);           // Setup ADC Pins
   ADCON0 = 0x01;         // Configure AN0 pin as analog, and enabled
   ADCON1 = 0x0E;           // Configure other AN pins as digital I/O
   ADCON2 = 0;                 //
   //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
   //C1ON_bit = 0;   ???        CMCON maybe?
   /*
   There are comparators that are connected to PORTD.
You also need to turn them off.
Add CMCON = 0x07 This should turn them off.

Also ADCON1 = 0x07 does not turn off all the A/D channels, it needs to be ADCON1 = 0x0F. This is just for reference because you did have the A/D's turned off for the Ports that you were using.
*/
   
   //SETUP_CCP2(CCP_OFF);                      // Disable CCP2
   //C2ON_bit = 0;    ???

   //enable_interrupts(INT_RDA);
   // ???
   //enable_interrupts(GLOBAL);
   // ???

   Glcd_Init();                            // Must initialize the LCD
   Glcd_Line((128-numOfSamples),0,(128-numOfSamples),63,1);
   
   Glcd_Set_Font(Font_Glcd_System3x5, 3, 5, 32);

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

   //set_adc_channel(0);
   delay_ms(10);

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

      // Collect ADC readings
      if (timeType == 1)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = ADC_Read(2);
            //VDelay_us(timePeriod-16);
         }
      else if (timeType == 2)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = ADC_Read(2);
            VDelay_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_Dot(i+(128-numOfSamples),adcReadingsOld[i],0);
      for (i=1; i<numOfSamples; i++)
         Glcd_Dot(i+(128-numOfSamples),adcReadings[i],1);
      for (i=0; i<numOfSamples; i++)
         adcReadingsOld[i] = adcReadings[i];

      // Calculate and display frequency of signal using zero crossing
      // displayunsigned short(0, 54, thres2, 0);
      if (useThreshold != 0) {
         for (i=0; i<63; i+=3)
               Glcd_Dot(thres2+(128-numOfSamples),i,0);
         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++);
         }
         // display unsigned short(0, 54, 0, thres2);
         for (i=0; i<63; i+=3)
            Glcd_Dot(thres2+(128-numOfSamples),i,1);

         k = (unsigned int) thres2 * timePeriod;
         if (timeType == 1) theFreq = (float) 1000/k * 1000;
         if (timeType == 2) theFreq = (float) 1000/k;
         displayInt(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_Dot(i,63-(theThreshold>>2),1);
      for (i=0; i<63; i+=5) {
         Glcd_Dot(53,i,1);
         Glcd_Dot(78,i,1);
         Glcd_Dot(103,i,1);
         Glcd_Dot(127,i,1);
      }

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


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 14:18 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
Ok, GLCD_RST_Direction is a variable that you have to declare. There are many others, look in the help at Graphic Lcd Library for all of them. :)


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 14:47 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
VCC wrote:
Ok, GLCD_RST_Direction is a variable that you have to declare. There are many others, look in the help at Graphic Lcd Library for all of them. :)


Thanks. I completely missed that.

Now I have added them from the GLCD example project:
// Glcd module connections
char GLCD_DataPort at PORTD;

sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS  at RB2_bit;
sbit GLCD_RW  at RB3_bit;
sbit GLCD_EN  at RB4_bit;
sbit GLCD_RST at RB5_bit;

sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction  at TRISB2_bit;
sbit GLCD_RW_Direction  at TRISB3_bit;
sbit GLCD_EN_Direction  at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections



...But I'm now getting errorrs:

; expected, but 'PORTD' found
; expected, but 'at' found

[/code]


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 14:50 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
Maybe a ";" is missing above the code you just posted. Can you post at least the declaration part ? :)


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 14:52 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
VCC wrote:
Maybe a ";" is missing above the code you just posted. Can you post at least the declaration part ? :)


Here's the whole thing:
////////////////////////////////////////////////////////////////////////////////
//                      KS0108 128 x 64 Graphical LCD
//                          Oscilloscope Example
//
// Filename     : 18F2550 GLCD Oscilloscope DR1r1.c
// Programmer   : Steven Cholewiak, www.semifluid.com
// Version      : Version 1.0  08/21/2006
//              : Modified for MikroC compiler and librarie by Doug Slocum
// Remarks      : This example draws a digital oscilloscope display to a KS0108
//                graphical LCD. Please note the limitations of the PIC's analog
//                port and make sure to buffer the input for the most accurate
//                reading.
//
//                More information on the circuit can be found at:
//                http://www.semifluid.com/PIC18F2550_GLCD_Oscilloscope.php
////////////////////////////////////////////////////////////////////////////////

unsigned short useThreshold = 0;           // 0 = Off, 1 = Rising, 2 = Falling
unsigned short theThreshold = 127;
unsigned short timeType = 1;               // 1 = us, 2 = ms
unsigned long timePeriod = 4;             // us or ms per measurement (* 25 for each div)
unsigned short 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";

// Glcd module connections
char GLCD_DataPort at PORTD;

sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS  at RB2_bit;
sbit GLCD_RW  at RB3_bit;
sbit GLCD_EN  at RB4_bit;
sbit GLCD_RST at RB5_bit;

sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction  at TRISB2_bit;
sbit GLCD_RW_Direction  at TRISB3_bit;
sbit GLCD_EN_Direction  at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections

void displayFloat(unsigned short x, unsigned short 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

void displayShort(unsigned short x, unsigned short y, unsigned short oldValue, unsigned short 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

void displayInt(unsigned short x, unsigned short y, unsigned int oldValue, unsigned int 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_Write_Text(toPrintOld, x, y, 0);
   Glcd_Write_Text(toPrint, x, y, 1);
}

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

   tempFloat = (theThreshold>>2) * voltageConst;

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

   useThreshold = theUsage;
   theThreshold = theValue;

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

void changeTimeDivision(unsigned short theType, unsigned int theValue) {
   float tempFloat = 0.0, tempFloat2 = 0.0;

   Glcd_Write_Text(strTime, 0, 36, 1);
   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_Write_Text(strMs, 4, 42, 1);
}

void changeVoltageRange(unsigned short theType) {
   Glcd_Write_Text(strRange, 0, 54, 1);
   if (voltageRange == 1) Glcd_Write_Text(strR0to5, 8, 54, 0);
   else if (voltageRange == 2) Glcd_Write_Text(strR0to25, 8, 54, 0);
   else if (voltageRange == 3) Glcd_Write_Text(strR0to12, 8, 54, 0);

   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_Write_Text(strR0to5, 8, 54, 1);
   else if (voltageRange == 2) Glcd_Write_Text(strR0to25, 8, 54, 1);
   else if (voltageRange == 3) Glcd_Write_Text(strR0to12, 8, 54, 1);
}

void main() {
   unsigned short const numOfSamples = 100;
   unsigned int HQadcReadings[numOfSamples];
   unsigned short adcReadings[numOfSamples], adcReadingsOld[numOfSamples];
   unsigned short i = 0;
   unsigned short thres2 = 1;
   unsigned int 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;
   unsigned int theFreq = 0.0, theFreqOld = 0.0;

   //SETUP_ADC_PORTS(AN0 | VSS_VDD);           // Setup ADC Pins
   ADCON0 = 0x01;         // Configure AN0 pin as analog, and enabled
   ADCON1 = 0x0E;           // Configure other AN pins as digital I/O
   ADCON2 = 0;                 //
   //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
   //C1ON_bit = 0;   ???        CMCON maybe?
   /*
   There are comparators that are connected to PORTD.
You also need to turn them off.
Add CMCON = 0x07 This should turn them off.

Also ADCON1 = 0x07 does not turn off all the A/D channels, it needs to be ADCON1 = 0x0F. This is just for reference because you did have the A/D's turned off for the Ports that you were using.
*/
   
   //SETUP_CCP2(CCP_OFF);                      // Disable CCP2
   //C2ON_bit = 0;    ???

   //enable_interrupts(INT_RDA);
   // ???
   //enable_interrupts(GLOBAL);
   // ???

   Glcd_Init();                            // Must initialize the LCD
   Glcd_Line((128-numOfSamples),0,(128-numOfSamples),63,1);
   
   Glcd_Set_Font(Font_Glcd_System3x5, 3, 5, 32);

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

   //set_adc_channel(0);
   delay_ms(10);

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

      // Collect ADC readings
      if (timeType == 1)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = ADC_Read(2);
            //VDelay_us(timePeriod-16);
         }
      else if (timeType == 2)
         for (i=0; i<numOfSamples; i++) {
            HQadcReadings[i] = ADC_Read(2);
            VDelay_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_Dot(i+(128-numOfSamples),adcReadingsOld[i],0);
      for (i=1; i<numOfSamples; i++)
         Glcd_Dot(i+(128-numOfSamples),adcReadings[i],1);
      for (i=0; i<numOfSamples; i++)
         adcReadingsOld[i] = adcReadings[i];

      // Calculate and display frequency of signal using zero crossing
      // displayunsigned short(0, 54, thres2, 0);
      if (useThreshold != 0) {
         for (i=0; i<63; i+=3)
               Glcd_Dot(thres2+(128-numOfSamples),i,0);
         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++);
         }
         // display unsigned short(0, 54, 0, thres2);
         for (i=0; i<63; i+=3)
            Glcd_Dot(thres2+(128-numOfSamples),i,1);

         k = (unsigned int) thres2 * timePeriod;
         if (timeType == 1) theFreq = (float) 1000/k * 1000;
         if (timeType == 2) theFreq = (float) 1000/k;
         displayInt(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_Dot(i,63-(theThreshold>>2),1);
      for (i=0; i<63; i+=5) {
         Glcd_Dot(53,i,1);
         Glcd_Dot(78,i,1);
         Glcd_Dot(103,i,1);
         Glcd_Dot(127,i,1);
      }

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


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 15:07 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
:oops: PIC18F2550 doesn't have a PORTD.


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 15:11 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
To compile the code, select another PIC which has a PORTD, eg PIC18F4550 (this is from the same family) and there must be checked also, other libraries.


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 15:19 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
VCC wrote:
To compile the code, select another PIC which has a PORTD, eg PIC18F4550 (this is from the same family) and there must be checked also, other libraries.
Or try to use PORTC and PIC18F2550. :D


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 15:20 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
:oops:

I'll try that a little later and let you know how it goes. Gotta run now.

Thanks VERY much! :D


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 15:58 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
VCC wrote:
VCC wrote:
To compile the code, select another PIC which has a PORTD, eg PIC18F4550 (this is from the same family) and there must be checked also, other libraries.
Or try to use PORTC and PIC18F2550. :D
Hi, I forgot to mention that you need 8 bits for the GLCD data port, so PORTC is just for compilation test (RC3 is not defined for this family). For the physical oscilloscope, there is needed a PIC with all 8 bits available from a port.


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 17:47 
Offline

Joined: 31 Aug 2009 12:21
Posts: 71
VCC wrote:
VCC wrote:
VCC wrote:
To compile the code, select another PIC which has a PORTD, eg PIC18F4550 (this is from the same family) and there must be checked also, other libraries.
Or try to use PORTC and PIC18F2550. :D
Hi, I forgot to mention that you need 8 bits for the GLCD data port, so PORTC is just for compilation test (RC3 is not defined for this family). For the physical oscilloscope, there is needed a PIC with all 8 bits available from a port.


OK, thanks.

Looks like I've got a couple of different problems now.

1) I need to buy the mE C Pro compiler (It's too big for the demo version)
2) Use a different CPU for my easyPIC5 board (comes with 16F887), or cut back a little on RAM usage. This project takes over 400 byte just for it's sample buffers.

Do you know if the 18F4550 is electrically pin compatible with the 16F887 in the easyPIC 5 board?


Top
 Profile  
 
 Post subject:
PostPosted: 31 Aug 2009 18:03 
Offline

Joined: 08 Jun 2009 18:31
Posts: 320
Location: Romania
dslocum wrote:
Do you know if the 18F4550 is electrically pin compatible with the 16F887 in the easyPIC 5 board?
Hi, PIC18F4550 is not compatible with PIC16F887 because of pin18 which is RC3/SCK/SCL for PIC16F887 and is Vusb for PIC18F4550. I/O port locations are the same but the peripherals are multiplexed differently. However, the project was designed for PIC18, so a PIC16 may be to slow. :)


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 25 posts ]  Go to page 1, 2  Next

All times are UTC + 1 hour


Who is online

Users browsing this forum: Baidu [Spider], Bing [Bot], Yahoo [Bot] and 1 guest


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 post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group