|
|
View previous topic :: View next topic |
Author |
Message |
HGHK
Joined: 29 Jun 2010 Posts: 33
|
I have problem to use Interrupt RB pin4-7c in PIC16LF876 |
Posted: Sat Dec 25, 2010 3:32 am |
|
|
I need use PORT B Change Interrupt (pins RB7:RB4), moreover External Interrupt (pin B0) in a PIC16LF876 to active my device from sleep.
This interrupt doesn't work carefully and when I make a pulse in pin B5 no action where down. Please help me ASAP!
My program is :TERMOCUNTERPIC16LF876.c:
Code: |
#include "C:\Documents and Settings\HGhK\Desktop\CRP\temp project\TERMOCUNTERPIC16LF876.h"
#int_RB
void RB_isr(void)
{
PKC++;
if((Command!=Press_Key_First)||(Command!=Press_Key_Second)||(Command!=Press_Key_Third)){Pervius_Command=Command;}
switch (PKC){
case 1: Command=Press_Key_First;PK1=1;PK2=0;PK3=0;break;
case 2: command=Press_Key_Second;PK1=0;PK2=1;PK3=0;break;
default: command=Press_Key_Third;PK1=0;PK2=0;PK3=1;PKC=0;break;
}
OFC=0;
set_timer0(0);
enable_interrupts(INT_TIMER0);}
#int_EXT
void EXT_isr(void)
{
ExINT=1;
Pervius_Command=Command;
Command=Routine_Temperature_Sampling;
}
#int_TIMER0
void TIMER0_isr(void)
{
OFC++;
if (OFC==0xFFFE){OFC=0x0000;}
clear_interrupt(INT_TIMER0);}
#int_RDA
void RDA_isr(void)
{
RC=0;RXin=0;
RXin=getch();
if (CC){
Pervius_Command=Command;
Command=RXin;}
else if (RXin==Are_You_ready){Pervius_Command=Command;Command=Controller_Connected;CC=1;}
OFC=0;
set_timer0(0);
}
void main()
{
output_high(LED1);
output_high(LED2);
if (!Cal_A) {Cal_A = 165;}
if (!Cal_B) {Cal_B = 328;}
if (!Cal_C) {Cal_C = 20;}
if (!Cal_D) {Cal_D = -40;}
if (!Temp_Down_Limit) {Temp_Down_Limit=Temperature_Low_Limit_Defult;}
if (!Temp_Up_Limit) {Temp_Up_Limit=Temperature_Up_Limit_Defult;}
if (!Sleep_Priod_Division_Reg) {Sleep_Priod_Division_Reg=Time_Period_Defult_Division;}
setup_adc_ports(AN0);set_adc_channel(0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
enable_interrupts(INT_RB);
disable_interrupts(INT_TIMER0);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);ext_int_edge(H_TO_L);
port_b_pullups(1);
disable_interrupts(GLOBAL);
PCF8563_init();
while(1){
enable_interrupts(GLOBAL);
switch (Command) {
case 0x11: // Routine Temperature Sampling
disable_interrupts(GLOBAL);
Err=0;
PCF8563_Clear_Alarm_Flag();
Temperature_Exam = Temperature();
if ((Temperature_Exam>Temp_Down_Limit)&&(Temp_Up_Limit>Temperature_Exam)) {TSC = TSC+1;}
PCF8563_Read_SMH();
ALARM_MINS_REG = MINUTES_REG + 60/Sleep_Priod_Division_Reg;
if (ALARM_MINS_REG > 59) {ALARM_MINS_REG -= 60 ;};
PCF8563_Set_Alarm();
Reset_Command();
clear_interrupt(INT_EXT);ExINT=0;
enable_interrupts(GLOBAL);
break;
case 0x12: // Report Temperature Sampling counter
disable_interrupts(INT_RDA);
clear_interrupt(INT_RDA);
Err=0;
Temperature_Exam = Temperature();
ReportTSC(Temperature_Exam);
Reset_Command();
enable_interrupts(INT_RDA);
break;
case 0x14: // Reset Temperature Sampling counter Set Sleep Priode
putc(I_am_ready);
disable_interrupts(INT_RDA);
If (kbhit()) {RXin=getch();
if (RXin<60) {Sleep_Priod_Division_Reg=RXin;TSC=0;}
Reset_Command();
enable_interrupts(INT_RDA);
}
break;
case 0x18: // Report Temprature Limits
Reset_Command();
break;
case 0x21: // Set Temperature Limits
Reset_Command();
break;
case 0x22: // Report Temprature
Reset_Command();
break;
case 0x24: // Press_Key_First
Err=0;
if (OFC>2){clear_interrupt(INT_RB);}
Temperature_Exam = Temperature();
putLCD(Temperature_Exam,1);
if (OFC>120){Reset_Command();putLCD(0,0);}
break;
case 0x28: // Press_Key_Second
Err=0;
if (OFC>2){clear_interrupt(INT_RB);}
Calculation=TSC*Sleep_Priod_Division_Reg/60;
putLCD(Calculation,1);
if (OFC>120){Reset_Command();putLCD(0,0);}
break;
case 0x41: // Press_Key_Third
Err=0;
if (OFC>2){clear_interrupt(INT_RB);}
putLCD(0,0);
PKC=0;PK1=0;
PK2=0;PK3=0;
disable_interrupts(INT_TIMER0);
Reset_Command();
break;
case 0x42: // Batry_Voltage_Sampling
Err=0;
disable_interrupts(INT_RB);
enable_interrupts(INT_TIMER0);
if (!BVS ){OFC=0;BVS=1;}
if (OFC>8){Reset_Command();enable_interrupts(INT_RB);disable_interrupts(INT_TIMER0);}
break;
case 0x44: // Calibration_Setting
Reset_Command();
break;
case 0x48: // Report_Time_And_Date
Reset_Command();
break;
case 0x81: // Set_Time_And_Date
Reset_Command();
break;
case 0x82: // Controller_Connected
Err=0;
if ((CC)&&(!(input_state(ES)))){Command=0x82;}
if ((CC)&&(input_state(ES))&&(BVS )){Command=0x42;}
enable_interrupts(INT_TIMER0);
disable_interrupts(INT_RDA);
clear_interrupt(INT_RDA);
if (OFC>8) { putc(Are_You_ready);
OFC=0;
delay_ms(10);
If (kbhit()) {RXin=getch();if (RXin == I_am_ready){CC=1;}else{CC=0;Reset_Command();}}
}
break;
case 0x84: // Ricived_From_Controller
Reset_Command();
break;
case 0x88: // Controller_Disconnected
Err=0;
CC=0;
Reset_Command();
break;
}
If (Command == None_Command){
if ((Pervius_Command)&&(!Err)) {Command=Pervius_Command;Err=1;}
else {
PCF8563_Read_SMH();
if ( MINUTES_REG > ALARM_MINS_REG ){
if (!(((ALARM_MINS_REG+60)> MINUTES_REG)&&(MINUTES_REG > (ALARM_MINS_REG + 60 - (60/Sleep_Priod_Division_Reg)))))
{
ALARM_MINS_REG = MINUTES_REG + ( 60 / Sleep_Priod_Division_Reg);
if (ALARM_MINS_REG > 59) {ALARM_MINS_REG-=60;}
PCF8563_Set_Alarm();
PCF8563_Clear_Alarm_Flag();
} }
Reset_Command();
clear_interrupt(INT_EXT);
clear_interrupt(INT_RB);
clear_interrupt(INT_RTCC);
clear_interrupt(INT_RDA);
clear_interrupt(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
if (!Command) {sleep();}
}
}
}}
|
And its header is :TERMOCUNTERPIC16LF876.h :
Code: |
#include <16F876.h>
#device ICD=TRUE
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES DEBUG //Debug mode for use with ICD
#use delay(clock=2000000)
#define SDN PIN_A1
#define DIG1 PIN_A2
#define DATA3 PIN_A3
#define LED1 PIN_A4
#define LED2 PIN_A5
#define EINT PIN_B0
#define DIG3 PIN_B1
#define DIG4 PIN_B2
#define DE PIN_B3
#define ES PIN_B5
#define PGC PIN_B6
#define PGD PIN_B7
#define DATA2 PIN_C0
#define DATA1 PIN_C1
#define DATA0 PIN_C2
#define DIG2 PIN_C5
#define TX PIN_C6
#define RX PIN_C7
#use rs232(baud=4464,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)
#define Time_Period_Defult_Division 2
#define Temperature_Up_Limit_Defult 5
#define Temperature_Low_Limit_Defult 0
// command set definition
#define None_Command 0x00
#define Routine_Temperature_Sampling 0x11
#define Report_TSC 0x12 // TSC : Temprature Sampling Counter
#define Reset_TSC_Set_Sleep_Priode 0x14
#define Report_Temprature_Limits 0x18
#define Set_Temperature_Limits 0x21
#define Report_Temprature 0x22
#define Press_Key_First 0x24
#define Press_Key_Second 0x28
#define Press_Key_Third 0x41
#define Batry_Voltage_Sampling 0x42
#define Calibration_Setting 0x44
#define Report_Time_And_Date 0x48
#define Set_Time_And_Date 0x81
#define Controller_Connected 0x82
#define Ricived_From_Controller 0x83
#define Controller_Disconnected 0x88
void DataEE_Read(int32 addr, int8 * ram, int bytes) {
int i;
for(i=0;i<=bytes;i++,ram++,addr++)
*ram=read_eeprom(addr);
}
void DataEE_Write(int32 addr, int8 * ram, int bytes) {
int i;
for(i=0;i<=bytes;i++,ram++,addr++)
write_eeprom(addr,*ram);
}
addressmod (eepromdata,DataEE_read,DataEE_write,0x00,0xff); // would define a region called DataEE between 0x5 and 0xff in the chip data EEprom.
signed int8 eepromdata Temp_Up_Limit,Temp_Down_Limit;
signed int16 eepromdata Cal_A,Cal_B,Cal_C,Cal_D;
unsigned int8 eepromdata Sleep_Priod_Division_Reg;
unsigned int8 eepromdata EEPROM_Pervius_Command,EEPROM_Command;
unsigned int32 eepromdata TSC;
unsigned int32 Calculation;
unsigned int16 A2DC;
unsigned int8 Pervius_Command=None_Command,Command=None_Command,Condition;
unsigned int8 OFC; // 15sec counter
unsigned int8 PKC,RC; //press key counter , Rambler cOunter
unsigned int8 RXin,TXout;
signed int8 Temperature_Exam,Up,Down;
/*
************** CONDITION VARIABLE ***************
+-----+-----+-----+-----+-----+-----+-----+-----+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+
| Err | BVS | RXA |ExINT| PK3 | PK2 | PK1 | CC |
+-----+-----+-----+-----+-----+-----+-----+-----+
*/
#bit Err = Condition.7
#bit BVS = Condition.6 // Batry Voltage sampling Condition
#bit RXA = Condition.5
#bit ExINT= Condition.4
#bit PK3 = Condition.3
#bit PK2 = Condition.2
#bit PK1 = Condition.1
#bit CC = Condition.0 // Controller Connected
typedef struct
{
int8 seconds; // 0 to 59
int8 minutes; // 0 to 59
int8 hours; // 0 to 23 (24-hour time)
int8 day; // 1 to 31
int8 weekday; // 0 = Sunday, 1 = Monday, etc.
int8 month; // 1 to 12
int8 year; // 00 to 99
}date_time_t;
typedef struct
{
int8 minutes; // 0 to 59
int8 hours; // 0 to 23 (24-hour time)
int8 day; // 1 to 31
int8 weekday; // 0 = Sunday, 1 = Monday, etc.
}PCF8563_Alarm;
// -------------------------------------------------
#define Are_You_ready 0x3c
#define I_am_ready 0xc3
// -------------------------------------------------
#ifndef PCF8563_SDA
#define PCF8563_SDA PIN_C4
#define PCF8563_SCL PIN_C3
#endif
// #use i2c(master, sda=PCF8563_SDA, scl=PCF8563_SCL)
#ifndef PCF8563_WRITE_ADDRESS
#define PCF8563_WRITE_ADDRESS 0xA2
#define PCF8563_READ_ADDRESS 0xA3
#endif
// Register addresses
#define PCF8563_CTRL_STATUS_REG1 0x00
#define PCF8563_CTRL_STATUS_REG2 0x01
#define PCF8563_SECONDS_REG 0x02
#define PCF8563_MINUTES_REG 0x03
#define PCF8563_HOURS_REG 0x04
#define PCF8563_DAY_REG 0x05
#define PCF8563_WEEK_REG 0x06
#define PCF8563_MONTH_REG 0x07
#define PCF8563_YEAR_REG 0x08
#define PCF8563_ALARM_MINS_REG 0x09
#define PCF8563_ALARM_HOURS_REG 0x0A
#define PCF8563_ALARM_DAY_REG 0x0B
#define PCF8563_ALARM_WEEKDAY_REG 0x0C
#define PCF8563_CTRL_CLKOUT_REG 0x0D
#define PCF8563_CTRL_TIMER_REG 0x0E
#define PCF8563_TIMER_REG 0x0F
int8 CTRL_STATUS_REG1,CTRL_STATUS_REG2,LV_sec,MINUTES_REG;
int8 HOURS_REG,DAY_REG,WEEK_REG,C_Mon,YEAR_REG;
int8 CTRL_TIMER_REG,TIMER_REG,CTRL_CLKOUT_REG;
int8 ALARM_MINS_REG,ALARM_HOURS_REG;
#bit LowVoltage = LV_sec.7
#bit Century = C_Mon.7
#define bcd_min MINUTES_REG
#define bcd_hrs HOURS_REG
#define bcd_day DAY_REG
#define bcd_yer YEAR_REG
#define wek WEEK_REG
// Commands for the Control/Status register.
#define PCF8563_START_COUNTING 0x08
#define PCF8563_STOP_COUNTING 0x28
//************************************* for Set_Alarm()
#define PCF8563_Alarm_off 0x00
#define PCF8563_M_Mode 0x01
#define PCF8563_MH_Mode 0x04
#define PCF8563_MHW_Mode 0x07
#define PCF8563_MHD_Mode 0x0B
//************************************* for config_CLKOUT()
#define PCF8563_CLKOUT_off 0x00
#define PCF8563_CLKOUT_32KHz 0x80
#define PCF8563_CLKOUT_1KHz 0x81
#define PCF8563_CLKOUT_32Hz 0x82
#define PCF8563_CLKOUT_1Hz 0x83
//************************************* for config_PCF8563_Timer()
#define PCF8563_Timer_off 0x00
#define PCF8563_Timer_4KHz 0x80
#define PCF8563_Timer_64Hz 0x81
#define PCF8563_Timer_1Hz 0x82
#define PCF8563_Timer_1_60Hz 0x83
//************************************* for config_PCF8563_Interrupt()
#define Alarm_Interrupt_Enable 0x01
#define Timer_Interrupt_Enable 0x02
#define A_T_Interrupt_Enable 0x03
#define Timer_INT_Pulse_on 0x10
#define Timer_INT_Pulse_off 0x00
int8 bin2bcd(int8 value)
{
char retval = 0;
while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(value >= 10)
{
value -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += value;
break;
}
}
return(retval);
}
//----------------------------------------------
// This function converts an 8 bit BCD value to
// an 8 bit binary value.
// The input range must be from 00 to 99.
char bcd2bin(char bcd_value)
{
char temp;
temp = bcd_value;
// Shifting the upper digit right by 1 is
// the same as multiplying it by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
//----------------------------------------------
void PCF8563_write_byte(int8 address, int8 data)
{
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
enable_interrupts(GLOBAL);
}
//----------------------------------------------
int8 PCF8563_read_byte(int8 address)
{
int8 retval;
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(PCF8563_READ_ADDRESS);
retval = i2c_read(0);
i2c_stop();
enable_interrupts(GLOBAL);
return(retval);
}
//----------------------------------------------
// PCF8563 Initial // //
void PCF8563_init(void)
{
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(PCF8563_CTRL_STATUS_REG1);
i2c_write(PCF8563_START_COUNTING);
i2c_write(0x02); // CTRL_STATUS_REG2
i2c_write(1); // SECONDS_REG
i2c_write(1); // MINUTES_REG
i2c_write(1); // HOURS_REG
i2c_write(1); // DAY_REG
i2c_write(1); // WEEK_REG
i2c_write(1); // MONTH_REG
i2c_write(1); // YEAR_REG
i2c_stop();
}
void PCF8563_Read_SMH(void)
{
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(PCF8563_SECONDS_REG);
i2c_start();
i2c_write(PCF8563_READ_ADDRESS);
LV_sec =i2c_read();
MINUTES_REG =i2c_read();
HOURS_REG =i2c_read();
i2c_read();
i2c_read();
i2c_read();
i2c_read();
ALARM_MINS_REG =i2c_read();
ALARM_HOURS_REG=i2c_read(0);
i2c_stop();
}
void PCF8563_Clear_Alarm_Flag(void)
{
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(PCF8563_CTRL_STATUS_REG2);
i2c_write(0x02);
i2c_stop();
}
void PCF8563_Set_Alarm(void)
{
i2c_start();
i2c_write(PCF8563_WRITE_ADDRESS);
i2c_write(PCF8563_ALARM_MINS_REG);
i2c_write(ALARM_MINS_REG);
i2c_write(0x80); // ALARM_HOURS_REG
i2c_write(0x80); // ALARM_DAY_REG
i2c_write(0x80); // MINUTES_REG
i2c_write(0x80); // ALARM_WEEKDAY_REG
i2c_write(0x80); // CTRL_CLKOUT_REG
i2c_write(0x00); // CTRL_TIMER_REG
i2c_stop();
}
//----------------------------------------------
void config_PCF8563_Interrupt(int8 mode,ti_tp)
{
mode = mode | ti_tp;
PCF8563_write_byte(PCF8563_CTRL_STATUS_REG2, mode);
}
/***************************************************************************
**************************** ICM7211AIPL ***********************************
****************************************************************************/
int8 dig[4];
typedef struct {
signed int quot;
signed int rem;
} div_t;
//**************************************************
div_t div(signed int numer, signed int denom)
{
div_t val;
val.quot = numer / denom;
val.rem = numer - (denom * val.quot);
return (val);
}
//***************************************************
void show_Digit(int8 intercode)
{
intercode = intercode & 0x0F;
switch (intercode)
{
case 0:output_low(DATA3);output_low(DATA2);output_low(DATA1);output_low(DATA0);break; //FOR 0
case 1:output_low(DATA3);output_low(DATA2);output_low(DATA1);output_high(DATA0);break; //FOR 1
case 2:output_low(DATA3);output_low(DATA2);output_high(DATA1);output_low(DATA0);break; //FOR 2
case 3:output_low(DATA3);output_low(DATA2);output_high(DATA1);output_high(DATA0);break; //FOR 3
case 4:output_low(DATA3);output_high(DATA2);output_low(DATA1);output_low(DATA0);break; //FOR 4
case 5:output_low(DATA3);output_high(DATA2);output_low(DATA1);output_high(DATA0);break; //FOR 5
case 6:output_low(DATA3);output_high(DATA2);output_high(DATA1);output_low(DATA0);break; //FOR 6
case 7:output_low(DATA3);output_high(DATA2);output_high(DATA1);output_high(DATA0);break; //FOR 7
case 8:output_high(DATA3);output_low(DATA2);output_low(DATA1);output_low(DATA0);break; //FOR 8
case 9:output_high(DATA3);output_low(DATA2);output_low(DATA1);output_high(DATA0);break; //FOR 9
case 10:output_high(DATA3);output_low(DATA2);output_high(DATA1);output_low(DATA0);break; //FOR -
case 11:output_high(DATA3);output_low(DATA2);output_high(DATA1);output_high(DATA0);break; //FOR E
default:output_high(DATA3);output_high(DATA2);output_high(DATA2);output_high(DATA0);break; //FOR BLANK
}
}
// *******************************************************
void putLCD(signed int16 value,int8 lcd_power_switch )
{
if (lcd_power_switch)
{
div_t numb;
int8 mode=0x00,i;
if (value > 9999 || value < 999 ){
for (i=0;i>=3;++i) dig[1]=11;
}
else {
for (i=0;i>=3;++i) dig[1]=12;
if (value<0) {
value=value*(-1);
mode = 0x10;
dig[3] = 10;
}
if (value>999){
numb=div(value,1000);
dig[3] = numb.quot;
value = numb.rem;
mode += 0x08 ;
}
if (value>99){
numb=div(value,100);
dig[2] = numb.quot;
value = numb.rem;
mode += 0x04 ;
}
if (value>9){
numb=div(value,10);
dig[1] = numb.quot;
value = numb.rem;
mode += 0x02 ;
}
if (value > -1){
dig[0] = value;
mode += 0x01;
}
}
output_high(DE); delay_us(2);
output_high(DIG1); delay_us(2);
show_Digit(dig[0]);delay_us(2);
output_low(DIG1);
output_high(DIG2); delay_us(2);
show_Digit(dig[1]);delay_us(2);
output_low(DIG2);
output_high(DIG3); delay_us(2);
show_Digit(dig[2]);delay_us(2);
output_low(DIG3);
output_high(DIG4); delay_us(2);
show_Digit(dig[3]);delay_us(2);
output_low(DIG4); delay_us(2);
show_Digit(0);
if (lcd_power_switch==1) {output_high(LED2);output_high(LED2);output_low(LED1);}
if (lcd_power_switch==2) {output_high(LED1);output_high(LED1);output_low(LED2);}
}
else {
output_high(DE); delay_us(2);
output_high(DIG1); delay_us(2);
show_Digit(dig[0]);delay_us(2);
output_low(DIG1);
output_high(DIG2); delay_us(2);
show_Digit(dig[1]);delay_us(2);
output_low(DIG2);
output_high(DIG3); delay_us(2);
show_Digit(dig[2]);delay_us(2);
output_low(DIG3);
output_high(DIG4); delay_us(2);
show_Digit(dig[3]);delay_us(2);
output_low(DIG4);
show_Digit(0);
output_low(DE);
output_high(LED1);
output_high(LED2);
output_high(LED2);
output_high(LED1);
}
}
// +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
// /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
signed int8 Temperature(void){
output_high(SDN);
delay_us(80);
setup_adc_ports(AN0);set_adc_channel(0);
setup_adc(ADC_CLOCK_INTERNAL);
A2DC=read_adc();
delay_us(10);
output_low(SDN);
Return make8((((Cal_A * ( A2DC - Cal_C))/Cal_B) + Cal_D),0);
}
//---------------------------------------------------
void ReportTSC(int32 inp){
int8 i,dig[4],temp;
dig[0]= make8(inp,0);
dig[1]= make8(inp,1);
dig[2]= make8(inp,2);
dig[3]= make8(inp,3);
temp=Sleep_Priod_Division_Reg;
putc(I_am_ready);
for(i=0;i=3;i++)putc(dig[i]);
putc(temp);
}
//---------------------------------------------------
void Reset_Command(void){
if (Pervius_Command){Command=Pervius_Command;Pervius_Command=0x00;
enable_interrupts(INT_RB);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);}
else
{
if (PK1){Command=0x24;enable_interrupts(INT_RB);}
if (PK2){Command=0x28;enable_interrupts(INT_RB);}
if (PK3){Command=0x41;enable_interrupts(INT_RB);}
if (CC){Command=0x82;}
if (ExINT){Command=0x11;}
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
} }
//---------------------------------------------------
|
Thanks, if you help me and explain me about using PORT B Change Interrupt (pins RB7:RB4) in other simplest code and guide me about using it so it worked carefully. _________________ My Gmail is:
[email protected]
You can send pm for me in it
Last edited by HGHK on Tue Jan 04, 2011 3:09 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Dec 25, 2010 2:51 pm |
|
|
PortB must be read inside the #int_RB routine, to clear the "Mismatch
condition". This is stated in the PIC data sheet. To do this, add the
code (shown in bold below) to your program.
Quote: |
// This function reads Port B without changing the TRIS.
int8 input_state_b(void)
{
#byte PortB = getenv("SFR:PORTB")
return(PortB);
}
#int_RB
void RB_isr(void)
{
int8 temp;
PKC++;
if((Command!=Press_Key_First)||(Command!=Press_Key_Second)||(Command!=Press_Key_Third)){Pervius_Command=Command;}
switch (PKC){
case 1: Command=Press_Key_First;PK1=1;PK2=0;PK3=0;break;
case 2: command=Press_Key_Second;PK1=0;PK2=1;PK3=0;break;
default: command=Press_Key_Third;PK1=0;PK2=0;PK3=1;PKC=0;break;
}
OFC=0;
set_timer0(0);
enable_interrupts(INT_TIMER0);
temp = input_state_b(); // Clear mismatch condition on Port B
} |
Quote: |
#include <16F876.h>
#device ICD=TRUE
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES DEBUG //Debug mode for use with ICD
#use delay(clock=2000000) |
Do you really have a 2 MHz crystal ? That's very unusual. Or is it
really supposed to be 20 MHz ? If so, edit the #use delay() statement
and also change the fuse from XT to HS.
Are you using the INT output pin of the pcf8563 ? If so, you need a
pull-up resistor on it. You can use 4.7K ohms. |
|
|
HGHK
Joined: 29 Jun 2010 Posts: 33
|
|
Posted: Tue Dec 28, 2010 7:08 am |
|
|
Dear PCM programmer
thanks
I test it, but noises make interrupt in another pin from B4-B7. I must pull-up Port B but I made my PCB and I don't know why when I use
in my program the port doesn't pull up.
I used 1MHz crystal before but I don't find it in shops and I prefer 2MHz crystal for low consuming power requirements in PIC16LF876 series and I2C baud rate true setting. Also it find in shops!
If you have a better offer I very like to know.
I use PCF8563 Interrupt for wake up from sleep and I pull up it by 4.7K resistor. So I pull up Pin B5 and it connect with Push-pull bottom and noise reduction capacitor to GND.
Thanks for your help. _________________ My Gmail is:
[email protected]
You can send pm for me in it |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Dec 28, 2010 12:51 pm |
|
|
Quote: | I must pull-up Port B but I made my PCB and I don't know why when I use:
port_b_pullups(1);
in my program the port doesn't pull up. |
Then make a small test program and study how to use the
port_b_pullups() function.
I looked in your program for the port_b_pullups() line, which you say
you have in there. I didn't find it. But I did see this problem:
Quote: |
void ReportTSC(int32 inp){
int8 i,dig[4],temp;
dig[0]= make8(inp,0);
dig[1]= make8(inp,1);
dig[2]= make8(inp,2);
dig[3]= make8(inp,3);
temp=Sleep_Priod_Division_Reg;
putc(I_am_ready);
for(i=0;i=3;i++)putc(dig[i]); putc(temp);
}
|
What does that line do ? How can "i=3" work ?
Here is a test program to test that line of code:
Code: | #include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//==========================================
void main()
{
int8 i;
for(i=0;i=3;i++) putc('A');
while(1);
} |
Here is the output:
Quote: | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
Your code does not work correctly.
You need to study "for loops" in the C language and learn how to make
a correct for() statement. |
|
|
HGHK
Joined: 29 Jun 2010 Posts: 33
|
|
Posted: Tue Jan 04, 2011 4:19 am |
|
|
Quote: | I looked in your program for the port_b_pullups() line, which you say
you have in there. I didn't find it. |
I placed corrections that you offered in my program. Thanks for your attention. but in ccs c manual says that: Quote: | for
For is also used as a loop/iteration statement.
The syntax is
for (expr1;expr2;expr3)
statement
The expressions are loop control statements. expr1 is the initialization, expr2 is the termination check and expr3 is re-initialization. Any of them can be omitted.
Example:
for (i=1;i<=10;++i)
printf("%u\r\n",i); |
I think termination check means that when I come to expr2 this loop is end of screwing and when this loop were end next line go runs.
pleas help me that what of these:
Code: | for(i=0;i<=3;i++)putc(dig[i]); |
or
Code: | for(i=0;i>3;i++)putc(dig[i]); |
is ok? _________________ My Gmail is:
[email protected]
You can send pm for me in it |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 04, 2011 1:22 pm |
|
|
Make a test program. Test it with each of those lines of code.
Then you can see what each line does.
You can test it with the MPLAB simulator:
See this post for instructions on how to use the "UART1" feature of the
MPLAB simulator to display serial output in the MPLAB Output Window:
http://www.ccsinfo.com/forum/viewtopic.php?t=23408&start=1 |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|