Version:0.9 StartHTML:0000000105 EndHTML:0000302065 StartFragment:0000001499 EndFragment:0000302049

  #define Version "190224"
  // correction possible bug si Nb heures de peadalage  > 18 Heures ..mais bon

// #define Version "190211"
// readaptation à appli AI2
// #define Version "190210"
 // rajout Adr device = variable locale dans LCD subroutines
// #define Version "190205"
 // enlevé calcul M/S instable et pas assez precis
// new format
// 04/02;17:42; TTdP=   522;Kms= 3.73;Vmoy= 40.18;Duree=00:05:34;Cumul= 43.5
//#define Version "190203"
// rajout Cde HELp, ERASE
// ine 1654: rajout condition supplementaire BP_Stop==1
// test reel
// 04/02;14:48;TTdP=  3210;Kms= 22.93;Vmoy= 34.00  00:40:28;Cumul= 28.4

//#define Version "190202"
// probleme sauvegarde et relecture 24FC1026   corrigé

/*
envoi dans EEPROM
02/02;14:26;TTdP=   252;Kms= 1.80;Vmoy= 40.29  00:02:41;Cumul= 10.8
*/
 // supprimé UART2  .. tout sur UART1
 // affichage alterné M/sec ou Km/H sur LCD
//#define Version "190120"
 // avec RTC DS3231 .. meme programme que DS1307

//#define Version "171120"
// Update RTC uniquement via Termianl sur UART1 !
//  version utilisant des calculs en flottant
// voir aute version basée sur des entiers

//#define Version "171110"
//write_ds3231(0,0x80); //Reset second to 0 sec. and stop Oscillator  was 0x50
//#define Version "171105"
// modif affichage Time   RTC
// rappel : debrancher HC06 pour utiliser ICSP   !

//#define Version "171102"
// 18F26K22_Velo_2017.hex
// rajout Cumul_Kms (en flotant), stocké en fin d'eeprom PIC
// relu et affiché au demarrage
// reactualisé en fin de parcours (sur cde STOP)
// 1 page EEPROM par parcours
// tests réalisé avec generateur TTL 4,83Hz sur RB0

//#define Version "171027"
 //#define FOSC "32MHz"        // 8MHz * PLL
// FOSC=32MHz (was 16MHz)
// affiche vitesse en M/S toute les 10 sec
// et vitesse en KM/H toute les minutes

//#define BT_HC06_JAUNE   // 19200 bauds
//  vue de face composants et de gauche à droite
// HC06-2187J       // pastille Jaune
// UART2
// 1  sortie STATE  .. NC
// 2 RXD  <--- entre -------  vert <--  sortie RB6 TX
// 3 TXS  ---> sortie ------- jaune --> entree RB7 RX
// 4 0V Gnd  --------------Noir 0V
// 5 VCC  3,3V ------------ Roug +3,3V
// 6 Enable   .. NC


//#define Version "171025"
// sans blueTooth
// Cdes distantes
// RELECT
// STOP
// START
//#define Version "171024"
//  test stockage Eeprom
// 24FC1026   1.8-5.5V  1 MHz‡ 1024K I2C™ CMOS Serial EEPROM
 
//#define Version "171021"
 // re_activation BP stop (RB3 pull up 10K et BP au zero)
//#define Roue_700_Theorie 1000*0.7/3.14159   // developper roue  diam 700  (454.73)
#define Developpe_Roue_700 434   // developpé avec rapport de transmission
// test avec Géné TTL  F=4,883 Hz
// Pedalage= 92.8RPM
// Vitesse= 40.80KM/H
// nota: 1 tour de pedale = 3,1 tours de volant d'inertie  (raport de pignon)

 #define Directory      "C:\\_MikroC\\_MesProjets_MikroC\\_18F26K22_Velo_2019 "
 #define Project        "18F26K22_Velo_2019.mcppi"
 #define Source         "_18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float"
 #define FOSC_INTERNE   //"18F26K22_FOSC_Interne_16MHz.cfgsch"
 #define FOSC "32MHz"

 #define MCU  "18F26K22"
 #define POWER_Supply "5V"  //minimum because LCD 4x20 .. 5V maxi
 #define BAUD 19200  // UART1
 #define PIC_EEPROM  "18F26k22_Velo_2017_EEPROM.ihex"
  /*
test avec 18F26K22_FOSC_Interne_16MHz.cfgsch
FOSC interne 16MHz
Tamb=18,1°C
Test action sur OSCTUNE.TUN
avec sortie Fosc/4 sur RA6
31 => 4.145 Mhz
0 => 4.006 MHz
32 => 3.873 Mhz
*/
//
 // Hardware
 //     ac:eeprom   24FC1026  128Kbytes
 
  //ac:adressage
 
   //ac:pinout     MCU
   
   // ac:schema

 
 /*

 Pin 28 RB7  -----------------ICSP Data
 Pin 27 RB6  -----------------ICSP Clock
 Pin 26 RB5
 Pin 25 RB4
 Pin 24 RB3   <---------  Stop
 Pin 23 RB2   <---------  Start
 Pin 22 RB1   <----R=4.7K --<+VCC     Forcage à zero pour init RTC par defaut
 Pin 21 RB0   <-------- Pulse comptage
 Pin 20       VDD --------+5V
 Pin 19       Vss ---------Gnd
 Pin 18  RC7  RX UART 1 <-- Keyboard
 Pin 17  RC6  TX UART 1 --> Display    * mettre une pull up de 10K si RX non utilisée
 Pin 16  RC5
 Pin 15  RC4  SDA ------> 3 LCD 4x20    ---- 3 DS3231
                                             1  DS3231 --- GND
                                             2  DS3231 --- +VCC
 Pin 14 RC3   SCL ------>  3 LCD 4x20   ---- 4  DS3231
 Pin 13 RC2   <-------  input en mode Capture signal via CCP1 et tilmer1
 Pin 12 RC1   <-----  Reset Compteur
 Pin 11 RC0
 Pin 10 RA6
 Pin  9 RA7
 Pin  8 VSS ---------  Gnd
 Pin  7 RA5
 Pin  6 RA4  Output -- Led -- 2,7K --+Vcc
 Pin  5 RA3
 Pin  4 RA2 (DAC)
 Pin  3 RA1  Analog input EA1
 Pin  2 RA0  Analog Input EA0
 Pin  1 RE3  MCLR  Reset --------ICSP PGRM
 
*/

/*
CONFIG1H : $300001 : 0x0038
CONFIG2L : $300002 : 0x0019
CONFIG2H : $300003 : 0x003C
CONFIG3H : $300005 : 0x00BE
CONFIG4L : $300006 : 0x0081
CONFIG5L : $300008 : 0x000F
CONFIG5H : $300009 : 0x00C0
CONFIG6L : $30000A : 0x000F
CONFIG6H : $30000B : 0x00E0
CONFIG7L : $30000C : 0x000F
CONFIG7H : $30000D : 0x0040


*/
#include "built_in.h"     // for  Hi  Lo ..etc

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


#define LCD4x20_I2   // en I2C
#define Eeprom_24C32
#define Eeprom_24FC1026
#define RTC_DS3231  // compatible DS3231
// #define  BT_HC06_VELO
//  à initialiser en emanuel
// car trop de difference de commnandes suivant les modules  


#define DS3231_ADDR     0xD0 // RTC DS3231
#define EEPROM_4K_ADR   0xA0 // EEPROM 24LC32  sur le module RTC
#define EEPROM_128K_ADR 0xA8 // EEPROM 24FC1026  Block=0  A1=0 A2=1

// **********  Config Hardware **********************
#define LCD_ADDR 0x4E     // PCF8574 on pigboard YwRobot back located  on LCD4x20
// PCF8574 I2C LCD Port Definition
// P7,P6,P5,P4 = Data, P3=Backlight (BL), P2=E, P1=RW, P0=RS
#define LCD_BL 0x08
#define LCD_EN 0x04
#define LCD_RW 0x02
#define LCD_RS 0x01

// ref : ODT OCM-20416D-A2023 LCD Module  8/4/1999
// LCD Command
#define LCD_CLEAR 0x01
#define LCD_HOME  0x02
#define Display_ON 0x0C
#define Display_OFF 0x08
#define LCD_LINE1 0x80      // 0x00 + bit D7=1
#define LCD_LINE2 0xC0      // 0x40 + bit D7=1
#define LCD_LINE3 0x94      // 0x14 + bit D7=1
#define LCD_LINE4 0xD4      // 0x54 + bit D7=1

// *******************************************************

const code char mesg0[]="                    ";
const code char mesg1[]=" Mikroc pro 7.30 Beta \r\n";
const code char mesg2[]=" 18F26K22 DS3231 24FC1026 UART1 HC06\n\r";
const code char mesg3[] =" Source : "Source"_"Version".c\r\n";
const code char mesg4[]=" calcul kms en flottant\n\r";
const code char * Messages[]={mesg0,mesg1,mesg2,mesg3,mesg4};


