Version:0.9 StartHTML:0000000105 EndHTML:0000082347 StartFragment:0000001499 EndFragment:0000082331 mikroIDE
#define Version "01-05-2015"
//#define With_UART    // enlever le commentaire pour avoir le resultat ADC sur la sortie UART

 // rajout fonction    unsigned long HexacarToLong( unsigned char *P)

 // MikroC 6.50
 // Test UART Hardware 19200bds at Q=8MHz
 // Project '18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi'
 // Source :  C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\18F2550_test_UART_IT_ADC.c
 // hardware  :
 // platine StartUSB 18F2550 de MikroE
 //  RA0 analog input <- Potar 0 à 5V
 //  Led RA1
 // UART sur RC6 -> Tx   et  RC7 Rx<--
 //documents
 //ac:StartUSB_schema

 
 //ac:Datashette_18F2550
 //
 //ac:StartUSB_docu

#define PROCESSOR 18F2550
#define POWER_SUPPLY_5V
// NE PAS OUBLIER DE MODIFIER Projet Config FOSC
//#define FOSC_Interne_8MHz
//#define FOSC_Quartz_8MHz
//#define FOSC_Interne_1MHz

//#define FOSC 8.0  // MHz
#define BAUD 19200  // UART1

#define CLS 12
#define CR 13
#define LF 10
#define TAB 9
#define BACK 8
#define Separator 0x20   // space

/*
//avec FOSC interne 8MHZ
// voir P18F2550_Fosc_Interne_8MHz_19200bds.cfgsch
CONFIG1L : $300000 : 0x0021
CONFIG1H : $300001 : 0x0008
CONFIG2L : $300002 : 0x0019
CONFIG2H : $300003 : 0x001E
CONFIG3H : $300005 : 0x0083
CONFIG4L : $300006 : 0x0081
CONFIG5L : $300008 : 0x000F
CONFIG5H : $300009 : 0x00C0
CONFIG6L : $30000A : 0x000F
CONFIG6H : $30000B : 0x00E0
CONFIG7L : $30000C : 0x000F
CONFIG7H : $30000D : 0x0040


*/

sbit LED_Sup at LATA1_bit;
sbit LED_Inf at LATB1_bit;

unsigned char readbuff[128] absolute 0x500;  // Buffers should be in USB RAM, please consult datasheet
unsigned char writebuff[128] absolute 0x580;


unsigned int  i,j,k;
char error;
char TEXTE[64];
char * txt;
char CRam1[18];

const unsigned long Poids [8]={268435456,16777216,1048576,65536,4096,256,16,1}; //  4 294 967 296
unsigned char Receive[9]="0000FFFF";
unsigned long Result;
float ff1;

unsigned char Buffer1[64];
volatile int Flag_Buffer1;
volatile  unsigned char c1;
volatile unsigned int i1;
volatile int Index1;
volatile unsigned int CptErr1;

volatile unsigned int Count1;
volatile int Flag_Timer1;
volatile unsigned int Count2;
volatile int Flag_Timer2;
unsigned char *p1;


void Interrupts() iv 0x0008 ics ICS_AUTO
{
 if ( (RCIE_bit) && ( RCIF_bit))
   {
   // traitement separe des erreurs de COM
      if (RCSTA.OERR==1)    // voir parag 16.1.26 p273
      {
       RCSTA.CREN = 0 ;
       c1 = RCREG;
       RCSTA.CREN = 1 ;
       CptErr1++;
       }
      if(RCSTA.FERR==1 )
      {
      RCSTA.SPEN = 0 ;
      RCSTA.SPEN= 1 ;
      CptErr1++;
       c1 = RCREG;
      }
      c1 = RCREG;
     if (c1==CR)
      {
      Flag_Buffer1=1;
      //PIE1.RCIE=0 ; //interdit IT Reception UART
      Buffer1[i1]=0;
      Index1=i1;
      i1=0;
      c1=0;
     }
     else
     {
         Flag_Buffer1=0;
        Buffer1[i1]=c1;
        Index1=i1;
        i1++;

      }
   }
   // ------  timer 1  ----------------
  if  ( (TMR1IE_bit==1) && ( TMR1IF_bit==1))
   {  // Test "Peripheral Interrupt Request Register 1" for Timer1 Flag

     Count1++;
     if (Count1>=8)   // 8x125 ms= 1 seconde   et init timer1 à 3035  et prescaler=1/8
       {
        Count1=0;
        Flag_Timer1=1;
        TMR1IE_bit=0;
      }
      TMR1H= 0x0B; // Hi (3035);
      TMR1L= 0xDB; // Lo (3035);
      PIR1.TMR1IF=0;
   }
/*
  // ------  timer 2 ----------------
  if( ((TMR2IE_bit==1)&& TMR2IF_bit==1))
  {  // Test "Peripheral Interrupt Request Register 1" for Timer1 Flag

     Count2++;
     if (Count2>=NbCycles_T2)   // 8x125 ms= 1 seconde   et init timer1 à 3035  et prescaler=1/8
       {
        Count2=0;
        Flag_Timer2=1;
      }
      TMR2= 60;
      PIR1.TMR2IF=0;
   }
  */
  }



