RA4 & RA5 pic16f877a

General discussion on mikroC.
Post Reply
Author
Message
wa4cdm
Posts: 56
Joined: 02 Nov 2006 16:15
Location: Knoxville, Tn. USA
Contact:

RA4 & RA5 pic16f877a

#1 Post by wa4cdm » 11 Jan 2008 18:00

Hello All,
I'm need 2 more pins (inputs) for my project.
I have RA4,5 available but I can't seem to get them to work.
I have included the program if anyone could steer me in the right or offer a comment.
Thanks Bill //#############################################################################

#define clock_bit_mask 0x01; // default low port a RA0
#define data_bit_mask 0x02; // default low port a RA1
#define latch_en_bit_mask1 0x04; // LO#U3 1khz / 10khz port a RA2
#define latch_en_bit_mask2 0x08 // REF 100 mhz le enable lmx2306 RA3
#define latch_enU1_bit_mask_1 0x10 // latchU1 RA4
#define latch_enU10_bit_mask_2 0x20 // latchU10 RA5
#define control_bit_mask_1 0x01; // latchU1 RE0
#define control_bit_mask_2 0x02; // latchU10 RE1
#define control_bit_mask_3 0x04 // RE2

unsigned short i;
unsigned short kp;

int kp_1;
int syncntrl_out;
int dcount;
int count_bit;
int long r0;
int r1;
int long r0_cnt;
int control_lo_3;
int count_lock;

void clock_r1_data_bits_from_r0_msb_first(void);
void r0_cnt_a(void);
void init_lo3_U1(void);
void init_lo3_U10(void);
void dcount_test(void);

void data_low_load(void);
void data_high_load(void);
//----------------------------------
void clr_le_lo3_U1(void);
void set_le_lo3_U1(void);
void clr_le_lo3_U10(void);
void set_le_lo3_U10(void);
//----------------------------------
void ser(void); // serial
//----------------------------------
void U3_low_band(void); // 708.4mhz
void U3_hi_band(void); // 788.0mhz
void VCO_low_band(void); // 117.7mhz
// void VCO_hi_band(void); // 119.7mhz
//----------------------------------
void clr_le_ref(void); // lmx ref osc
void set_le_ref(void); // lmx ref osc
void f_reg_load(void); // lmx ref osc
void r_reg_load(void); // lmx ref osc
void n_reg_load(void); // lmx ref osc
void REF_Load_lock(void); // lmx ref osc
//----------------------------------
void delay_long(void); // ms
void delay1_test(void);
void delay1(void);
//----------------------------------
void lcd_clr(void); // lcd
//----------------------------------
void lock_time(void);
void fail_lock1(void);
void pass_lock1(void);
void fail_lock2(void);
void pass_lock2(void);

//#############################################################################
//#### DELAY ROUTINES #####################################################
//#############################################################################
void delay1_test(void) //###################################################
{ //###################################################
delay_us(100); //###################################################
} //###################################################
//#############################################################################
void delay1(void) //###################################################
{ //###################################################
delay_ms(1); //###################################################
} //###################################################
//#############################################################################
void delay_long(void) //###################################################
{ //###################################################
delay_ms(100); //###################################################
} //###################################################
//#############################################################################
//##### DELAY ROUTINES END ##################################################
//#############################################################################

