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
*/