void Init_Timer1(void)
 {
  T1CON=0;
  T1CKPS1_bit=1;  //prescal select=11 => 1/8
  T1CKPS0_bit=1;
 // T1GCON=0;
  TMR1H= 0x0B; // Hi (3035);
  TMR1L= 0xDB; // Lo (3035);
 // TMR1H= NbCycles_T1>>8;
 // TMR1L= NbCycles_T1 & 0x00FF;
   Count1=0;
  Flag_Timer1=0;
  PIR1.TMR1IF=0;     // Reset Timer1 Flag
  PIE1.TMR1IE=0;  //Enable interrupt TMR1
  TMR1ON_bit=0;
}

 void Init_Timer2(void)
 {
  T2CON=0;
  TOUTPS0_bit=1;     // postscaleer =1/16
  TOUTPS1_bit=1;
  TOUTPS2_bit=1;
  TOUTPS3_bit=1;
  T2CKPS1_bit=1;  //prescaler select=11 => 1/64
  T2CKPS0_bit=1;
  TMR2=   60;     // 49.92mS @ 16MHz
  Count2=0;
  Flag_Timer2=0;
  TMR2IF_bit=0;     // Reset Timer1 Flag
  TMR2IE_bit=0;  //Enable interrupt TMR1
  TMR2ON_bit=0;
}


void Float2Ascii (float x, unsigned char *str,char precision)
{
 /* converts a floating point number to an ascii string */
 /* x is stored into str, which should be at least 30 chars long */
 int ie, i, k, ndig;
 double y;
 ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
 ie = 0;
 /* if x negative, write minus and reverse */
 if ( x < 0)
 {
   *str++ = '-';
   x = -x;
 }
 /* put x in range 1 <= x < 10 */
 if (x > 0.0) while (x < 1.0)
 {
   x *= 10.0;                // a la place de =*
   ie--;
 }
 while (x >= 10.0)
 {
   x = x/10.0;
   ie++;
 }
 // in f format, number of digits is related to size
 ndig += ie;                                // a la place de =+
 //round. x is between 1 and 10 and ndig will be printed to
 // right of decimal point so rounding is ...
 for (y = i = 1; i < ndig; i++)
 y = y/10.;
 x += y/2.;
 if (x >= 10.0) {x = 1.0; ie++;}
 if (ie<0)
 {
   *str++ = '0'; *str++ = '.';
   if (ndig < 0) ie = ie-ndig;
   for (i = -1; i > ie; i--)  *str++ = '0';
 }
 for (i=0; i < ndig; i++)
 {
   k = x;
   *str++ = k + '0';
   if (i ==  ie ) *str++ = '.';
   x -= (y=k);
   x *= 10.0;
  }
 *str = '\0';
}


void CRLF()
{
UART1_Write(CR);
UART1_Write(LF);

}

void UART1_Write_CText(const char *T)
 {
   while (*T)
      UART1_Write(*T++);
}


unsigned long HexacarToLong( unsigned char *P)
 { unsigned char c;
  int i,k ;
  unsigned long L=0;
   k=strlen(P);
   if (k !=8)
    {  UART1_Write_CText("\r\n Hexa sur 8 digits ! \r\n");
      return(0);
    }
  for(i=7;i>=0;i--)
  {
   c= toupper(*(P+i));
   // check if c belong to Hexadecimal car
   if ((c>=65) && (c<=70))
    c=( c-65)+10;
      else
      {
      if ((c>=48) && (c<=57) )
          {
          c=c-48;
          }
          else
          {
          L=0;
          UART1_Write_CText("\r\nError sur Hexa \r\n");
          break;
          }
       }
   L=  L +  (Poids[i]* (unsigned long) c);
   }
  return L;
 }