void main() {
ADCON1 = 0x06; // all digital
PORTA = 0xc0; // all pins low , control
TRISA = 0xc0; // all pins outputs , control
PORTE = 0x00; // most pins low
TRISE = 0x04; // RE0, RE1 pins OUTPUTS, RE2 input
PORTB = 0x00; // all pins low , keypad
TRISB = 0x00; // all pins OUTPUTS , keypad
TRISC = 0xf0; // pins INTPUT , upper USART
PORTC = 0xf0; // pins low , Upper USART
TRISD = 0x00; // all pins OUTPUTS , LCD
PORTD = 0x00; // all pins low , LCD

Usart_Init(2400); // get usuart going


Lcd_Init(&PORTD);
lcd_clr();
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(0, 1,"REF locking");
REF_Load_lock();
delay_long();
Lcd_Out(2, 1,"REF locked");
delay_long();
delay_long();
init_lo3_U1(); // 720 MHZ
delay_long();
init_lo3_U10(); // 118 MHZ
Keypad_Init(&PORTB); // Initialize Keypad on PORTC
do {
Delay_long();
kp = 0;
// Wait for key to be pressed and released
do {
kp = Keypad_Read();
Delay_ms(30);

if (Usart_Data_Ready()) { // If data is received
i = Usart_Read(); // Read the received data
Usart_Write(i); // Send data via USART
SER();
kp = kp_1;
}
}
while (!kp);
//#############################################################################
if (kp == 1)
{
delay1();
U3_low_band(); // 708.4 mhz
delay1_test();
}
else if (kp == 2)
{
delay1();
U3_hi_band(); // 788 mhz
delay1_test();
}
else if (kp == 3)
{
delay1();
init_lo3_U1();
// VCO_low_band(); // 117.7 mhz
delay1_test();
}
else if (kp == 4)
{
delay1();
init_lo3_U10();
// VCO_hi_band(); // 119.7 mhz
delay1_test();
}
else if (kp == 5)
{
delay1();
lock_time();
delay1_test(); // lock time test
}
Usart_Write(kp); // to pc
} while (1);
}
//#############################################################################
//#############################################################################
//
// clock_bit_mask 0x01; // default low port a RA0
// data_bit_mask 0x02; // default low port a RA1
// latch_en_bit_mask1 0x04; // LO#U3 1khz / 10khz port a RA2
// latch_en_bit_mask2 0x08 // REF 100 mhz le enable lmx2306 RA3
// latch_enU1_bit_mask_1 0x10 // latchU1 RA4
// latch_enU10_bit_mask_2 0x20 // latchU10 RA5
// control_bit_mask_1 0x01; // lock U1 RE0
// control_bit_mask_2 0x02; // lock U10 RE1
// control_bit_mask_3 0x04 // RE2
//
//#############################################################################
//## Routine for loading registers in Synthesizers ##########################
//#############################################################################
void dcount_test(void) // dcount = r1;
{
for ( count_bit= 0; count_bit < r1 ; count_bit++) {r0_cnt_a(); r1--;}
}
//-----------------------------------------------------------------------------
void clock_r1_data_bits_from_r0_msb_first(void)
{
dcount = r1;
for ( count_bit= 0; count_bit < r1 ; count_bit++) {r0_cnt_a(); dcount--;}
}
//-----------------------------------------------------------------------------
void r0_cnt_a(void)
{
r0_cnt = r0;
r0_cnt = r0_cnt >> dcount-1;

if ( r0_cnt &1) { data_high_load(); }
else {data_low_load();}
delay1_test();
}
//#############################################################################
//##### DATA HIGH AND LOW LOAD ############################################
//#############################################################################
void data_high_load(void)
{
syncntrl_out = syncntrl_out | data_bit_mask;
PORTA = syncntrl_out;
delay1_test();
syncntrl_out = syncntrl_out | clock_bit_mask;
PORTA = syncntrl_out;
delay1_test();
syncntrl_out = syncntrl_out ^ clock_bit_mask;
PORTA = syncntrl_out;
delay1_test();
syncntrl_out = syncntrl_out ^ data_bit_mask;
PORTA = syncntrl_out;
PORTA = 0x00;
delay1_test();
}
//-----------------------------------------------------------------------------
void data_low_load(void)
{
syncntrl_out = syncntrl_out | data_bit_mask;
syncntrl_out = syncntrl_out ^ data_bit_mask;
PORTA = syncntrl_out;
delay1_test();
syncntrl_out = syncntrl_out | clock_bit_mask;
PORTA = syncntrl_out;
delay1_test();
syncntrl_out = syncntrl_out ^ clock_bit_mask;
PORTA = syncntrl_out;
PORTA = 0x00;
delay1_test();
}
//#############################################################################
//###### Serial stuff ########################################################
//#############################################################################
void ser(void)
{
i= i -0x30;
kp_1 = i;
}
//#############################################################################
//######### INIT U1 ##########################################################
//#############################################################################
void init_lo3_U1(void)
{
clr_le_lo3_U1(); // control bits init = c2 = 1, c1 = 1
r0 = 0x009f9893; // init register
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
//-----------------------------------------------------------------------------
// clr_le_lo3_U1(); // control bits funct = c2 = 1, c1 = 0
// r0 = 0x009f8012; // Function latch register change code
// r1 = 24;
// clock_r1_data_bits_from_r0_msb_first();
// set_le_lo3_U1();
//-----------------------------------------------------------------------------
clr_le_lo3_U1(); // control bits Ref R = c2 = 0, c1 = 0
r0 = 0x000003e8; // R reference register ? 3e8
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
//-----------------------------------------------------------------------------
clr_le_lo3_U1(); // control bits N (A,B) = c2 = 0, c1 = 1
r0 = 0x00003a11; // N counter register ? 3821
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
clr_le_lo3_U1();
// lck3_U1();
}
//=============================================================================
void set_le_lo3_U1(void) // latch_enU1_bit_mask_1 0x10 control_bit_mask_1
{
PORTE = control_bit_mask_1;
// delay1_test();
// delay_long();
}
//=============================================================================
void clr_le_lo3_U1(void) // latch_enU1_bit_mask_1 0x10 control_bit_mask_1
{
syncntrl_out = control_bit_mask_1;;
syncntrl_out = syncntrl_out ^ control_bit_mask_1;;
PORTE = syncntrl_out;
// delay1_test();
// delay_long();
}
//#############################################################################
//######### INIT U10 #########################################################
//#############################################################################
// Second PLL #################################################################