char time[]="00:00:00\0";
char date[]="00/00/00\0";
const code char Jour0[]="Diman";
const code char Jour1[]="Lundi";
const code char Jour2[]="Mardi";
const code char Jour3[]="Mercr";
const code char Jour4[]="Jeudi";
const code char Jour5[]="Vendr";
const code char Jour6[]="Samed";
const code char * JourSemaine[]={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6};
//char Jour_Semaine[7][6]={"Diman","Lundi","Mardi","Mercr","Jeudi","Vendr","Samed"};


#define MAXLEN1 120
#define MAXLEN2 40
#define MAXLEN3 16


sbit Led_Rouge at LATA.B4;
sbit Led_Rouge_Dir at TRISA.B4;

sbit BT_Reset    at LATC.B1;
sbit Pulse_Inp   at PORTB.B0;
sbit  RTC_forcee at PORTB.B1;
sbit  BP_Start   at PORTB.B2;
sbit  BP_Stop    at PORTB.B3;
sbit BT_Reset_Dir    at TRISC.B1;
sbit Pulse_Inp_Dir   at TRISB.B0;
sbit  RTC_forcee_Dir at TRISB.B1;
sbit  BP_Start_Dir   at TRISB.B2;
sbit  BP_Stop_Dir    at TRISB.B3;

// UART1
volatile unsigned char Buffer1[MAXLEN1];
volatile int Flag_Buffer1;
unsigned char *p1;
volatile unsigned int i1;
volatile  int Index1;
volatile unsigned char c1;
volatile unsigned int CptErr;
// UART2
/*
volatile unsigned char Buffer2[MAXLEN2];
unsigned char *p2;
volatile int Flag_Buffer2;
volatile unsigned int i2;
volatile  int Index2;
volatile unsigned char c2;
volatile unsigned int CptErr2;
*/

volatile unsigned int Count0;
volatile unsigned int Count1;
volatile unsigned int Count2;
volatile int Flag_Timer0;
volatile int Flag_Timer1;
volatile int Flag_Timer2;
volatile int NbCycles_T1;
volatile unsigned int Duty;

int i,j,k,l,m,n;
unsigned int jx;
int sk;
unsigned  char TEXTE[MAXLEN1]; //was 96
unsigned char * txt;
char CRam1[MAXLEN2];   // for flot2asccii use
char CRam2[32];   // for flot2asccii use
char Tampon[MAXLEN3];
int EAn0,EAn1,EAn2;
unsigned char N1;
unsigned char  donnee;
unsigned int addr;
unsigned int Adr_24FC1026;
//unsigned int  Adr_24C32;
unsigned int erreurs;
unsigned char err;
unsigned int NumPage, Idx;
static unsigned char Page_Eeprom[129];
unsigned char Device_Adresse;
unsigned char Bloc; 
int Etat;

unsigned long L1;

unsigned int Is;
unsigned char Sorties_1;
unsigned char Entrees_1;
unsigned char dummy;
unsigned int Index;
unsigned int M;

unsigned char Adr;
//unsigned char lcddata;
//unsigned char Du;

float F1;
float Nb_Kms=0.0;           // nombre de kms
float Nb_TdP=0.0;
float  Old_Nb_TdP=0.0;
float NbTdpPerMn=0.0 ;

unsigned int Nb_Hecto=0;
unsigned int Nb_Pu=0;    // nombre de tour de pedales pour 1km
unsigned int Nb_P=0;     // nb de tour de pedale pour 1 hectometre

//unsigned char ch[3];
unsigned long TimeNow;
unsigned long TimeLast;
unsigned long TimeStop;
unsigned long EcartTime;
unsigned long OldTime ;
unsigned long TimeStart;
unsigned int Velo_Status;
unsigned int Indice=0;

unsigned long Delta_PulsesM;
unsigned long Old_Nb_PulsesM;
unsigned long Ecart_Nb_Tdp;
unsigned long Old_Nb_Tdp;

unsigned long Nb_Pulses=0;
unsigned long Delta_Pulses=1;
unsigned long Old_Nb_Pulses=0;
unsigned long  Old_Nb_TdpM;

float Cumul_Kms ;    // stocké en fond d'EEPROM du PIC
float Speed;
float SpeedK;

struct chbits {   // 8 flags
                 unsigned FrameErr:1;
                 unsigned Store:1;
                 unsigned Elapsed:1;
                 unsigned Togle:1;
                 unsigned Stop;   //was Second
                 unsigned Gie:1;
                 unsigned Full:1;
                 unsigned Started:1;
   }Drapeaux ;

int Display;
//char DT[9];
char * pd;
unsigned short second,minute,heure,jS,jour,mois,Annee;
unsigned short DateTime[10];



// ====Zone  for TEST   =======================



//===================================



void Init_Hardware(void) ;
void Read_Msg_Eeprom( int depuis);
void Write_Msg_Eeprom( int Adr,const char * d1) ;
void Init_Timer0(void);
void Init_Timer1 (void);    //50
void Init_Timer2 (void);    //125mS
void CRLF1(void) ;
void Raz_Buffer1(void) ;
void UART1_Write_CText(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);
void Float2Ascii (float x, unsigned char *chaine,char precision) ;
void CRLF2(void) ;
void Raz_Buffer2(void) ;
void UART2_Write_CText(const char *txt);

unsigned char * Delta_Time(void);

void PrintHandler(char c) ;

//---- EEPROM PIC  bytes  ================
void Save_Msg_To_EEPROM(unsigned char * adrx, unsigned char *ptr1);
void PrintOut_Eeprom_Msg(unsigned char PtrE);  //  for 16Fxxxxx

// === Eeprom 32 Kbytes 24FC1026 --256Kbits
void Write_To_24FC1026(unsigned int Adr, unsigned char c);
unsigned char Read_From_24FC1026(unsigned int Adr);
void Write_Page_To_24FC1026(unsigned int Page);
void Read_Page_From_24FC1026(unsigned int Page);
void  Affiche_Page_Eeprom(void);

void Save_NumPage_24FC1026_To_PIC_Eeprom(int i);
void Save_Date_Time_To_24FC1026(void);
void Save_Cumul_Kms_To_PIC_Eeprom(int devermine);
void Restore_NumPage_24FC1026_From_PIC_Eeprom(void);
void Read_NumPage_From_24FC1026(unsigned int Page);
void Restore_Last_Cumul_Kms_From_PIC_Eeprom(void) ;

 #include "LCD_4x20_I2C_1902.h"
 #include "Tiny_RTC_DS3231.h"   // compatible DS3231 !

void Interrupt_High() iv 0x0008 ics ICS_AUTO
{
  /* RB0 interrupt  */
  if ( (INT0IE_bit==1) && (INT0IF_bit==1))
    {
    Nb_Pulses++;           // nombre de tour de pedales
   
   /*   pour version sans flottant
    if (Velo_Status==1)
    {
    Nb_Pu++;
    Nb_P++;
    if (Nb_P>46)    // comptage Hectometre
    { 
       Nb_Hecto++;
       Nb_P=0;
    }
    if (Nb_Pu>464)      // comptage KM ROND
    {
      Nb_Kms=Nb_Kms+1;
      Nb_Pu=0;
      Nb_Hecto=0;
      Nb_P=0;
     }
     }
     */
    if (Nb_Pulses %3==0) Led_Rouge=!Led_Rouge; // change  à peu pres à chaque tour de pedale
    if(BP_Stop==0)Velo_Status=0;
    INT0IF_bit = 0 ; // efface le flag pour valider le procahin appel
    }
    // ------  timer 1  ----------------
  if  ( (TMR1IE_bit==1) && ( TMR1IF_bit==1))
   {
      TMR1H         = 0x3C;     // 15536
      TMR1L         = 0xB0;
     Count1++;
     if (Count1>=NbCycles_T1)   // Count1 x 100 mS
       {
        Count1=0;
        Flag_Timer1=1;
        TMR1IE_bit=0;
      }
      PIR1.TMR1IF=0;
   }
   
      // ------  timer 1  ----------------
  if  ( (TMR0IE_bit==1) && ( TMR0IF_bit==1))
   {
        //Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 500 ms  at 32Mhz
        TMR0H         = 0x0B;
        TMR0L         = 0xDC;
       Flag_Timer0=1;
       TMR0IE_bit=0;
       TMR0IF_bit=0;
   }

  if (( RC1IF_bit==1) && (RC1IE_bit==1) )
    {
     c1 = UART1_Read();
     //TXREG=c1;
     // TXREG1=c1;
   // traitement separe des erreurs de COM
      if (RCSTA1.OERR==1)    // voir parag 16.1.26 p273
      {
       RCSTA1.CREN = 0 ;
       CptErr++;
       RCSTA1.CREN = 1 ;
       c1=0;

       }
      if(RCSTA1.FERR==1 )
      {
      RCSTA1.SPEN = 0 ;
      CptErr++;
      RCSTA1.SPEN= 1 ;
      c1 = UART1_Read();
      }
     if ((c1==CR) ||  (i1>MAXLEN1-1))
     {
      Flag_Buffer1=1;
      Buffer1[i1]=0;
      RC1IE_bit=0;
      Index1=i1;
      i1=0;
     }
     else
     {
       Flag_Buffer1=0;
       Buffer1[i1]=c1;
       Index1=i1;
       i1++;
     }
   }
   // --- UART2 ------
   /*
    if (( RC2IF_bit==1) && (RC2IE_bit==1) )
    {
     c2 = UART2_Read();
     TXREG2=c2;
     // TXREG1=c1;
   // traitement separe des erreurs de COM
      if (RCSTA2.OERR==1)    // voir parag 16.1.26 p273
      {
       RCSTA2.CREN = 0 ;
       CptErr++;
       RCSTA2.CREN = 1 ;
       c2=0;
       }
      if(RCSTA2.FERR==1 )
      {
      RCSTA2.SPEN = 0 ;
      CptErr++;
      RCSTA2.SPEN= 1 ;
      c2 = UART2_Read();
      }
     if ((c2==CR) ||  (i2>MAXLEN2-1))
     {
      Flag_Buffer2=1;
      Buffer2[i2]=0;
      RC2IE_bit=0;
      Index2=i2;
      i2=0;
     }
     else
     {
       if(c2!=LF)
       {
       Flag_Buffer2=0;
       Buffer2[i2]=c2;
       Index2=i2;
       i2++;
       }
     }
   }
   */
 }

// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
 {
  while (*source)*dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}


void Read_Msg_Eeprom( unsigned char debut)
{   int i1 ,i;
  i1=debut;
  do
  {
  i = EEPROM_Read(i1);
  if ( i==0) break;
  if ( i1>254) break;
  UART1_Write(i);
  Tampon[i1-debut]=i;
  Delay_ms(5);
  i1++;
   }
  while (i!=0) ;
 }
 
 //  *********************************
 void Init_Timer0(void)
 {
//at 32MHz
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 500 ms
  T0CON         = 0x85; // 500mS   32MHz
  TMR0H         = 0x0B;
  TMR0L         = 0xDC;
  TMR0IE_bit = 1;
  Flag_Timer0=0;
  INTCON.TMR0IF=0;
  TMR0ON_bit=1;
  TMR0IE_bit=1;
 }

#ifdef  BT_HC06_VELO

int Init_BT_With_feeback()
{
  int i=0;
  int State=0;
  LCD_Cmd(LCD_LINE2);
  LCD_Write_CText("INIT.BT HC06 VELO  ");
  LCD_Cmd(LCD_LINE3);
  LCD_Write_CText("Etape: 1 sur 4");  Delay_ms(500);
 /*
  do
  {
  UART1_Write_CText("AT\r\n");  // PCR apres cde !
 // UART1_Write_CText("AT");
  Delay_ms(1500); i++;
  }while(i<3);
  */
  State=0;
  i=0;
  // on nettoye avant..
  //UART1_Write_CText("RAZ Buffer1\r\n");
  Raz_Buffer1();
  UART1_Write_CText("AT");  //  CR apres cde !
  //UART1_Write_CText("AT");
  Delay_ms(100);
  Init_Timer0();  //5000ms
   do
    {
     p1=strstr(Buffer1,"OK");
    if(p1>0)
    {
      State=1;
      break;
     }
  }while((Flag_Timer0==0)&&(p1==0) );
  //  }while((Flag_Timer0==0) && (p2==0));
  // UART1_Write_Text(Buffer1);
  if(Flag_Timer0==1)return State;
  Buffer1[19]=0; Erase_Line(4); LCD_puts(Buffer1);
  Delay_1sec();

  //-----------------------------
  LCD_Cmd(LCD_LINE3);
  LCD_Write_CText("Etape: 2 sur 4");
    UART1_Write_CText("AT");
  Delay_ms(250);
  Raz_Buffer1();
 // UART1_Write_CText("AT+PWD?\r\n");  //  CR apres cde !
  UART1_Write_CText("AT+PIN1234\r\n");
  Init_Timer0();  //500mS
  do
  {
  p1=strstr(Buffer1,"OK");
    if(p1>0)
    {
      State=2;
      break;
     }
  }while((Flag_Timer0==0) && (i1<2));
  // UART1_Write_Text(Buffer1);
  if(Flag_Timer0==1) return State;
  Buffer1[19]=0;   Erase_Line(4);  LCD_puts(Buffer1);
  Delay_1sec();
   // -------------------------------
  LCD_Cmd(LCD_LINE3);
  LCD_Write_CText("Etape: 3 sur 4");
    UART1_Write_CText("AT");
  Delay_ms(150);
  Raz_Buffer1();
  //UART2_Write_CText("AT+NAMEHC06-7D69B");  // PAS de CR apres cde !
  UART1_Write_CText("AT+NAMEHC06_VELO\r\n");
  Buffer1[19]=0;  LCD_Cmd(LCD_LINE4); LCD_puts(Buffer1);
  Init_Timer0();  //250ms
   Delay_ms(100);
  do
  {
    p1=strstr(Buffer1,"OK")  ;
    if(p1>0)
    {
      State=3;
      break;
     }
  }while((Flag_Timer0==0) && (i1<2));
  //UART1_Write_Text(Buffer1);
  if(Flag_Timer0==1) return State;
  Buffer1[19]=0;  LCD_Cmd(LCD_LINE4); LCD_puts(Buffer1);
  Delay_1sec();
  // --------------------------------------
   LCD_Cmd(LCD_LINE3);
  LCD_Write_CText("Etape: 4 sur 4");    Delay_ms(500);
  UART1_Write_CText("AT");
  Delay_ms(50);
  Raz_Buffer1();
  UART1_Write_CText("AT+VERSION\r\n");
  Init_Timer0();  //500ms
  Buffer1[19]=0;
  LCD_Cmd(LCD_LINE4); LCD_puts(Buffer1);
  do
  {   Delay_ms(50);
    p1=strstr(Buffer1,"OKlinvor");
    if(p1>0)
    {
      State=4;
      break;
     }
  }while((Flag_Timer0==0) && (p1==0));
  // UART1_Write_Text(Buffer1);
  if(Flag_Timer0==1) return State;
  Delay_ms(500);
  Buffer1[19]=0;  LCD_Cmd(LCD_LINE4); LCD_puts(Buffer1);
  CRLF1();
  State=5;
  return(State);
 }
 #endif

void Init_Timer1(int Va)
{
// at 16MHz   Interrupt Time : 100 ms
// at 32MHz   Interrupt Time : 50 ms
//Prescaler 1:8; TMR1 Preload = 15536;
  T1CON         = 0x30;
  TMR1IF_bit         = 0;
  TMR1H         = 0x3C;
  TMR1L         = 0xB0;
 TMR1CS1_bit=0;
 TMR1CS0_bit=0;
 Count1=0;
 NbCycles_T1=Va;  // parametrage timer to 100x100= 10sec
 Flag_Timer1=0;
 TMR1ON_bit=1;
 TMR1IE_bit=1;
}

void Init_Hardware()
{
  ANSELA =0b00000011;
  PORTA = 0b00000111;
  TRISA = 0b00101111;  // PORTA is RA0,1= analog input  RA2,RA3,RA5 =input  RA4=Digital output
  Led_Rouge_Dir=0;
  ANSELB=0;
  PORTB = 0xFF;
  TRISB = 0xFF;    //   ATTENTION B7 B6 for ICSP Pickit3
  TRISB.B7 = 1;  // RX - UART2
  TRISB.B6 = 1;  // TX - UART2  (set as output by Init_UART)
  Pulse_Inp_Dir    =1;
  RTC_forcee_Dir   =1;
  BP_Start_Dir     =1;
  BP_Stop_Dir      =1;
  ANSELC=0;
  PORTC = 0x80;          // RC0..RC5,RC7 = input RC6=Output
  TRISC = 0xFF;    //
  TRISC.B3 = 0;  // SCL I2C
  TRISC.B4 = 1;  // SDA I2C
  TRISC.B7 = 1;  // RX - UART1
  TRISC.B6 = 1;  // TX - UART1    set as output by Init_UART)
  BT_Reset_Dir  =0;  // C1 reset to HC06
 }

void PrintHandler(char c)
 {
  UART1_Write(c);
}

void CRLF1()
{
 UART1_Write(CR);
 UART1_Write(LF);
}

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

void Raz_Buffer1()
{

        Index1=0;
        Flag_Buffer1 =0;
        // nettoye le debut de Buffer1 ,car utilisé pour init BT
        for(i1=0;i1<MAXLEN1-1;i1++)Buffer1[i1]=0;
        c1=RCREG1;
        RCEN_bit=0;
        RCEN_bit=1;
        Index1=0;
        i1=0;
        PEIE_bit=1;
        RC1IE_bit = 1;
}

