|
|
View previous topic :: View next topic |
Author |
Message |
Max
Joined: 15 Dec 2003 Posts: 51 Location: Italy
|
Again RA4 |
Posted: Thu Apr 22, 2004 1:50 am |
|
|
use PIC16LF628A VDD 3V.
RA0,RA1,RA2,RA3,RA4.RA7 through R 220 ohm and led is connected
at VDD
RAx -------R 220ohm ------ LED ------- VDD
RA4 it creates problems, led remains always on (ra4 is 0)
the PIC16LF628A it is not broken, tried others
#use FAST_IO(A)
#use FAST_IO(B)
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte TRISA = 0x85
#byte TRISB = 0X86
#define LED5 PORTA,0
#define LED4 PORTA,1
#define LED3 PORTA,2
#define LED2 PORTA,3
#define LED1 PORTA,4
#define LED6 PORTA,7
set_tris_B(0b11111111);
set_tris_A(0b00000000);
bit_set(LED1);
bit_set(LED2);
bit_set(LED3);
bit_set(LED4);
bit_set(LED5);
bit_set(LED6);
while (TRUE)
{
bit_clear(LED1); // is connected RA4
...................... // waith press button
bit_set(LED1); // not OFF ????????????????? Help my
bit_clear(LED2);
...................... // waith press button
.......................
....................
bit_set(LED6);
}
Thanks |
|
|
Ttelmah Guest
|
Re: Again RA4 |
Posted: Thu Apr 22, 2004 2:33 am |
|
|
Max wrote: | use PIC16LF628A VDD 3V.
RA0,RA1,RA2,RA3,RA4.RA7 through R 220 ohm and led is connected
at VDD
RAx -------R 220ohm ------ LED ------- VDD
RA4 it creates problems, led remains always on (ra4 is 0)
the PIC16LF628A it is not broken, tried others
#use FAST_IO(A)
#use FAST_IO(B)
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte TRISA = 0x85
#byte TRISB = 0X86
#define LED5 PORTA,0
#define LED4 PORTA,1
#define LED3 PORTA,2
#define LED2 PORTA,3
#define LED1 PORTA,4
#define LED6 PORTA,7
set_tris_B(0b11111111);
set_tris_A(0b00000000);
bit_set(LED1);
bit_set(LED2);
bit_set(LED3);
bit_set(LED4);
bit_set(LED5);
bit_set(LED6);
while (TRUE)
{
bit_clear(LED1); // is connected RA4
...................... // waith press button
bit_set(LED1); // not OFF ????????????????? Help my
bit_clear(LED2);
...................... // waith press button
.......................
....................
bit_set(LED6);
}
Thanks |
Your code does not show what your problem is...
In two successive lines, you clear the LED, and then set it on again. You will never see an 'off' that it this short.
However I'd expect that your problem is at heart the 'read modify write' problem associated with ports. RA4, is different from the rest of the port a pins, in two ways. First, it is an 'open collector' (pull down only) output, but it also has Schmidt trigger input levels. Now it is important to understand, that when you do a bit 'clear' or set on an output port, you do _not_ just access this bit. In fact the processor, reads the whole port, modifies the specified bit, and then writes the result back to the output. So when you 'bit_clear' RA4, the status of the other pins, becomes the value read' from them. If you code as (for instance):
bit_clear(LED4);
bit_set(LED2);
Then the whole port is read, and bit four is cleared. This value is then written to the port, and the port read again, and bit 2 is set. If at this instant in time, RA4, _has not yet reached the 'low' value_, the 'read' will return it a 'high', and this is the value written back to the register.
The same applies in the other direction (setting the bit).
Since the physical 'write' takes place at the 'end' of the first instruction, while the 'read' takes place at the start of the second, it does not take much load to prevent the signal from having reached it's selected level.
Hence it is allways better to code in one of two ways. Either save a byte that you call 'port_b_output', and set/clear the bits on this, then write the whole byte in one I/O operation, or code as:
bit_clear(LED4);
delay_us(1);
bit_set(LED2);
with the time delay made long enough to allow the pin to reach the level.
Now the problem in the case of RA4 however is made worse when 'setting', because you don't have an adequate 'pull up', and the pin will never reliably reach the 'high' level!.
The reason is that the 'high' input threshold on a Schmidt input, is 0.8Vdd. So the pin needs to be pulled up to 2.4v, to 'read' as being high.
Unfortunately, the voltage drop associated with the LED, is enough to ensure this will probably never happen. So wire as:
RA4----+---220R-----LED----+----Vdd
+---------10KR-------+
This then ensures that the pin will actually pull up to the high level when turned off. The other inputs only have to pull up to 1.55v, to be seen as 'high', and are not dependant on the resistor to actually pull them up. The switching speed of the driver transistors is fast enough that you are not seeing the problem on the other pins.
Do a search on the MicroChip website, on the words 'Read Modify Write', you will find a lot of notes about this.
Best Wishes |
|
|
Max
Joined: 15 Dec 2003 Posts: 51 Location: Italy
|
|
Posted: Thu Apr 22, 2004 3:35 am |
|
|
Thanks for your fast reply.
I don't think that the problem is on 'Read Modify Write' becose I've insert resistor from RA4 and VDD ( 4k7 ) but the led RA4 is always on (RA4=0).
I've put delay in this way :
delay_us(2);
bit_set(LED1);
delay_us(2);
bit_set(LED2);
delay_us(2);
bit_set(LED3);
delay_us(2);
bit_set(LED4);
delay_us(2);
bit_set(LED5);
delay_us(2);
bit_set(LED6);
but LED1 ( Pin RA4) still always on.
Seems to me to put in off comparator with those instruction:
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
but no result....Why?
Probabli is better to abbandon PIN RA4 and take PIN RA6 ....!!!!
Let me know |
|
|
Lorenzo Guest
|
|
Posted: Thu Apr 22, 2004 3:56 am |
|
|
RA4 is an open drain output type and therefore it has a negated logic.
Set_bit(LED1) turn on the led,
clear_bit(LED1) turn off the led.
Good luck |
|
|
Max
Joined: 15 Dec 2003 Posts: 51 Location: Italy
|
|
Posted: Thu Apr 22, 2004 6:27 am |
|
|
It is not possible
I have resolved in this way
bit_clear(TRISLED1); // ra4 is output
bit_clear(LED1); // led is on
bit_set(LED1);
bit_set(TRISLED1); // led is off ra4 is input
all ok, it works !!
@lorenzo: sei italiano ? |
|
|
ericzuki
Joined: 24 Feb 2004 Posts: 3
|
Enquiries |
Posted: Wed Apr 28, 2004 10:33 am |
|
|
Can i check with you. Did you put a pull up resistor on RA4 in order to solve the problem or just by adding the following command
bit_clear(TRISLED1); // ra4 is output
bit_clear(LED1); // led is on
bit_set(LED1);
bit_set(TRISLED1); // led is off ra4 is input |
|
|
Max
Joined: 15 Dec 2003 Posts: 51 Location: Italy
|
|
Posted: Wed Apr 28, 2004 2:01 pm |
|
|
schematic never changed:
RA4 +-------+R 220ohm +------+ LED +-------+ VDD |
|
|
|
|
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
|