View previous topic :: View next topic |
Author |
Message |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 29, 2005 12:45 pm |
|
|
Here's a revised function which works better. It now sets the TRIS.
Also you don't need the switch-case statement shown in the previous
code. Just give this function the CCS pin value and the state, and
it handles everything.
Code: |
// do_pin_io() --
// This function will perform an i/o action on a CCS pin.
// The ccs_pin parameter must be a value defined in the .H
// file for your PIC, such as PIN_B0, PIN_C5, etc.
// The CCS pin value and state can be passed in variables.
//
// The action must be as follows:
// Action = 0: Set the specified pin = 0
// Action = 1: Set the specified pin = 1
// Action = 2: Read the specified pin and return
// its value (0 or 1).
// Any action value > 2 will be treated as 2. For actions
// 0 and 1, the return value has no meaning (but 0 is
// returned).
// This function only works for the 16F series PICs, in
// which the i/o ports are at addreses 5 to 9, and the
// corresponding TRIS registers are known to be at
// 0x85 to 0x89, respectively.
int8 do_pin_io(int8 ccs_pin, int8 action)
{
int8 io_port;
int8 bitmask;
int8 retval;
int8 const bitmask_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
retval = 0;
io_port = ccs_pin >> 3; // Get the i/o port address
bitmask = bitmask_table[ccs_pin & 7];
if(action < 2) // Is this an output action ?
{
*(io_port | 0x80) &= ~bitmask; // Set TRIS = output
if(action)
{
*io_port |= bitmask; // Set pin = 1
}
else
{
*io_port &= ~bitmask; // Set pin = 0
}
}
else // If not, we will read the pin (action = 2)
{
*(io_port | 0x80) |= bitmask; // Set TRIS = input
retval = !!(*io_port & bitmask); // Read pin (ret. 0 or 1)
}
return(retval); // This only has meaning if action = 2
}
|
|
|
|
Ringo42
Joined: 07 May 2004 Posts: 263
|
|
Posted: Wed Jan 18, 2006 10:30 pm |
|
|
I need help again, I ported my program over to an 18f452 because I needed the code space but didn't catch the comments about this code only working on 16f parts. Is it possible to modify it so it will work on the 18f series?
Thanks
Ringo _________________ Ringo Davis |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
Ringo42
Joined: 07 May 2004 Posts: 263
|
|
Posted: Thu Jan 19, 2006 7:53 am |
|
|
Thank you very much.
Ringo _________________ Ringo Davis |
|
|
Christophe
Joined: 10 May 2005 Posts: 323 Location: Belgium
|
|
Posted: Thu Jun 01, 2006 5:26 am |
|
|
How can I replace output_float ( PIN_A0)?
is that do_pin_io ( PIN_A0 , 2 )? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 01, 2006 10:21 am |
|
|
Yes, that would set the pin to be an input. |
|
|
Christophe
Joined: 10 May 2005 Posts: 323 Location: Belgium
|
|
Posted: Fri Jun 02, 2006 8:39 am |
|
|
I'm sorry to say, but I think your software is buggy as it does strange things to my program. I am sure the adding of that function is the reason.
The phenomenon I have is that when I use
Code: | //********************** E3 AAN OF UIT SCHAKELEN *****************************//
//Het E3 bord kan aan- of uitgeschakeld worden door de lijn 100uS laag te
//trekken.
void TOGGLE_E3 ()
{
int8 j;
output_low (EXP_ONOFF); // Zet hem uit door laag te trekken
//do_pin_io (EXP_ONOFF, 0);
delay_ms (1000);
//do_pin_io (EXP_ONOFF, 1);
output_high (EXP_ONOFF); // Maak de pin open drain
} |
that function, the Pic is toggling some pins, hard to say what is going wrong. Perhaps the delay function is the problem... strange ..
edit: delay_ms (x) is not the problem. Just seems to be the use of the do_io_pin() function AND when a special thing happens in my program. I think the toggle() function is ok though. If you desire full details, I'll PM you my full program. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 02, 2006 10:51 am |
|
|
1. The do_pin_io program posted in this thread is only intended for
the 16F series PICs, which have the TRIS registers at specific
addresses (PORT register address + 0x80). This program won't
work with a PIC that has the TRIS registers at a different offset.
What PIC are you using ? Are you using an 18F pic ?
2. The do_pin_io program is intended to be used with a variable
as the parameter that holds the CCS pin number. You are
using it with constants. There's no reason to use do_pin_io()
in that case. Just use the CCS pin functions, such as:
output_low()
output_high()
output_float()
3. If you post or PM me a program, don't send me a large program.
Post a very small program that demonstrates the problem, such as
20 lines of code at most. Show your #include statement, and also
the #fuses and #use statements. Show all necessary variable
declarations and #define statements. The program should be
compilable. I should be able to copy and paste it into MPLAB and
click the compile button, and it should compile with no errors. |
|
|
Christophe
Joined: 10 May 2005 Posts: 323 Location: Belgium
|
|
Posted: Tue Jun 06, 2006 3:38 am |
|
|
1. PIC16LF877A
2. Somewhere else in my program, I do use do_pin_io(). That works fine. Only when I receive "SLEE" command and go to function TOGGLE_E3 () an error happens.
3. I'll try to do that. |
|
|
jeeshenlee
Joined: 15 Apr 2011 Posts: 3
|
Reading pin state without changing the direction/tris of pin |
Posted: Fri Apr 15, 2011 11:14 pm |
|
|
Hello,
Thanks for the code snippet. I'm trying to use your code snippet to read the state (like input_state(pin)) without changing the direction of the pin. How to do i modify your code snippet to do so?
Thanks.
Regards,
Jeeshen Lee |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 15, 2011 11:23 pm |
|
|
Why do you need that code ? It's for version 3.xxx of the compiler.
Version 4.xxx can accept a variable to hold the CCS pin value for
the i/o functions. What's your version of the compiler ? |
|
|
jeeshenlee
Joined: 15 Apr 2011 Posts: 3
|
|
Posted: Fri Apr 15, 2011 11:37 pm |
|
|
I'm using PCM 4.088.
Ya, i tried input_state(variable) and it gave me "Expression need to be in constant..." |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Apr 16, 2011 12:43 am |
|
|
Try using the read_bit_var() macro. For the PCM compiler, the variable
parameter must be an int8. For PCH, it must be an int16.
If you have problems, I can't really do anything more about it now.
Maybe later in the weekend. |
|
|
jeeshenlee
Joined: 15 Apr 2011 Posts: 3
|
|
Posted: Sat Apr 16, 2011 1:19 am |
|
|
Alright. Thanks. |
|
|
net_hw
Joined: 17 Oct 2012 Posts: 6
|
trying to use the function do_pin_io( ) some doubts |
Posted: Tue Nov 06, 2012 4:00 am |
|
|
Hello all
I swear that I tried
with based on this examples:
http://www.ccsinfo.com/forum/viewtopic.php?t=48590&highlight=ccspin+pintable+pinn
http://www.ccsinfo.com/forum/viewtopic.php?
t=25591&postdays=0&postorder=asc&start=0
http://www.ccsinfo.com/forum/viewtopic.php?t=25280&start=4
http://www.ccsinfo.com/forum/viewtopic.php?t=27445&highlight=ccspin+pintable+pinn
https://www.ccsinfo.com/forum/viewtopic.php?t=222
http://www.ccsinfo.com/forum/viewtopic.php?t=25280&highlight=ccspin+pintable+pinn
transpose to my job function
but as I'm using a 16F628
and I can not success
Code: | //----------------------------------------------------------------
#include <16f628.h>
#fuses HS,INTRC_IO, NOLVP, NOWDT, PUT
#use delay (clock=4000000)
#define .... bla bla bla....
//int8 pin_table[6] = {PIN_A2,PIN_A3,PIN_B0,PIN_B1,PIN_B2,PIN_B3}; //my inputs
int8 leds[6] = {PIN_A1,PIN_A0,PIN_B7,PIN_B6,PIN_B5,PIN_B4}; //my outputs
// ...do_pin_io( ) as http://www.ccsinfo.com/forum/viewtopic.php?t=25280&start=4
int myfunction_teste(int8 pinn) {
int8 ccs_pin;
ccs_pin = leds[pinn];
do_pin_io(ccs_pin,0);
delay_ms(500);
do_pin_io(ccs_pin,1);
return 1; }
void main () {
int8 pX;
for(pX=0;pX<6;pX++) { myfunction_teste(pX); }
}
//-------------------------------------------------------------
| PCWHD Compiler
IDE PCB PCM PCH PCD v 4.114
//-------------------------------------------------------------
in proteus simulation
works only with the first 2 pins of array
thank you for any help
[]´s hw _________________ []´s
hw |
|
|
|