/*

void UART2_Write_CText(const char *txt)
 {
   while (*txt)
      UART2_Write(*txt++);
}


void CRLF2()
{
 UART2_Write(CR);
 UART2_Write(LF);
}

void Raz_Buffer2()
{

        Index2=0;
        Flag_Buffer2 =0;
        // nettoye le debut de Buffer1 ,car utilisé pour init BT
        for(i2=0;i2<MAXLEN2-1;i2++)Buffer2[i2]=0;
        Index2=0;
        i2=0; 
        c2=RCREG2;
        RC2IE_bit = 1;
}

   */
   
// ***************  24FC1026 ***********************
void Write_To_24FC1026(unsigned int Adr, unsigned char cx)
{
 Device_Adresse= EEPROM_128K_ADR; //+ Adr>>9;
I2C1_Is_Idle();
I2C1_Start();
err=I2C1_Wr(Device_Adresse );      // write
err=I2C1_Wr(hi(Adr));    // send data (data to be written)
err=I2C1_Wr(lo(Adr));
Delay_ms(5);
err=I2C1_Wr(cx);    // send data (data to be written)
I2C1_Stop();
I2C1_Is_Idle();
Delay_ms(5);  // was 10mS
}

unsigned char Read_From_24FC1026(unsigned int Adresse)
{
unsigned char c3;
Device_Adresse= EEPROM_128K_ADR;  // limite sur le 1er block  blocd=0
//Device_Adresse= EEPROM_128K_ADR+ Adresse>>9;
I2C1_Is_Idle();
 Delay_ms(1);
I2C1_Start();
err=I2C1_Wr(Device_Adresse );  // write
err=I2C1_Wr(hi(Adresse));    // send adress to be read)
err=I2C1_Wr(lo(Adresse));
I2C1_Is_Idle();
Device_Adresse= EEPROM_128K_ADR + 1;
//Device_Adresse= EEPROM_128K_ADR + 1 + Adresse>>9;
I2C1_Repeated_Start();
err=I2C1_Wr(Device_Adresse );  // Read
c3=I2C1_Rd(0u);    // data to be read)
I2C1_Stop();
I2C1_Is_Idle();
return c3;
}

void Write_Page_To_24FC1026(unsigned int Page)
{
 unsigned int Ad;
 unsigned char Is;
 if(GIE_bit) Is=1;
 GIE_bit=0;
 erreurs=0;
 Device_Adresse= EEPROM_128K_ADR; //+ Page>>8;
 Ad=Page << 7;
 I2C1_Is_Idle();
 I2C1_Start();
 err=I2C1_Wr(Device_Adresse );      // write
 err=I2C1_Wr(hi(Ad));    // send data (data to be written)
 err=I2C1_Wr(lo(Ad));
 if (err>0) erreurs++;
 for (Ad=0;Ad<127;Ad++)
 {
 err=I2C1_Wr(Page_Eeprom[Ad]);    // send data (data to be written)
 if(err>0) erreurs++;
 }
 I2C1_Stop();
 I2C1_Is_Idle();
 if (Is==1)GIE_bit=1;
}

void Read_NumPage_From_24FC1026(unsigned int Page)
{
 unsigned int Ad;
 unsigned char AdreH,AdreL;
 unsigned char Is;
 if(GIE_bit) Is=1;
  GIE_bit=0;
 Ad=(Page << 7) ;
 AdreH=Hi(Ad);
 AdreL=Lo(Ad);
 Device_Adresse= EEPROM_128K_ADR;//+ Page>>8;
// debug
// UART1_Write_CText("AdrH= ");ByteToHex(AdreH,CRam1); UART1_Write_Text(CRam1);
// UART1_Write_CText(" AdrL= ");ByteToHex(AdreL,CRam1); UART1_Write_Text(CRam1);
// CRLF1();
 I2C1_Is_Idle();
 I2C1_Start();
 err=I2C1_Wr( Device_Adresse );  // write
 err=I2C1_Wr(hi(Ad));    // send data (data to be written)
 err=I2C1_Wr(lo(Ad));
 I2C1_Repeated_Start();
 err=I2C1_Wr( Device_Adresse+1 );  // Read
 I2C1_Is_Idle();
 for (Ad=0;Ad<127;Ad++)
 {
  Page_Eeprom[Ad]=I2C1_Rd(1u);    // data to be read)
 }
  Page_Eeprom[Ad]=I2C1_Rd(0u);    // data to be read)
 I2C1_Stop();
  I2C1_Is_Idle();
  if (Is==1)GIE_bit=1;
}

 void Save_Cumul_Kms_To_PIC_Eeprom(int devermine)
 {
  unsigned char cx;
  cx=lo(Cumul_Kms);
  EEPROM_Write(0x03FA,cx);  Delay_ms(20);
   cx=hi(Cumul_Kms);
  EEPROM_Write(0x03FB,cx);  Delay_ms(20);
   cx=higher(Cumul_Kms);
  EEPROM_Write(0x03FC,cx);  Delay_ms(20);
   cx=highest(Cumul_Kms);
  EEPROM_Write(0x03FD,cx);  Delay_ms(20);
  if(devermine==1)
  {
  sprintf(txt," Sauve Cumul_Kms %5.1f -> EEPROM du PIC , en 0x03FA,B,C,D \r\n",Cumul_Kms);
  UART1_Write_Text(txt) ;
  }
}

void Save_NumPage_24FC1026_To_PIC_Eeprom(int devermine)
{unsigned char cx;
  Idx=0;
  cx=(NumPage >> 8 );   // MSB
  EEPROM_Write(0x03FE,cx);  Delay_ms(20);
  cx=NumPage & 0x00FF; //LSB
  EEPROM_Write(0x03FF,cx);  Delay_ms(20);
  if(devermine==1)
  {
  sprintf(txt," Sauve Numpage %03d dans EEPROM du PIC , at 0x03FE =MSB et 0x03FF=LSB\r\n",NumPage);
  UART1_Write_Text(txt) ;
  }
}

 void Save_Date_Time_To_24FC1026(void)
 { int i;
   for (i=0;i<128;i++)Page_Eeprom[i]=0;
   Refresh_display_date_Time() ;
   Idx=0;
   UART1_Write_CText("\r\n Stockage horodatage\t");
   strncpy(Page_Eeprom+Idx,date,5); // JJ/MM  sauf AA
   Idx=5;
   Page_Eeprom[Idx]=';';
   Idx=6;    //HH:MM
   strncpy(Page_Eeprom+Idx,time,5);Idx=11;
   Page_Eeprom[Idx]=';';Idx=12; Page_Eeprom[12]=0;
   txt=TEXTE;
   sprintf(txt,"\r\n DateTime=  %s   next Idx Page_Eeprom = % 5d  \r\n",Page_Eeprom,Idx);
   UART1_Write_Text(txt);
}


void Restore_NumPage_24FC1026_From_PIC_Eeprom()
  {   int k;
       // recupere  indice 24FC1026 stocké dans les 2 derniers bytes de l'Eeprom du PIC
      dummy= EEPROM_Read(0X03FE) ; // lecture a l'adresse adrL
      k=dummy;
      dummy=EEPROM_Read(0x03FF) ;
      NumPage=(k <<8) + dummy;
      if (NumPage==0xFFFF) NumPage=0;
      UART1_Write_CText( " NumPage 24FC1026 recupérée de L'EEPROM du PIC en 0x03FE et 0x3FF= ");
      txt=TEXTE;
      WordToStr( NumPage, txt);
      UART1_Write_Text(txt);
      CRLF1();
      Idx=0;   // on demarre sur un debut de page
   }
   
 void Restore_Last_Cumul_Kms_From_PIC_Eeprom()
  {   int k;
        unsigned char cx;
        cx= EEPROM_Read(0X03FA) ; // lecture a l'adresse adrL
        if(cx==0xFF) Cumul_Kms=0.0;
        else
        {
        lo(Cumul_Kms)=cx;
        cx= EEPROM_Read(0X03FB) ; // lecture a l'adresse adrL
        hi(Cumul_Kms)=cx;
        cx= EEPROM_Read(0X03FC) ; // lecture a l'adresse adrL
        higher(Cumul_Kms)=cx;
        cx= EEPROM_Read(0X03FD) ; // lecture a l'adresse adrL
        highest(Cumul_Kms)=cx;
        }
        sprintf(txt," Last Cumul Kms recupérée de L'EEPROM du PIC en 0x03FA..0x03FD= % 5.1f\r\n ",Cumul_Kms);
        UART1_Write_Text(txt);
   }