void Raz_Buffer1()
{
        Buffer1[0]=0;
        c1=0;
        i1=0;
        Index1=0;
        Flag_Buffer1 =0;
        RCIF_bit=0;
        RCIE_bit = 1;
}


void main()
{

     // Configurer la fréquence 8MHZ pour 9600 bauds
     OSCTUNE =0;   //=> com OK at 19200
     // OSCTUNE = 0b00001000; // => very bad com at 19200
     //OSCCON = 0b01111110;
     // System Clock Select bits
     OSCCON.SCS1=1;     //Internal oscillator
     OSCCON.SCS0=0;
     //IRCF2:IRCF0: Internal Oscillator Frequency Select bits = 111    8Mhz
     OSCCON.IRCF2=1;
      OSCCON.IRCF1=1;
      OSCCON.IRCF0=1;

      Delay_ms(200);


     TRISA=0xFF;
     TRISA1_bit=0;  // output to led
     TRISB=0xFF;
     TRISB1_bit=0;   // output to led
     TRISC=0xFF;     Delay_ms(200);
     Delay_ms(200);

     LED_Sup=0;
     LED_Inf=0;

     // Désactiver le comparateur sur RA0 à RA3
     CMCON  = 0x07;  // Disable comparators
     TEXTE[0]=0;
     txt=&TEXTE[0];
   
      Delay_ms(1000);
     //  UART1_Init(9600);  //  initialize UART1 HARDWARE module at 1Mhz
      UART1_Init(19200);  //  initialize UART1 HARDWARE module
      Delay_ms(100);
      UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle); // set UART1 active
      while (UART_Tx_Idle() == 0); UART1_Write(65);
      while (UART1_Tx_Idle() == 0);UART1_Write(66);
      while (UART1_Tx_Idle() == 0);UART1_Write(67);
      while (UART1_Tx_Idle() == 0);UART1_Write(13);
      while (UART1_Tx_Idle() == 0);UART1_Write(10);

      UART1_Write_CText("initialisation Pointeur sur zone TEXTE\r\n");

  Delay_ms(1000);
  UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 19200 with FOSC Interne 8MHZ\r\n");
  //UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 9600 with FOSC Interne 1MHZ\r\n");
  //UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 19200 with Q=8MHZ\r\n");

   ADCON0 = 0x00;// select channel 0 (AN0)
   
   ADCON1 = 0b00001110;//VSS,VDD ref. AN0 analog only
   ADCON1.VCFG1=0;    // VREF- = VSS=0V
   ADCON1.VCFG0=0;  // VREF+ = VDD=+5V
   ADCON1.PCFG3=1;
   ADCON1.PCFG2=1;
   ADCON1.PCFG1=1;
   ADCON1.PCFG0=0;
   
   //ADCON2 setup: Right justified, Tacq=16Tad, Tad=2*Tosc (or Fosc/2)
   ADCON2.ADFM=1; // right justified
   ADCON2.ACQT2=1;  // 110 => 12 Tad
   ADCON2.ACQT1=0;
   ADCON2.ACQT0=1;
   ADCON2.ADCS2=1;  // FOSC /64
   ADCON2.ADCS2=0;
   ADCON2.ADCS2=1;
   
   ADCON0.ADON = 1;//Enable A/D module
   Delay_ms(1);
   
   Init_Timer1();

   Raz_Buffer1();
   RCIE_bit=1;
   PEIE_bit=1;
   GIE_bit=1;


 while(1)
   {
        ADCON0.GO_DONE = 1;//Start A/D Conversion
        while(ADCON0.GO_DONE != 0);//Loop here until A/D conversion completes
        k = (ADRESH<<8) | ADRESL ;//Set the delay
        ff1=(float)k * 5.00/1024.0;
      //  UART1_Write_CText("Results ");
        Float2Ascii(ff1,CRam1,2);
        sprintf(txt,"ADC Results  k=% 5u Pts k=%04X soit %s Volts \r\n",k,k,CRam1);
        UART1_Write_Text(txt);
        if (k >522) LED_Sup=1;  else LED_Sup=0;
        if (k <502) LED_Inf=1;  else LED_Inf=0;



      if (Flag_Buffer1==1)
      {

       Result=HexacarToLong(&Buffer1[0]);
       LongWordToStrWithZeros (Result,CRam1);
       sprintf(txt,"Recu buffer1= %s, convertit en %s  soit %lu ",Buffer1,CRam1,Result);
       UART1_Write_Text(txt);
       CRLF();
       Raz_Buffer1();
       }
     Delay_ms(200);
    }
 }
  


