|
|
View previous topic :: View next topic |
Author |
Message |
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
Need Input(pin_A0) for PIC16F690 Help |
Posted: Mon Jun 15, 2015 5:31 pm |
|
|
Hi everyone, this is my first time in the forum. I tried searching for a solution before posting.
Having a problem with a larger program caused me to try a simpler program to isolate the problem. I am using old stuff: ICD2, with a little PIC development board which came with a 16F690, CCS (~8 years old) inside MPLAB V7.31. I am using MPLAB V7.31 as it is the closest in age to the other stuff. I don't have (and can't find) the proper USB driver (Windows VISTA) for the ICD2 so I can't get into debug mode. I can program the device though.
Here's what I believe is my problem: I can turn output pins on and off easily enough but I can't seem to be able to input an input pin. My code is simple and by using output commands and delays (not in there now for simplicity) I can tell that the input looks like it is being by passed no matter what the condition of the input pin (high or low). Here is the program:
Code: |
///////////Blinking LED Program///////////////////////////
// #device PIC16F690
#if defined(__PCB__)
#include <16C56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)
#elif defined(__PCM__)
#include <16F690.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use standard_io(A)
// #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif
void display() // blinking function
{
output_high(56);
delay_ms(2000);
output_low(56);
delay_ms(2000);
} // end display
void main()
{
port_a_pullups(FALSE); // using port A as input
output_low(pin_C0); // my output pin
LOOP:
{
while(input(pin_A0)); // Pin A0 is my input pin
display(); // I have tried Pin = input(A0);
goto LOOP; // while(Pin), while(!Pin), etc
} // program goes to display function
output_low(pin_C0); // regardless if A0 is hi or lo
} // end main |
_________________ Randy Principe
Electrical Engineering Technician |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1939 Location: Norman, OK
|
|
Posted: Mon Jun 15, 2015 6:02 pm |
|
|
Look at the datasheet page 6 and you will see A0 is used for several
functions including the ICSP Data line so you cant use it with the ICSP
plugged in. Try using RA2 after turning off CCP1 and AN2.
See setup_CCP1() and setup_ADC().
For debug the 16F690 requires a special header. See the ICD2 Readme.htm file
http://nnp.ucsd.edu/phy120b/pic_manuals_pdf/Readme_for_MPLAB_ICD_2.htm _________________ Google and Forum Search are some of your best tools!!!! |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Mon Jun 15, 2015 6:42 pm |
|
|
I will, thank you. I wish I understood the PIC micros better!
Thanks again. I will post when it works. _________________ Randy Principe
Electrical Engineering Technician |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
Still not working |
Posted: Tue Jun 16, 2015 4:32 pm |
|
|
Hi everyone,
As previously suggested I tried using pin A2, then A3 as my input pin.
I disabled the following:
CCP1, Comparator, Vref, Timer1, ADC, MCLR
In my real application I need 5 output pins and 5 input pins, with none of the things I disabled above. Just read 5 inputs one at time, and if high turn on a corresponding output pin. I chose the PIC16F690 because that's what I had and the little development board came with it. Maybe I am not using the best chip.
Here's my code if anyone can see anything wrong. I got rid of the function and loop. Any more help would be really appreciated. Thanks.
Code: |
#if defined(__PCB__)
#include <16C56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)
#elif defined(__PCM__)
#include <16F690.h>
#fuses HS,NOWDT,NOPROTECT,NOMCLR
#use delay(clock=4000000)
#use fast_io(A) // needed for set_tris
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif
int pin;
void main()
{
SETUP_CCP1(0);
SETUP_COMPARATOR(NC_NC_NC_NC);
SETUP_TIMER_1(0);
SETUP_VREF(FALSE);
SETUP_ADC(0);
port_a_pullups(FALSE);
set_tris_a(0x3f);
set_tris_c(0x00);
output_c(0x0f); //visual... works here
delay_ms(2000);
pin=input(pin_A3); //Pin_A3 tied to 5V on pwb
output_high(pin_C0); //visual... works here
delay_ms(2000);
output_bit(pin_C0,pin); // 'pin' should be 1 or high
if(pin)
{
output_high(56); //no output here :cry:
delay_ms(2000);
output_low(56);
delay_ms(2000);
}
else output_high(56);//visual... works here
} // end main |
_________________ Randy Principe
Electrical Engineering Technician |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 16, 2015 5:25 pm |
|
|
Quote: | CCS (~8 years old) |
What's your CCS version number ? It's given at the top of the .LST file,
which will be in your project directory after a successful compilation.
The version number will be a 4-digit number such as 3.249, 4.141, 5.046,
etc.
Quote: | with a little PIC development board which came with a 16F690, |
Post the manufacturer and name (or part number) of the board. Post a
link to the website for the board if you have it.
Finally, post the power supply voltage for your board. Is it +5v ? |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Wed Jun 17, 2015 7:55 am |
|
|
Hi PCM Programmer,
Thank you for responding to my post. Here is the info you requested:
1) CCS PCM C Compiler, Version 4.050
2) The development board is the "Low Pin Count Demo Board" that came with the PICkit 2 package. Page 41 of the Low Count Demo Board User's Guide.
http://ww1.microchip.com/downloads/en/DeviceDoc/Low%20Pin%20Count%20User%20Guide%2051556a.pdf
3) The demo board is powered by 5V
Thanks again,
Randy _________________ Randy Principe
Electrical Engineering Technician |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Wed Jun 17, 2015 10:35 am |
|
|
I have used that board for a number of little projects. You do have to pay attention to the fact that RA0 and RA3 are connected to other things on the board. Seems to me there was something else that bit me too, but I can't remember just what it was. Currently, I have one running my heater for the hummingbird feeder for when it gets below freezing here in the Seattle area (surprisingly, there are a number of hummers that hang around all winter!). You might want to look at the 18F14K22 (or 26k22) chip. Very reasonable with more memory etc. in them and very reasonably priced (Digikey has them for $2.48 ea for the 14k22 and $3.42 for the 26k22 in single piece pricing). Lots of FLASH etc. to work with in those.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Wed Jun 17, 2015 1:54 pm |
|
|
Thanks. I had forgot to mention I removed the pot that is attached to RA0. Have you ever used the 16F690 by chance? It doesn't make sense that the input() command is not working. I am betting the setup for the chip is not complete... I am going to dig a little more before giving up. About 15 minutes! Thanks again. _________________ Randy Principe
Electrical Engineering Technician |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jun 17, 2015 2:54 pm |
|
|
I modified your program to make it easier for me to test. It works.
I tested it on the Microchip Low Pin Count board with a 16F690, CCS vs.
5.046 and with a Pickit 3, and MPLAB 8.92. I compiled it in Release mode
(not debug mode). The Pickit3 was attached to the board the whole time.
The Low Pin Count board has LEDs on pins C0 to C3, so I used some of
the other LEDs too, not just the one on pin C0.
Code: |
#include <16F690.h>
#fuses INTRC_IO,NOWDT, NOMCLR
#use delay(clock=4M)
int pin;
//=========================
void main()
{
int i;
output_c(0); // All leds off
delay_ms(2000);
pin = input(PIN_A3); //Pin_A3 tied to 5V on pwb
output_high(PIN_C0); //visual... works here
delay_ms(1000);
output_low(PIN_C0);
output_bit(PIN_C1, pin); // 'pin' should be 1 or high
if(pin)
{
for(i=0; i < 5; i++) // Blink the LED several times
{
output_high(PIN_C0);
delay_ms(500);
output_low(PIN_C0);
delay_ms(500);
}
}
else
{
output_high(PIN_C2);
}
while(TRUE);
} |
|
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Wed Jun 17, 2015 4:54 pm |
|
|
Man, I am impressed you would do that. I really appreciated it. I copied your code and programmed it into my 16F690 and still same problem, that tells me I need to go to later version of MPLAB and invest in PICKIT 3 and newer CCS. Something changed between then and now in either MPLAB, CCS, and I need not to use the old ICD2. _________________ Randy Principe
Electrical Engineering Technician |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jun 17, 2015 5:32 pm |
|
|
I tested it with PCM vs. 4.050 and it also works. So it's not the compiler. |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Thu Jun 18, 2015 8:57 am |
|
|
That's a big help as money is tight. Thanks. _________________ Randy Principe
Electrical Engineering Technician |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
16F690 PortA as digital inputs |
Posted: Tue Jun 23, 2015 10:17 pm |
|
|
Inching closer. Thanks for the tip about using a Pickit 3 instead of a 2, and upgrading to MPLAB 8.92. I immediately was able to use RA0...RA3 as digital inputs. Been working on RA4 and RA5. I learned several things affect those two, especially the oscillator mode. I am now using the HFINTOSC. The datasheet specifically says that mode leaves RA4 and RA5 as digital inputs. I have resorted to configuring the various registers with assembly using the #ASM and #ENDASM commands. Here is what I have but RA4 and RA5 are not acting as digital inputs. I started off using an example from the datasheet on page 47. Any suggestions? Sorry if I over-commented.
Code: |
#asm
BCF STATUS,RP0; //Change to Bank 0
BCF STATUS,RP1; // " " " "
CLRF PORTA; //Init PORTA
CLRF 0x0B; //Setup Interupt Ctrl Reg
BCF 0x103,RP0; //Change to Bank 2
BSF 0x103,RP1; //Change to Bank 2
MOVLW 0xFF; //Mov 1111 1111 into W register
MOVWF 0x115; //Disable PORTB pullups
CLRF ANSEL; //Setup ANSEL Reg, PORTA = Digital I/O
CLRF ANSELH; //Setup ANSEL Reg, PORTB,C = Digital I/O
MOVLW 0x00; //Mov 0000 0000 into W register
MOVWF 0x116; //Disable PORTA Interupt On Change1
BSF 0x83,RP0; //Change to Bank 1
BCF 0x83,RP1; //Change to Bank 1
CLRF ADCON0; //Disable A/D Conversion
CLRF 0x8C; //Setup Peripheral Interupt Enable Reg1
CLRF 0x8D; //Setup Peripheral Interupt Enable Reg2
MOVLW 0x0F; //Mov 0000 1111 into W register
MOVWF 0x8E; //Setup Power Ctrl Reg
MOVLW 0xE7; //Mov 1110 0111 into W register
MOVWF 0x8F; //Internal Clock, HFINTOSC, - RA4&5 = I/0
MOVLW 0x00; //Mov 0000 0000 into W register
MOVWF 0x96; //Disable PORTA Interupt On Change1
MOVLW 0x37; //Mov 0011 0111 into W register
MOVWF 0x95; //Disable PORTA pullups
MOVLW 0x99; //Mov 1000 1000 into W register
MOVWF 0x81; //Setup OPTION REG
MOVLW 0xFF; //Mov 1111 1111 into W register
MOVWF 0x85; //Set PORTA pins to input
MOVLW 0x00; //Mov 0000 0000 into W register
MOVWF 0x86; //Set PORTB pins to output
MOVLW 0x00; //Mov 0000 0000 into W register
MOVWF 0x87; //Set PORTC pins to output
BCF 0x03,RP0; //Change to Bank 0
BCF 0x03,RP1; // " " " "
#endasm |
_________________ Randy Principe
Electrical Engineering Technician |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jun 24, 2015 11:15 am |
|
|
Quote: | MOVLW 0xE7; //Mov 1110 0111 into W register
MOVWF 0x8F; //Internal Clock, HFINTOSC, - RA4&5 = I/0 |
Not true. The i/o status of those pins is controlled by fuse settings,
either INTRC or INTRC_IO. Use the following line to configure those
pins as i/o:
Your ASM code is not necessary. Most of the things you are doing
are already handled by the hardware or the compiler:
1. On power-on reset, the PIC sets registers to their initial state.
See this table in the 16F690 data sheet. Look at the POR, BOR column:
Quote: | TABLE 2-1: PIC16F631/677/685/687/689/690 SPECIAL FUNCTION REGISTERS SUMMARY BANK 0 |
2. Start-up code is inserted by the compiler at the beginning of main().
This code initializes certain registers. You can see this code by looking at
the .LST file.
For the initializations that are not done by the two methods above, you
can use CCS functions to achieve them in most cases. In the remaining
cases, you can use #byte statements to define the register addresses
and then set the named registers to your init values in main(). Your ASM
code should not be used in a "true" CCS program. |
|
|
RandyP
Joined: 15 Jun 2015 Posts: 16 Location: Dallas, TX
|
|
Posted: Wed Jun 24, 2015 1:01 pm |
|
|
Yes, I see on page 38 I read the last line of the INTOSCCIO (which lets the OSC1 & OSC2 pins - RA4,RA5 available for I/O) I thought I read that under the next heading HFINTOSC. No wonder I could not get them to work. The reason for all the assembly was to try and find the register that was not letting me use RA4/5 as inputs. I will try your suggestions. Thanks. _________________ Randy Principe
Electrical Engineering Technician |
|
|
|
|
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
|