void Affiche_Page_Eeprom()
{
 int i;
 for (i=0;i<128;i++)
 {
  if (i%8==0)
  {
   CRLF1();
   WordToStr(i,txt);
   UART1_Write_Text(txt);
   UART1_Write('>');   UART1_Write(TAB);
   }
   ByteToStr(Page_Eeprom[i],txt);
   UART1_Write_Text(txt);UART1_Write(TAB);
 }
}

void Float2Ascii (float z, 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 */
 float x;
 int ie, i, k, ndig;
 double y;
 x=z;
 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 I2C1_TimeoutCallback(char errorCode)
{
   if (errorCode == _I2C_TIMEOUT_RD) {
     // do something if timeout is caused during read
   }
   if (errorCode == _I2C_TIMEOUT_WR) {
     // do something if timeout is caused during write
   }
   if (errorCode == _I2C_TIMEOUT_START) {
     // do something if timeout is caused during start
   }
   if (errorCode == _I2C_TIMEOUT_REPEATED_START) {
     // do something if timeout is caused during repeated start
   }
}

void Affiche_Time(int ModeOutput)  // 0= Terminal(sans Jour) 1=LCD 2=Terminal (avec jour) Printer 3=HC06
{  char * pp;
   TimeNow=Bcd2Dec16(heure)*3600+Bcd2Dec16(minute)*60+Bcd2Dec16(second);
  switch(ModeOutput )
  {
    case 0:
     UART1_Write_Text( date);  UART1_Write(';');
     UART1_Write_Text(time);
      UART1_Write(';');
     break;
    case 2:
        Erase_Line(1);;
       LCD_Write_CText("DATE: ");
       LCD_Cmd(LCD_LINE1+6);
       LCD_puts(date);
       LCD_Cmd(LCD_LINE1+15);
        LCD_Write_CText(JourSemaine[jS]);
       break;
    case 4:
      Erase_Line(1);
      LCD_Write_CText("TIME: ");
      LCD_Cmd(LCD_LINE1+6);
      LCD_puts(time);
     break;
    case 6  :
       Erase_Line(1);
       LCD_Write_CText("DUREE = ");
       LCD_Cmd(LCD_LINE1+8);
       EcartTime=TimeNow-TimeStart;
      //or test 
      // EcartTime=36000;
       pp=Delta_Time();
       LCD_puts(pp);
      // UART1_Write_Text(pp);CRLF1();
       break;
     case 8:
        UART1_Write_CText(JourSemaine[jS]);UART1_Write(' ');
        UART1_Write_Text( date);  UART1_Write(' ');
        UART1_Write_Text(time);
        CRLF1();
        break;
     case 10:
     //HC06 blueTooth
     strConstRamCpy(txt,JourSemaine[jS]);
      strcat(txt,";");
     strcat(txt,date);
     strcat(txt,";");
     strcat(txt,time);
     strcat(txt,";\r\n");
     UART1_Write_Text(txt);
     break;
   }
 }
 

void check_device(unsigned char dev_address)
{
strConstRamCpy(txt," Device at adresse : ");
k=strlen(txt);
ByteToStr(dev_address,CRam1);
strcat(txt+k,CRam1);
UART1_Write_Text(txt);
I2C1_Start();
if(I2C1_Wr(dev_address)!=0 )
 {
  UART1_Write_CText(" is not found");
 }
 else
 {
  UART1_Write_CText(" found OK");
  }
I2C1_Stop();
 CRLF1();
}

unsigned char * Delta_Time(void)
{ unsigned int l,j,k;
   unsigned char DT[9];
   pd=DT;
   // heures     18H00 maxima !
   l=EcartTime/3600;
   *(pd)=l/10 +48;
   *(pd+1)=l%10 +48;
   *(pd+2)=':' ;
   // minutes
   j=EcartTime-(l*3600);
   j=j/60;
   *(pd+3)= j/10 +48;
   *(pd+4)= j%10 +48;
   *(pd+5)=':' ;
   k=EcartTime-(l*3600)-(j*60);
   *(pd+6)=k/10 +48;
   *(pd+7)=k%10 +48;
   *(pd+8)=0 ;
  return pd;
}


void main()
 {
  #ifdef FOSC_INTERNE
 // Attention 1MHz par defaut car OSCON RAZ au reset  !
  OSCCON=2;
 // OSCCON=0b01110010;
 // config 16MHz
 /* OSCCON.IRCF2=1; //HFINTOSC - (16 MHz)
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=1;
  OSCCON=0x72; //16Mhz
  OSCTUNE=0;
  OSCTUNE.PLLEN=0;  // 1= avec PLL => 64Mhz ou 40Mhz   0 =sans PLL => 16Mhz  ou 10Mhz
  */
  // config 32MHz
  OSCCON=0;  // zero si PLL utilisée
  OSCCON.IRCF2=1; //HFINTOSC - (8 MHz)
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=0;
  OSCTUNE=0;
  OSCTUNE.PLLEN=1;  // 1= avec PLL => 32Mhz     PLL Enable dans config bits

  #else
  // FOSC=Q=20MHz
 #endif
 
  Delay_1sec();
  Init_Hardware() ;
  Led_Rouge=0;

  RCSTA2.CREN=0;
  RCSTA1.CREN=0;
  RC1IE_bit = 0;
  GIE_bit=0;
  BT_Reset=0;
  
   txt=&TEXTE[0];
/*
// for test only
  c1=0x23;
  BCD_To_Ascii(c1,time) ;
  c2=0x59;  // 59 BCD
  BCD_To_Ascii(c2,time+3) ;
  c1=0x19;
  BCD_To_Ascii(c1,time+6) ;
  */

  UART1_Init(19200);  // Initalize USART (38400,8,N)
  UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
  Delay_ms(500);

   //==== TEST ZONE 1 ============================
   




  //=== fin test zone 1 =======================
  
  UART1_Write_CText(Messages[1]);
  UART1_Write_CText(Messages[2]);
  UART1_Write_CText(Messages[3]);
  UART1_Write_CText(Messages[4]);
  Delay_1sec();

  BT_Reset=1;
  txt=&TEXTE[0];
  // presentation
  CRLF1();
  UART1_Write_CText(" Presentation :\r\n");
  Led_Rouge=1;
  Read_Msg_Eeprom(0x00);
  Read_Msg_Eeprom(0x20);
  Delay_1sec();

  Adr=LCD_ADDR;
  I2C1_Init(400000);
  I2C1_Stop();
  I2C1_SetTimeoutCallback(1000, I2C1_TimeoutCallback);

  Read_Msg_Eeprom(0x50);
  Led_Rouge=0;

   UART1_Write_CText(" Test presence du LCD (PCF8754) : ");
   check_device(Adr);
  
  LCD_init_4x20();
  LCD_Cmd(LCD_CLEAR);  // LCD Clear
  LCD_Cmd(LCD_LINE1);LCD_Write_CText("18F26K22 MikroC 7.30");
  LCD_Cmd(LCD_LINE2); LCD_Write_CText("Version : "Version);
  LCD_Cmd(LCD_LINE3);LCD_Write_CText("UART1 19200,8,N,1   ");
  LCD_Cmd(LCD_LINE4);LCD_Write_CText("RTC,LCD sur bus I2C1");
  IPEN_bit=1;
  PEIE_bit=1 ;
  GIE_bit=1;
  UART1_Write_CText(" Test IT Timer1 delay=2sec\r\n");
  Init_Timer1(40); // 40 x 50ms =2sec at 32MHz
  while(Flag_Timer1==0);
  LCD_Cmd(LCD_CLEAR);
  PEIE_bit=0 ;
  GIE_bit=0;

  

  //Read_Msg_Eeprom(0x70);
  Adr=DS3231_ADDR ;
  UART1_Write_CText(" Test presence RTC DS3231\r\n");
  check_device(Adr);
  if(RTC_forcee==0)     // RB1=0   (R=4.7K en pull up)
  {
  //Adr=DS3231_ADDR ;
  UART1_Write_CText( " RB1=0 donc ,Init RTC DS3231par defaut ");
  write_ds3231(0,0x80); //Reset second to 0 sec. and stop Oscillator
  write_ds3231(1,0x59); //write min
  write_ds3231(2,Dec2Bcd(18)); //write hour
  write_ds3231(3,0x01); //write day of week
  write_ds3231(4,0x23); // write date
  write_ds3231(5,0x10); // write month
  write_ds3231(6,Dec2Bcd(17)); // write year 2017
  write_ds3231(0,0x00);  // second=0  run oscillator
  }
  else
   {
       UART1_Write_CText(" Re-Lecture RTC DS3231");
   }
  CRLF1();
   Delay_1sec();

  // recupere Numpage   AVANT d'etre en mode interruption !
  Restore_NumPage_24FC1026_From_PIC_Eeprom() ;
  Refresh_display_date_Time();



  //=============================  test zone 2 ============================


  
     //============================= FIN  test zone 2 ============================

  LCD_Cmd(LCD_CLEAR);
  Affiche_Time(1);

  LCD_Cmd(LCD_LINE2);
  LCD_Write_CText("FOSC Interne 32MHz  ");

  Restore_Last_Cumul_Kms_From_PIC_Eeprom();
  sprintf(txt,"Cumul Kms % 5.1f  ",Cumul_Kms);
  LCD_Cmd(LCD_LINE3);LCD_puts(txt);

  PEIE_bit=1 ;
  GIE_bit=1;

  #ifdef  BT_HC06_VELO

    Read_Msg_Eeprom(0x80);
   //Init_Timer1(8);  // 8x100mS
     Erase_Line(3);
   k=Init_BT_With_feeback();
   TMR0ON_bit=0;
   Delay_ms(500);
   Adr=LCD_ADDR;
   LCD_Cmd(LCD_LINE3);
   if(k>4)
    sprintf(txt,"Init BT  State=%02d ",k);
   else
     sprintf(txt, "BAD Init or Connecte");
   LCD_puts(txt);
    sprintf(txt,"Allready Connected or Bad Init BT State=%02d\r\n",k);
    UART1_Write_Text(txt);
   Delay_ms(1500);
#endif


  Init_Timer1(20); // 1sec at 32MHz
  while(Flag_Timer1==0);

  PMD0.UART2MD=1; // UART2 Peripheral Module Disable Control bit  1=disable
 // UART2_Init(19200);  // Initalize USART (38400,8,N)
//  UART1_Write_CText(" Init UART2 pour HC06 BlueTooth link :\r\n");
 // RCSTA2.CREN = 1;
 // TXSTA2.TXEN=1;
 // TXSTA2.SPEN=1;
  IPEN_bit=1;
  PEIE_bit=1 ;
 // RC2IE_bit=1;
  GIE_bit=1;
  
  // Test si HC06 connecté
  /*
  while(1)
  {
  Raz_Buffer2();
  UART1_Write_CText("AT\r\n");
  UART2_Write_CText("AT");
  Delay_ms(2000);
  if(( Flag_Buffer2==1) || (i1>1))
  {
  UART1_Write_Text(Buffer2);
  CRLF1();
  }
  }
  */


   RCSTA1.CREN = 1;
   c1=RCREG;
   Raz_Buffer1();

    Nb_Pulses=0L;        // nombre de tour de pedales
    Nb_Kms=0.0;
    Nb_TdP=0.0;
    Led_Rouge=1;  // eteinte car rappel au +5V
    UART1_Write_CText("Commencer à pedaler ..\r\n");
    Adr=LCD_ADDR;
    Erase_Line(3);
    LCD_Write_CText ("Pedaler pour Debuter");
     Delay_1sec();
    //    LCD_Msg_Status("Pedaler pour Debut..");
   // demarre par detection tour de pedale
    j=0;
    k=0;
    Velo_Status=0;
     UART1_Write_CText(" BP_Stop=");
     UART1_Write(BP_Stop+48);
    CRLF1();
    Erase_Line(4); //LCD_Cmd(LCD_LINE4);
    if (BP_Stop==0)
    {
       LCD_Write_CText (" Enlever le STOP... ");
        Delay_ms(2000);
         Erase_Line(4);
        Delay_ms(2000);
        }
    while(BP_Stop==0) ;
    Delay_1sec();
   Erase_Line(3);
   Erase_Line(4);
   do
   {
    Refresh_display_date_Time();
   Affiche_Time(2);
    if(BP_Stop==0) j=0;
    if( (k==1) &&(PORTB.B0==1))
     {
     Delay_ms(10);
     j++;
     k=0;
     Led_Rouge=1;
     }
     //Pulse_Inp
     if((k==0)&& (PORTB.B0==0))
     {
      Delay_ms(10);
      j++;
      k=1;
        Led_Rouge=0;
      }

      UART1_Write_CText(" Comptage Nb tour de pedale  J =");
      WordToStr(j,CRam1);
      UART1_Write_Text(CRam1);
      CRLF1();

       LCD_Cmd(LCD_LINE2);
        LCD_Write_CText ("Nb Tr Pedale ");
        LCD_Cmd(LCD_LINE2+ 13);
       LCD_puts (CRam1);
       Delay_ms(1000);
    }
    while((j<5) && (BP_Stop==1)) ;
    LCD_Cmd(LCD_LINE3);
    if (BP_Stop==0) 
    {
    LCD_Write_CText (" STOP ....          ");
    Delay_1sec();
    _asm goto 0;
    }
    else
    {
     LCD_Msg_Status("Compteur RUNNING   ");
   }
   Refresh_display_date_Time();
   Affiche_Time(1);
   Save_Date_Time_To_24FC1026() ;
   TimeStart=TimeNow;
    Speed=0.0;
   OldTime=TimeNow;
   Velo_Status=1;
   Drapeaux.Started=0;

    Old_Nb_Pulses=0;
    Delta_Pulses=0;
    Nb_Pulses=0;        // nombre de tour de pedales
    Nb_Kms=0.0;
    Nb_TdP=0;
    UART1_Write_CText(" Armement Interrupts RB0\r\n");
   
   c1=RCREG1;
   Raz_Buffer1();
    INTCON2.RBPU=0;
   INTCON2.INTEDG0=1;// rising edge RB0
   INT0IE_bit=1;
   IPEN_bit=1;
   IPR2=0;
   PEIE_bit=1;
   GIE_bit=1;
 //  Raz_Buffer2();
  Init_Timer1(20); // at 32MHz    20x50ms=1 sec
  UART1_Write_CText(" Init Timer1 à 20x50mS => boucle en 1 sec\r\n");
   Drapeaux.Stop=0;
    Refresh_display_date_Time();
    TimeStart=TimeNow;
    TimeLast=TimeNow ;
    Old_Nb_TdpM=0;
    Old_Nb_PulsesM=0;
    Old_Nb_Pulses=0;
     SpeedK=0.0;
   jx=0;
   // main Starting loop
   Display=2;
   Indice=0;
  do
  {  
    Refresh_display_date_Time();
    EcartTime=TimeNow-TimeStart;
    Display++;
    Affiche_Time(Display);
    if (Display>6)Display=1 ;
    Nb_Kms=(float)Nb_Pulses / Developpe_Roue_700;
    Nb_TdP=(float)Nb_Pulses/3.1;
  // par seconde
   // Delta_Pulses=Nb_Pulses-Old_Nb_Pulses;
  // // Old_Nb_Pulses=Nb_Pulses;
  //  Speed=(float)Delta_Pulses*1000/Developpe_Roue_700;
    LCD_Cmd(LCD_LINE2);
    sprintf(txt,"NbTdp% 7.0f % 3.2fKm",Nb_TdP,Nb_Kms);
    LCD_puts(txt);
    
    if (jx>59)   // =1 minute
    {   
      NbTdpPerMn =  Nb_TdP- Old_Nb_TdpM;
      Old_Nb_TdpM=  Nb_TdP ;
      LCD_Cmd(LCD_LINE3);
      sprintf(txt, "Pedalage= % 4.1f RPM",NbTdpPerMn);
      LCD_puts(txt);
      Delta_PulsesM= Nb_Pulses - Old_Nb_PulsesM;
      SpeedK=(float)Delta_PulsesM*0.13831258  ; // 100.0Kmh 723.0 pulses voir feuille calcul excel
      sprintf(txt,  "Vitesse=% 5.2f Km/H",SpeedK);
      Old_Nb_PulsesM= Nb_Pulses;
      LCD_Cmd(LCD_LINE4);
      LCD_puts(txt);
      Drapeaux.Started=1;
      // n'arreter que dans une minute pleine ! pour avoir la vitesse en KM/H
      if (Drapeaux.Stop==1)  Velo_Status=0;
      jx=0;
      
    }

    while(Flag_Timer1==0) ;  // calé sur 1 secondes
    Init_Timer1(20); // 20x50 ms= 1sec at 32MHz

      if (jx==0)
      {
  //     UART1_Write_CText(" Indice ; Nb_Pulses ; Nb_TdP ; Nb_Kms ; Speed ; NbTdpPerMn \r\n");
       UART1_Write_CText(" Indice ; Nb_TdP ; Nb_Kms ; Speed ; NbTdpPerMn \r\n");
       }
       if ((jx %2)==0)
       {
       txt=&TEXTE[0];
       strConstRamCpy(txt,"Velo;");
       WordToStrWithZeros(Indice,CRam1);
       strcat(txt,CRam1);
       strcat(txt,";") ;
       //LongWordToStr(Nb_Pulses,CRam1);
       //strcat(txt,CRam1);
       //strcat(txt,";");
       Float2Ascii (Nb_TdP, CRam1,1) ;
       strcat(txt,CRam1);strcat(txt,";");
       Float2Ascii (Nb_Kms, CRam1,2) ;
       strcat(txt,CRam1);strcat(txt,";");

      if (Drapeaux.Started==1)
       {  
         Float2Ascii (SpeedK, CRam1,2) ;
         strcat(txt,CRam1);
         strcat(txt,";");
         Float2Ascii (NbTdpPerMn, CRam1,1) ;
          strcat(txt,CRam1); strcat(txt,";");
        //LongWordToStrWithZeros(EcartTime,CRam1);
        // strcat(txt,CRam1); strcat(txt,";");
       } // if Drapeaux.Started==1
       
       strcat(txt,"\r");
       UART1_Write_Text(txt);
       }

    // ====  Cdes via terminal UART ===================
    if (Flag_Buffer1==1)
    {
     //  CRLF1();
     //  UART1_Write_Text(Buffer1);
     //  CRLF1();
      p1=Buffer1;
       // U;24;08;17;04;17;36#
      if((*(p1)=='U') && (*(p1+19)=='#'))
      {
       Buffer1[19]=32; Buffer1[20]=0;
       LCD_Msg_Status("ReMise a l'Heure RTC");
       MAJ_RTC();
        Drapeaux.Stop=1 ;
       p1=0;
      }
       p1=strstr(Buffer1,"STOP");
       if(p1>0)
       {
         Delay_100ms();
         UART1_Write_CText("STOP OK\r");
         Affiche_Time(3);
         Drapeaux.Stop=1 ;
         p1=0;
       }  //---------------------
       p1=strstr(Buffer1,"ABORT");
       if(p1>0)
       {
         Delay_100ms();
         UART1_Write_CText("OK  attente Reset\r");
         Erase_Line(3);
         LCD_Cmd(LCD_LINE3);
         sprintf(txt,"Recu Commande ABORT");
         LCD_puts(txt);
         Erase_Line(4) ;
         LCD_Cmd(LCD_LINE4);
         sprintf(txt,"...Attente RESET....");
         LCD_puts(txt);
        // programme bloqué ici !
        while(1);
       }  //---------------------
       p1=strstr(Buffer1,"ERASE");
       if(p1>0)
       { 
         Delay_100ms();
         if (NumPage>1)
         {
           UART1_Write_CText("\r\nERASE cde OK, Numpage was ");
           WordToStr(NumPage,CRam1);
           UART1_Write_Text(CRam1); UART1_Write(TAB);
           NumPage=NumPage-1;
           Save_NumPage_24FC1026_To_PIC_Eeprom(1) ;
           CRLF1();
         }
         else
          UART1_Write_CText("\r\nPlus d'enregistrement à effacer !\r\n");
        p1=0;
       } //---------------------
       p1=strstr(Buffer1,"HELP");
       if(p1>0)
       {
        UART1_Write_CText("\r\n HELP :\r\n");
        UART1_Write_CText(" ..... 5 Tours de pedale= START r\n");
        UART1_Write_CText(" STOP  ..fin et sauvegarde parcours \r\n");
        UART1_Write_CText(" ABORT  ..Arret d'urgence et fin\r\n");
        UART1_Write_CText(" RELECT ..Liste le contenu 24FC1026\r\n");
        UART1_Write_CText(" ERASE ..Decr. Index 24FC,annule dernier parcours\r\n");
        UART1_Write_CText(" U;24;08;17;04;17;36#  Update RTC\r\n");
        UART1_Write_CText(" RESTART ..Apres fin de parcours, relance programme\r\n");
        CRLF1();
        p1=0;
       }
       Raz_Buffer1();
     } // si reception UART1  et Flag_Buffer1 ==1
     jx++;
     Indice++;
  }
  while ((Velo_Status==1)&& (Drapeaux.Stop==0) && (BP_Stop==1) );

   Refresh_display_date_Time();
   INT0IE_bit = 0 ;
   GIE_bit=0;  // stop toutes les interrupt
   Affiche_Time(2);
   LCD_Msg_Status("STOP Compteur       ");
   TimeStop=TimeNow;
   EcartTime=TimeStop-TimeStart;
   Speed= Nb_Kms *3600.0 /((float) EcartTime );        // Metre/sec div 3,6 -> Km/heure
   Float2Ascii (Speed, txt,2) ;
   LCD_Cmd(LCD_LINE2);
   sprintf(txt, "Nb TdP =% 6.0f      ",Nb_TdP);
   LCD_puts(txt);
   LCD_Cmd(LCD_LINE3);
   sprintf(txt,"Vitesse moy.= %3.2f ",Speed);
   LCD_puts(txt);
   LCD_Cmd(LCD_LINE4);
   sprintf(txt,"Nb Kms : = % 5.2f",Nb_Kms);
   LCD_puts(txt);
   sprintf(txt,"Start=%8lu sec;",TimeStart);  
   UART1_Write_Text(txt);
   sprintf(txt,"Stop=%8lu sec;",TimeStop);
   UART1_Write_Text(txt);
   sprintf(txt,"Ecart=%8lu sec;Vitesse= %5.2f;",EcartTime,Speed);
   UART1_Write_Text(txt);CRLF1();
   
   
   //xxxxxxxxxxx;   date et heure deja initialisé en debut d epage eeprom
   //02/02;14:26;TTdP=   252;Kms= 1.80;Vmoy= 40.29  00:02:41;Cumul= 10.8
   sprintf(txt,"TTdP=% 6.0f;Kms=% 5.2f;Vmoy=% 5.2f;Duree=",Nb_TdP,Nb_Kms,Speed);
   l=strlen(txt);
   // heures
   l=EcartTime/3600;
   *(CRam1)=l/10 +48;
   *(CRam1+1)=l%10 +48;
   *(CRam1+2)=':' ;
   // minutes
   j=EcartTime-(l*3600);
   j=j/60;
   *(CRam1+3)= j/10 +48;
   *(CRam1+4)= j%10 +48;
   *(CRam1+5)=':' ;
   k=EcartTime-l*3600-j*60;
   *(CRam1+6)=k/10 +48;
   *(CRam1+7)=k%10 +48;
   *(CRam1+8)=';';
   *(CRam1+9)=0;
   strcat(txt,CRam1);
   Cumul_Kms=Cumul_Kms+ Nb_Kms;
   sprintf(CRam1,"Cumul=% 5.1f\r\n",Cumul_Kms);
   UART1_Write_Text(txt);
   strcat(txt,CRam1);
    // +12  voir Save_Date_Time_To_24FC1026(void)
   strcpy(Page_Eeprom+12,txt);
   UART1_Write_CText("\r\nSave to 24FC1026 \r\n");
   Delay_1sec();
   Delay_ms(2000);
   strConstRamCpy(txt,"24FC1026;");
   strcat(txt,Page_Eeprom);
   //UART1_Write_Text(Page_Eeprom);
   UART1_Write_Text(txt);
   k= strlen(Page_Eeprom);
   Write_Page_To_24FC1026(NumPage) ;
   sprintf(txt,"Ecriture de k=% 5d bytes -> NumPage= %03d  24FC1026\r\n",k,NumPage);
   UART1_Write_Text(txt);
  
  // PIC EEPROM
   // next numpage
   NumPage=NumPage+1;
   Save_NumPage_24FC1026_To_PIC_Eeprom(1) ;
   //EEPROM du PIC , en 0x03FA,B,C,D
   Save_Cumul_Kms_To_PIC_Eeprom(1) ;
   CRLF1();

   GIE_bit=1;
  // main running loop
  do
  {  
    Raz_Buffer1();
    Delay_ms(1000);
    // from Terminal link
    if (Flag_Buffer1==1)
    {
      // pour debugging 
      //CRLF1();
      //UART1_Write_Text(Buffer1);
      //CRLF1();
      p1=strstr(Buffer1,"RELECT");
     if(p1>0)
     {
        UART1_Write_CText("\r\nRelecture 24FC1026 :");CRLF1();
        for (i=0;i<NumPage;i++)
        {   k=i;
            Read_NumPage_From_24FC1026(k);
            UART1_Write_Text(Page_Eeprom);
        }
        CRLF1();
      //Affiche_Page_Eeprom();
      }
     p1=strstr(Buffer1,"RESTART");
     if(p1>0)
     {
        UART1_Write_CText("\r\nRESTART : ReDemarrage, nouveau parcours\r\n");
        Delay_ms(5000);
        _asm goto 0;
      }
      p1=Buffer1;
         // U;24;08;17;04;17;36#
      if((*(p1)=='U') && (*(p1+19)=='#'))
      {
       Buffer1[19]=32; Buffer1[20]=0;
       LCD_Msg_Status("ReMise a l'Heure RTC");
       MAJ_RTC();
      }

    } 
      // ---- from BlueTooth Link -------
    /*
     if (Flag_Buffer2==1)
     {
       p2=Buffer2;
          // U;24;08;17;04;17;36#
      if((*(p2)=='U') && (*(p2+19)=='#'))
      {
       Buffer2[19]=32; Buffer2[20]=0;
       LCD_Msg_Status("ReMise a l'Heure RTC");
       MAJ_RTC();
        Raz_Buffer2();
      }
      p2=strstr(Buffer2,"RESTART");
      if(p2>0)
      { Delay_100ms();
        UART2_Write_CText("OK\r");
         Delay_100ms();
       _asm goto 0;
      }
      Raz_Buffer2();
     }
     */
  }
  while(1);
 }


 /*

 Mikroc pro 7.30 Beta
 18F26K22 DS3231 24FC1026 UART1 HC06
 Source : _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
 calcul kms en flottant

 Presentation :
 Appli. Velo App artement
 464 pulses/Km  199Kms Maxi
 Init I2C 400K
 Test presence du LCD (PCF8754) :  Device at adresse :  78 found OK
 Test IT Timer1 delay=2sec
 Test presence RTC DS3231
 Device at adresse : 208 found OK
 Re-Lecture RTC DS3231
 NumPage 24FC1026 recupérée de L'EEPROM du PIC en 0x03FE et 0x3FF=     2
 Last Cumul Kms recupérée de L'EEPROM du PIC en 0x03FA..0x03FD=   0.9
 Commencer à pedaler ..
 BP_Stop=1
 Comptage Nb tour de pedale  J =    0
 Comptage Nb tour de pedale  J =    1
 Comptage Nb tour de pedale  J =    2
 Comptage Nb tour de pedale  J =    3
 Comptage Nb tour de pedale  J =    4
 Comptage Nb tour de pedale  J =    5

 Stockage horodatage
 DateTime=  24/02;17:59;   next Idx Page_Eeprom =    12
 Armement Interrupts RB0
 Init Timer1 à 20x50mS => boucle en 1 sec
 Indice ; Nb_TdP ; Nb_Kms ; Speed ; NbTdpPerMn
Velo;00000;0.3;0.00;
Velo;00002;3.2;0.02;
Velo;00004;6.5;0.05;
...
elo;00054;85.2;0.61;
Velo;00056;88.4;0.63;
Velo;00058;91.6;0.65;
 Indice ; Nb_TdP ; Nb_Kms ; Speed ; NbTdpPerMn
Velo;00060;94.8;0.68;40.66;94.8;
Velo;00062;97.7;0.70;40.66;94.8;
Velo;00064;101.0;0.72;40.66;94.8;
Velo;00066;104.2;0.74;40.66;94.8;


Velo;00066;104.2;0.74;40.66;94.8;
Velo;00068;107.4;0.77;40.66;94.8;

U;24;02;19;00;17;56
 Index1 =    20

Ecriture dans DS3231... OK
Start=   64482 sec;Stop=   64560 sec;Ecart=      78 sec;Vitesse=  2.13;
TTdP=     6;Kms= 0.05;Vmoy= 2.13;Duree=00:01:18;
Save to 24FC1026
24FC1026;24/02;17:54;TTdP=     6;Kms= 0.05;Vmoy= 2.13;Duree=00:01:18;Cumul=  0.0
Ecriture de k=   73 bytes -> NumPage= 000  24FC1026
 Sauve Numpage 001 dans EEPROM du PIC , at 0x03FE =MSB et 0x03FF=LSB
 Sauve Cumul_Kms   0.0 -> EEPROM du PIC , en 0x03FA,B,C,D


RESTART : ReDemarrage, nouveau parcours

 Mikroc pro 7.30 Beta
 18F26K22 DS3231 24FC1026 UART1 HC06
 Source : _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
 calcul kms en flottant
  ...

 

_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_Sprintl.mcl" "
_Lib_ADC_K22_B.mcl" "
_Lib_EEPROM_1024.mcl" "
_Lib_I2C_c34b12.mcl" "
_Lib_UART_c67b67.mcl"


0 1 mikroCPIC1618.exe -MSF -DBG -pP18F26K22 -C -DL -O11111114 -fo32 -EH"^C
C:\_MikroC\_MesProjets_MikroC\_18F26K22_Velo_2019\18F26k22_Velo_2017_EEPROM.ihex" -N"^C
C:\_MikroC\_MesProjets_MikroC\_18F26K22_Velo_2019\18F26K22_Velo_2019.mcppi" -SP"^C
C:\_MikroC\mikroC PRO for PIC\Defs\" -SP"^C
C:\_MikroC\mikroC PRO for PIC\uses\P18\" -SP"^C
C:\_MikroC\_MesProjets_MikroC\_18F26K22_Velo_2019\" -SP"^C
C:\_MikroC\mikroC PRO for PIC\Include\" -SP"^C
C:\_MikroC\mikroC PRO for PIC\" -IP"^C
C:\_MikroC\mikroC PRO for PIC\uses\P18\" -IP"^C
C:\_MikroC\_MesProjets_MikroC\_18F26K22_Velo_2019\" -IP"^C
C:\_MikroC\_MesProjets_MikroC\common\" "Tiny_RTC_DS3231_Velo_2019.c" "_18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c" "LCD_4x20_I2C_Velo_2019.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_Sprintl.mcl" "
_Lib_ADC_K22_B.mcl" "
_Lib_EEPROM_1024.mcl" "
_Lib_I2C_c34b12.mcl" "
_Lib_UART_c67b67.mcl"
0 1139 Available RAM: 3875 [bytes], Available ROM: 65536 [bytes]
0 122 Compilation Started tiny_rtc_ds3231_velo_2019.h
14 1504 Initialization of extern object 'time' tiny_rtc_ds3231_velo_2019.h
15 1504 Initialization of extern object 'date' tiny_rtc_ds3231_velo_2019.h
30 1504 Initialization of extern object 'Jour0' tiny_rtc_ds3231_velo_2019.h
31 1504 Initialization of extern object 'Jour1' tiny_rtc_ds3231_velo_2019.h
32 1504 Initialization of extern object 'Jour2' tiny_rtc_ds3231_velo_2019.h
33 1504 Initialization of extern object 'Jour3' tiny_rtc_ds3231_velo_2019.h
34 1504 Initialization of extern object 'Jour4' tiny_rtc_ds3231_velo_2019.h
35 1504 Initialization of extern object 'Jour5' tiny_rtc_ds3231_velo_2019.h
36 1504 Initialization of extern object 'Jour6' tiny_rtc_ds3231_velo_2019.h
37 1504 Initialization of extern object 'JourSemaine' tiny_rtc_ds3231_velo_2019.h
128 123 Compiled Successfully Tiny_RTC_DS3231_Velo_2019.c
0 122 Compilation Started _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
26 1504 Initialization of extern object 'mesg0' lcd_4x20_i2c_1902.h
14 1504 Initialization of extern object 'time' tiny_rtc_ds3231.h
15 1504 Initialization of extern object 'date' tiny_rtc_ds3231.h
30 1504 Initialization of extern object 'Jour0' tiny_rtc_ds3231.h
31 1504 Initialization of extern object 'Jour1' tiny_rtc_ds3231.h
32 1504 Initialization of extern object 'Jour2' tiny_rtc_ds3231.h
33 1504 Initialization of extern object 'Jour3' tiny_rtc_ds3231.h
34 1504 Initialization of extern object 'Jour4' tiny_rtc_ds3231.h
35 1504 Initialization of extern object 'Jour5' tiny_rtc_ds3231.h
36 1504 Initialization of extern object 'Jour6' tiny_rtc_ds3231.h
37 1504 Initialization of extern object 'JourSemaine' tiny_rtc_ds3231.h
0 1004 interrupt handler (Interrupt_High at 0x0008) _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
978 1163 Variable 'k' has been declared, but not used _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
1848 123 Compiled Successfully _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
881 1164 Variable 'AdreH' has been eliminated by optimizer _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
881 1164 Variable 'AdreL' has been eliminated by optimizer _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
913 1164 Variable 'cx' has been eliminated by optimizer _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
930 1164 Variable 'cx' has been eliminated by optimizer _18F26K22_Velo_LCD4x20_I2C_24FC1026_uses_float_190224.c
0 122 Compilation Started LCD_4x20_I2C_Velo_2019.c
26 1504 Initialization of extern object 'mesg0' lcd_4x20_i2c_velo_2019.h
238 123 Compiled Successfully LCD_4x20_I2C_Velo_2019.c
0 127 All files Compiled in 343 ms
0 1144 Used RAM (bytes): 908 (23%)  Free RAM (bytes): 2967 (77%) Used RAM (bytes): 908 (23%)  Free RAM (bytes): 2967 (77%)
0 1144 Used ROM (bytes): 33646 (51%)  Free ROM (bytes): 31890 (49%) Used ROM (bytes): 33646 (51%)  Free ROM (bytes): 31890 (49%)
0 125 Project Linked Successfully 18F26K22_Velo_2019.mcppi
0 128 Linked in 172 ms
0 129 Project '18F26K22_Velo_2019.mcppi' completed: 547 ms
0 103 Finished successfully: 24 févr. 2019, 11:34:07 18F26K22_Velo_2019.mcppi

*/