/*
 16:52:44.828> ABC
16:52:44.828> initialisation Pointeur sur zone TEXTE
16:52:45.828> StartUSB 18F2550 Init UART HARDW 19200 with FOSC Interne 8MHZ

16:52:48.453> ADC Results  k=   15 Pts k=000F soit 0.07 Volts
16:52:50.140> ADC Results  k=  211 Pts k=00D3 soit 1.03 Volts
16:52:50.578> ADC Results  k=  287 Pts k=011F soit 1.40 Volts
16:52:51.328> ADC Results  k=  496 Pts k=01F0 soit 2.42 Volts
16:52:51.515> ADC Results  k=  568 Pts k=0238 soit 2.77 Volts
16:52:51.765> ADC Results  k=  638 Pts k=027E soit 3.12 Volts
16:52:52.265> ADC Results  k=  812 Pts k=032C soit 3.96 Volts
16:52:54.640> ADC Results  k=  912 Pts k=0390 soit 4.45 Volts
16:52:56.765> ADC Results  k=  703 Pts k=02BF soit 3.43 Volts
16:52:57.453> ADC Results  k=  513 Pts k=0201 soit 2.50 Volts
16:52:57.953> ADC Results  k=  375 Pts k=0177 soit 1.83 Volts
16:52:58.453> ADC Results  k=  233 Pts k=00E9 soit 1.14 Volts
16:52:58.640> ADC Results  k=  150 Pts k=0096 soit 0.73 Volts
16:52:58.890> ADC Results  k=   85 Pts k=0055 soit 0.42 Volts
16:52:59.140> ADC Results  k=   16 Pts k=0010 soit 0.08 Volts

16:53:30.578> Recu buffer1= 010000FF, convertit en 0016777471  soit 16777471
16:53:30.765> ADC Results  k=   13 Pts k=000D soit 0.06 Volts

16:53:44.203> Recu buffer1= 000000F0, convertit en 0000000240  soit 240
16:53:44.390> ADC Results  k=   12 Pts k=000C soit 0.06 Volts

 ****************
0 1 mikroCPIC1618.exe -MSF -DBG -pP18F2550 -RA -C -O00001114 -fo8 -N"C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi" -SP"C:\_MikroC\mikroC PRO for PIC\defs\" -SP"C:\_MikroC\mikroC PRO for PIC\uses\P18\" -SP"C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\" "18F2550_test_UART_IT_ADC.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_Conversions.mcl" "__Lib_Sprintf.mcl" "__Lib_ADC_A_D.mcl" "__Lib_EEPROM_256.mcl" "__Lib_UART_c67.mcl"
0 1139 Available RAM: 2027 [bytes], Available ROM: 32768 [bytes]
0 122 Compilation Started P18F2550.c
1411 123 Compiled Successfully P18F2550.c
0 122 Compilation Started __Lib_Delays.c
172 123 Compiled Successfully __Lib_Delays.c
0 122 Compilation Started 18F2550_test_UART_IT_ADC.c
0 1004 interrupt handler (Interrupts at 0x0008) 18F2550_test_UART_IT_ADC.c
343 1509 Generated baud rate is 19231 bps (error = 0.16 percent) 18F2550_test_UART_IT_ADC.c
416 123 Compiled Successfully 18F2550_test_UART_IT_ADC.c
265 1164 Variable 'k' has been eliminated by optimizer 18F2550_test_UART_IT_ADC.c
0 127 All files Compiled in 47 ms
0 1144 Used RAM (bytes): 518 (26%)  Free RAM (bytes): 1509 (74%) Used RAM (bytes): 518 (26%)  Free RAM (bytes): 1509 (74%)
0 1144 Used ROM (bytes): 19643 (60%)  Free ROM (bytes): 13125 (40%) Used ROM (bytes): 19643 (60%)  Free ROM (bytes): 13125 (40%)
0 125 Project Linked Successfully 18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi
0 128 Linked in 47 ms
0 129 Project '18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi' completed: 203 ms
0 103 Finished successfully: 02 mai 2015, 19:10:36 18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi


*/