Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

PIC18F4520, PORTB change interrupt is not Working

Status
Not open for further replies.

ismbn

Full Member level 3
Joined
Feb 11, 2012
Messages
160
Helped
4
Reputation
8
Reaction score
4
Trophy points
1,308
Location
Mumbai. india
Activity points
2,444
Hello.

I am Working in The Project which uses ultrasonic sensor for Height Measurement, The Module of Ultrasonic is shown in Pic Modle HC-SR 04**broken link removed**. for This we have to give the trigger of 10uS at trigger pin, and the The as per the distance the Echo pic give the level pulse. and there is an equation using the the distance i being Measured...

as per some tutorial i have connected it to the PORTB4 that is "Change on Interrupt" pin... The Thing is i am configuring it correctly (I suppose) but the Interrupt is Not Getting Fired.

I am attaching the code Please Look into it and correct me....

Please Give Reply the Deadline is already over... Please help me


Using
MPLAB 8
PIC18F4520
xc8 Compiler
Pickit 3


Code:
#define _XTAL_FREQ 8000000
#include <stdio.h>
#include <string.h>
#include <p18F4520.h>
#include "pic_lcd.h"

#define Trigger 	PORTCbits.RC0
#define Power 		PORTBbits.RB0
#define Echo 		PORTBbits.RB4

// interrupt handling variables
char m10sec;
char timerL, timerH;
// interrupt handling variables

//data types convert 
char data_buff[16];
float Height_val;
//data types convert

// Display Related Variables
char disp_ram[2][16];

// Display Related Variables

char sensor_flag = 0;
bit read_flag = 0;
/// Function Prototypes
void Refresh_lcd();
void fill_ram(char y, char x, char str[16]);
void Trigger_Sensor();
/// Function Prototypes


void interrupt Interrupt(void)
{
if ( INTCONbits.TMR0IF == 1 )
	{
		INTCONbits.TMR0IF = 0;
		TMR0H = 0xF8;
		TMR0L = 0x20 ;
		m10sec ++;
		if(m10sec >=10){
		Refresh_lcd();
		m10sec = 0;
		}
		INTCONbits.GIE = 1;
	}
	if(INTCONbits.INT0IF == 1){
		Trigger_Sensor();
		INTCONbits.INT0IF = 0;
	}
if(RBIF == 1)
{
char temp1, temp2;
	temp1 = PORTBbits.RB4;
	RBIF  = 0;
	if(Echo == 1){
		TMR1ON = 1;
	}
	if(Echo == 0){
		TMR1ON = 0;
		timerH = TMR1H;
		timerL = TMR1L;
		TMR1H = 0;
		TMR1H = 0;
		read_flag = 1;
	}
}
		INTCONbits.GIE = 1;
		INTCONbits.PEIE = 1;

} 
void timer0_init()
{
T0CON = 0x08;
TMR0H = 0xF8;
TMR0L = 0x20;
INTCON = 0x04;
INTCONbits.TMR0IE = 1;
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
T0CONbits.TMR0ON = 1;
}

void ftoa(float i)
{	

	sprintf(data_buff,"Height = %.2f",i);
//	return(data_buff);
}
void change_int_init(){
	T1CON = 0x10;
	TMR1H = 0x00;
	TMR1L = 0x00;
	T1CONbits.TMR1ON = 0;
	INTCONbits.RBIE = 1;                           //Enable PORTB On-Change Interrupt

}
void Trigger_Sensor(){
Trigger = 1;
__delay_us(10);
Trigger = 0;
}
void Refresh_lcd(){
	lcd_goto(1,0);
	for(char i = 0; i < 2; i++){
		for(char j = 0; j< 16; j++){
			lcd_putch(disp_ram[i][j]);
		}
	lcd_goto(2,0);
	}
}
void my_ftoa(float i)
{	
	int num,dec;
	//char b[10];
	num=i;
	dec=(i-num)*100;
	sprintf(data_buff,"Height = %d.%d",num,dec);
}

void find_Height(){
	Height_val  = (timerL | (timerH <<8 ))/58.82;
	timerL = 0;
	timerH = 0;
	my_ftoa(Height_val);
}
void main()
{
TRISD = 0x00;
TRISB = 0xF0;
TRISC = 0xFF;
PORTC = 0xFF;
//TRISD = 0x00;
PORTD = 0x00;
PORTD = 0x00;
timer0_init();
change_int_init();
lcd_init();
INTCON = 0xF8;
__delay_ms(10);
lcd_goto(1,1);
lcd_putch('A');
fill_ram(0,3,"Indent");

while(1)
{
/*
	if(Power == 1 && sensor_flag == 0){
		__delay_ms(10);
		if(Power == 1){
			Trigger_Sensor();
			sensor_flag = 1;
		}
	}
*/
	if((sensor_flag == 1) && read_flag == 1){
		find_Height();
	}
//	if(sensor_flag == 1)

}
}
void fill_ram(char y, char x, char str[16]){
	char len;
	len = strlen(str);
	char i =0, j = 0;
	for(i =0; i < x && i<16; i++){
		disp_ram[y][i]  = ' ';
	}
	for(i = x,j =0; i < len+x && i < 16; i++){
		disp_ram[y][i] = str[j++];
	}
	if(i < 15 )
	for(i = len+x; i < 16; i++){
		disp_ram[y][i] = ' ';
	}
}

20130108065629!HC-SR04.jpg

Thank you...
 
Last edited:

hello

Code:
if(INTCONbits.INT0IF == 1){
		Trigger_Sensor();
		INTCONbits.INT0IF = 0;
	}

in your interrupt treatment,
you have RB0 interrupt wich do "Trigger_Sensor();"
is pin RB0 used ?
if not , remove it..

remove also
Code:
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;

variable
Code:
temp1 = PORTBbits.RB4;
must be external of interrupt and declared as volatile
Code:
volatile char temp1;
 

thank you for the reply... i going to try this... hope this Works....
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top