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();
}