void init_lo3_U10(void)
{
clr_le_lo3_U10();
r0 = 0x00138013; // init register
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();

//-----------------------------------------------------------------------------
// clr_le_lo3_U10();
// r0 = 0x00138092; // Function latch register change code ?9f8013
// r1 = 24;
// clock_r1_data_bits_from_r0_msb_first();
// set_le_lo3_U10();

//-----------------------------------------------------------------------------
clr_le_lo3_U10();
r0 = 0x00020000; // R reference register ?9c40
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();

//-----------------------------------------------------------------------------
clr_le_lo3_U10();
r0 = 0x00000501; // N counter register ?17061
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();
clr_le_lo3_U10();
// lck3_U10();
}
//=============================================================================
void set_le_lo3_U10(void) // control_bit_mask_2; 0x20
{
PORTE = control_bit_mask_2;
// delay_long();
delay1_test();
}
//=============================================================================
void clr_le_lo3_U10(void) // control_bit_mask_2; 0x20
{
syncntrl_out = control_bit_mask_2;
syncntrl_out = syncntrl_out ^ control_bit_mask_2;
PORTE = syncntrl_out;
// delay_long();
delay1_test();
}
//#############################################################################
//#############################################################################
//##### U3 N-REGISTER CODES ############################################
//#############################################################################
//###### low end of U3 #######################################################
//#############################################################################

void U3_low_band(void) // 708.4 mhz
{
clr_le_lo3_U1();
r0 = 0x0000372d; // N register 372d
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
clr_le_lo3_U1();

lcd_clr();
Lcd_Out(0, 1,"708.4 mhz");
Lcd_Out(2, 1,"low");
delay1_test();
}
//#****************************************************************************
//-------- high end of U3 ---------------------------------------------------
//#****************************************************************************
void U3_hi_band(void) // 788 mhz
{

clr_le_lo3_U1();
r0 = 0x00003d49; // N register 3d49
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
clr_le_lo3_U1();

lcd_clr();
Lcd_Out(0, 1,"788 mhz");
Lcd_Out(2, 1,"high");
delay1_test();
}
//#############################################################################
//##### VCO N-REGISTER CODES ############################################
//#############################################################################
/* void VCO_low_band(void) // 117.7 mhz
{
init_lo3_U10(void);

clr_le_lo3_U10();
r0 = 0x00016f69; // N register 16f69
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();
clr_le_lo3_U10();

lcd_clr();
Lcd_Out(0, 1,"117.7 mhz");
Lcd_Out(2, 1,"low");
delay1_test();
delay_long();
}
//-----------------------------------------------------------------------------
void VCO_hi_band(void) // 119.7 mhz
{
clr_le_lo3_U10();
r0 = 0x00017609; // N register 17609
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();
clr_le_lo3_U10();

lcd_clr();
Lcd_Out(0, 1,"119.7 mhz");
Lcd_Out(2, 1,"high");
delay1_test();
delay_long();
}
*/
//#############################################################################
//#############################################################################
// ## LOCK TIME routine starts ##
//#############################################################################
void lock_time(void)
{
for ( count_lock= 0; count_lock < 10 ; count_lock++)
{
clr_le_lo3_U1();
r0 = 0x0000372d; // N register 372d 708.4 mhz
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
clr_le_lo3_U1();

clr_le_lo3_U1();
r0 = 0x00003d49; // N register 3d49 788 mhz
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U1();
clr_le_lo3_U1();
delay_us(700);
if ( porte.f2 == 0 ) { fail_lock1(); }
else if ( porte.f2 == 1 ) { pass_lock1(); }
// delay1_test();
//#############################################################################

for ( count_lock= 0; count_lock < 10 ; count_lock++)

clr_le_lo3_U10();
r0 = 0x00016f69; // N register 16f69 117.7 mhz
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();
clr_le_lo3_U10();

clr_le_lo3_U10();
r0 = 0x00017609; // N register 17609 119.7
r1 = 24;
clock_r1_data_bits_from_r0_msb_first();
set_le_lo3_U10();
clr_le_lo3_U10();
delay_us(700);
if ( porte.f2 == 0 ) { fail_lock2(); }
else if ( porte.f2 == 1 ) { pass_lock2(); }

}
}
//#############################################################################
void fail_lock1(void)
{
lcd_clr();
Lcd_Out(0, 1,"FAIL LOCK1 TIME");
Usart_Write(0x46);
}
//#############################################################################
void pass_lock1(void)
{
lcd_clr();
Lcd_Out(0, 1,"PASS LOCK1 TIME");
Usart_Write(0x50);

}
//#############################################################################
void fail_lock2(void)
{
// lcd_clr();
Lcd_Out(2, 1,"FAIL LOCK2 TIME");
Usart_Write(0x46);
}
//#############################################################################
void pass_lock2(void)
{
// lcd_clr();
Lcd_Out(2, 1,"PASS LOCK2 TIME");
Usart_Write(0x50);
}
//#############################################################################
void lcd_clr(void)
{
Lcd_Cmd(Lcd_CLEAR);
}
//#############################################################################
//########## lock routine ends ###############################################
//#############################################################################
//############################################################################
//####### Ref LOCK LMX2306 Starts here WORKS!!! ########################
//####### DON'T MESS WITH ##############################################
//############################################################################
void REF_Load_lock(void)
{
f_reg_load(); // lmx2306
delay1_test();
r_reg_load();
delay1_test();
n_reg_load();
delay1_test();
}
//#****************************************************************************
void f_reg_load(void) //
{
clr_le_ref();
r0 = 0x00000092; //
r1 = 21;
clock_r1_data_bits_from_r0_msb_first();
set_le_ref();
clr_le_ref();
}
//#****************************************************************************
void r_reg_load(void) //
{
clr_le_ref();
r0 = 0x00003E80; //
r1 = 21;
clock_r1_data_bits_from_r0_msb_first();
set_le_ref();
clr_le_ref();
}
//#****************************************************************************
void n_reg_load(void) //
{
clr_le_ref();
r0 = 0x0014E201; //
r1 = 21;
clock_r1_data_bits_from_r0_msb_first();
set_le_ref();
clr_le_ref();
}
//#****************************************************************************
//#############################################################################
void set_le_ref(void)
{
syncntrl_out = syncntrl_out | latch_en_bit_mask2;
PORTA = syncntrl_out;
delay1_test();
delay_long();
}
//#############################################################################
void clr_le_ref(void)
{
syncntrl_out = syncntrl_out | latch_en_bit_mask2;
syncntrl_out = syncntrl_out ^ latch_en_bit_mask2;
PORTA = syncntrl_out;
delay1_test();
delay_long();
}
//#############################################################################]

