Hallgivaren är inte kopplad utan jag sätter porten RC2 hög med en sladdstump för att testa programmet.
Jag har fått programmet att fungera så långt att det skriver den fasta texten till displayen. Vad jag inte fått till är utskrift av rpm från själva avbrottsrutinen.
Jag har följt instruktionerna i Microchip Tips ‘n Tricks Tips #2 Men jag kan inte se att det blir avbrott när jag sätter porten CCP1 (pin RC2) hög.
Programmet ser ut som följer. (Framåt resp Bakåt är inte implementerat.) och varvtalet är inte uträknat. Har satt ett fast rpm för att se om avbrott uppkommer men inget rpm skrivs ut när jag sätter porten hög.
Kod: Markera allt
/****************************************
* 	LCD mainroutine Ver 1.0				*				
*	LCD interface to PIC16F877A			*
*	lcd.c Ver 1.0 is included			*
*	lcd.h is included					*
****************************************/
#include <htc.h>
#include "lcd.h"
#define _XTAL_FREQ 4000000
#define	DelayS(T){unsigned char i;for (i=0; i<T*10; i++)__delay_ms(100);}
//*********** variabler avbrottsrutinen ******************
	unsigned int  	pulse_start;
	unsigned int  	pulse_old;
	unsigned int  	pulse_diff; 
//*********** variabler varvtal ******************	
	int thousands = 0;
	int hundreds = 0;
	int tens = 0;
	int ones = 0;	
	int direction = 1;	
	int	rpm = 0;
void put_rpm(){
	while (rpm >= 1000) {
 	thousands++;
  	rpm -= 1000;
	}
	while (rpm >= 100) {
 	 hundreds++;
  	rpm -= 100;
	}
	while (rpm >= 10) {
 	tens++;
  	rpm -= 10;
	}
	while (rpm >= 1) {
  	ones++;
  	rpm -= 1;
	}
	lcd_putch('0' + thousands);
	lcd_putch('0' + hundreds);
	lcd_putch('0' + tens);
	lcd_putch('0' + ones);
}
void main()
{
//**************** initiera registren *********************	
	TRISC		= 	0b11111111;	1;	// All input
  	CMCON       = 	0b00000111; 	// No comparator inputs
  	CCP1CON     =  	0b00000101; 	// Set CCP1 to capture all rising edges 
  	CCP1IE      =  	1; 	 			// Enable CCP1 interrupts
  	TMR1IF      =  	0; 				// TMR1 not overflowed
  	GIE       	=  	1; 				// Allow global interrupts
  	T1CON       =  	0b00001111; 	// Ställ in för rätt frekvens
//**************** initiera lcd *********************	
	lcd_init();
	lcd_goto(0);	// select first line
	lcd_puts("STYRBORD MASKIN");
	lcd_goto(0x40);	// Select second line 	
	if (direction==0)	
	lcd_puts(" RPM FRAMÅT");	
	if (direction==1)
	lcd_puts(" RPM BAKÅT");
		
	for(;;){	
	}	
}
// avbrottsrutin som tar in pulser till rpm (pinne RC2)
void interrupt isr(void)
{
        pulse_start = TMR1; // the value in CCPR1L and CCPR1H     
       pulse_diff = pulse_start - pulse_old; // Calculate the difference
       pulse_old = pulse_start; // Save for next time	
	TMR1IF = 0; // reset owerflow 
	rpm = 1050; // eg.pulse_diff * lämplig konstant. Men satt värde 1050 bara för test;
	put_rpm(); 
   
} 
				



