#include <built_in.h>
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB6_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// Lcd pinout settings
sbit OUT at RA2_bit;
// Pin direction
sbit OUT_Direction at TRISA2_bit;
#define NMeasure 4
#define const2 4
#define kappa 1440 //360* 4 usec
#define const1 250
//dichiarazioni globali:
unsigned char tnum6[6],tnum7[5],tnum8[5];
unsigned long Ngiri=0;
bit ready; // bit variable
unsigned char edge=0,measure=0;
unsigned long MaxPulse=0,LastMaxPulse=0;
unsigned long LoadPr2,LoadPr=0;
unsigned int alfa=0;
unsigned char INC=0;
void interrupt() {
if (INTCON.TMR0IF) { //1 msec
INTCON.TMR0IF = 0;
TMR0 =6;
}
if(INTCON.INTF){ //Su RB0
if(LoadPr>const1){
PR2=const1;
INC=(LoadPr/const1);
}else{
PR2=LoadPr/const2;
INC=0;
}
T2CON.TMR2ON=1;
PIE1.TMR2IE=1;
++edge;
if(edge==1){
TMR1H=0;
TMR1L=0;
T1CON.TMR1ON=1;
}
if(edge==2){
T1CON.TMR1ON=0;
MaxPulse=TMR1H*256+ TMR1L;
LoadPr= ((MaxPulse/kappa)*alfa) ;//Carica PR2 in funzione di alfa per il ritardo dell'impulso
TMR1H=0;
TMR1L=0;
edge=0;
ready=1;
}
INTCON.INTF=0;
}
if(PIR1.TMR1IF){
PIR1.TMR1IF=0;
}
if(PIR1.TMR2IF){
if(OUT==1){
T2CON.TMR2ON=0;
OUT=0;
PIE1.TMR2IE=0;
}
else if(OUT==0){
if(INC>0){
if(--INC==0){
OUT=1;
}
} else{
OUT=1;
}
}
PIR1.TMR2IF=0;
}
}
void main() {
int i=0;
CMCON=0b00000111;
PORTB=0b00000000;
PORTA=0b00000000;
TRISB=0b00000001;
TRISA=0b00000000;
///Abilito LCD
Lcd_Init();
Lcd_Cmd (_LCD_CURSOR_OFF);
Lcd_Cmd (_LCD_CLEAR);
INTCON.PEIE=1;
INTCON.GIE=1;
INTCON.T0IE=1;
INTCON.INTE=1;
OPTION_REG=0b01000011; //4 usec
TMR0 =6;
T1CON.TMR1IE=0;
T1CON.TMR1ON=0;
T1CON.T1CKPS0=0;//1:4
T1CON.T1CKPS1=1;
ready=0;
T2CON=0b00000010; // 16MHz/4 1:16 --> 250KHz -->4usec
T2CON.TMR2ON=0;
alfa=270;
while(1){
if(ready){
ready=0;
LCD_Out(1,1,"RPM=");
Ngiri=(60*1000000)/MaxPulse ;
WordToStr(Ngiri, tnum6);
LCD_Out(1,5,tnum6); //visualizza Numero giri al minuto
IntToStr(alfa, tnum7);
LCD_Out(2,1,"AN=");
LCD_Out(2,4,tnum7);
LCD_chr(2,10,223);
LCD_Out(2,12,"Rit");
}
}
}