yo2lio
Posts: 1878
Joined: 19 Sep 2006 12:57
Location: Romania, Arad City
Contact:

Re: RA4 & RA5 pic16f877a

#2 Post by yo2lio » 11 Jan 2008 18:22

wa4cdm wrote:I'm need 2 more pins (inputs) for my project.
I have RA4,5 available but I can't seem to get them to work.

....
....
....
void main() {
ADCON1 = 0x06; // all digital
PORTA = 0xc0; // all pins low , control
TRISA = 0xc0; // all pins outputs , control
PORTE = 0x00; // most pins low
TRISE = 0x04; // RE0, RE1 pins OUTPUTS, RE2 input
....
....
Do you need input or output. In your settings all PORTA pins are output.

Don't forgot PORTA.4 is OPEN DRAIN. :wink:
Best regards, Florin Andrei Medrea.

http://www.microelemente.ro/
http://www.microelemente.ro/produse-si-servicii/
http://www.microelemente.ro/custom-software/

mail : florin@microelemente.ro

Sparky1039
Posts: 1179
Joined: 24 Nov 2005 20:07
Location: Colorado, USA

#3 Post by Sparky1039 » 11 Jan 2008 18:24

ADCON1 = 0x06; // all digital
PORTA = 0xc0; // all pins low , control
TRISA = 0xc0; // all pins outputs , control >> 0b11000000
You have the TRISA register for ports 4 & 5 configured as outputs. Should be 0xF0 >> 0b11110000 to make them inputs.

wa4cdm
Posts: 56
Joined: 02 Nov 2006 16:15
Location: Knoxville, Tn. USA
Contact:

#4 Post by wa4cdm » 14 Jan 2008 14:23

Hello all, Thanks for the help. I changed TRISA to 0xF0 and that fixed the RA4 problem. But I still had a problem with RA5 as it was always low. I traced the problem to the A to D section on the Easy Pic 4 board and I had RA5 jumpered . It was causing the the other problem.
Now the program works.
Again thanks.


Bill :P

prosibu
Posts: 5
Joined: 11 Jan 2011 07:43

Re:

#5 Post by prosibu » 12 Jan 2011 13:18

wa4cdm wrote:Hello all, Thanks for the help. I changed TRISA to 0xF0 and that fixed the RA4 problem. But I still had a problem with RA5 as it was always low. I traced the problem to the A to D section on the Easy Pic 4 board and I had RA5 jumpered . It was causing the the other problem.
Now the program works.
Again thanks.


Bill :P
May I know how u set it? Coz now my RA5 always =0, and i want it as digital I/O.
I have already done "ADCON0 = 0;" . Please help.

Post Reply

Return to “mikroC General”