Wednesday 7 May 2014

pic - What causes turning ON a single output pin on Microchip PIC16F690 to spontaneously turn OFF another pin on the same port?


What causes turning ON a single output pin on Microchip PIC16F690 to spontaneously turn OFF another pin on the same port? I can work around this problem by writing a byte to the entire port, controlling all pins simultaneously, instead of just a bit to control the pin state. I'm using the Hi-Tech C compiler here. I am determining the state of the pin with 9 LEDs each consuming 3 mA. This is way below the max power specs.


The mplab header file has the 0 pin on port A declared as such:



volatile       bit RA0  @ ((unsigned)&PORTA*8)+0;

I am turning the pin on by writing a high value to it.


RA0 = 1;

Is the problem that the complier is treating the "1" as a byte and writing to the whole port? Do I need to cast it? If so, shouldn't have the complier given me an error?


RA0 = (bit) 1;

If I write to the whole port everything works as expected:


PORTA = 0b00000001;


Answer



It's the well-known read-modify-write problem, you will find details in the data sheet. You have to write to the whole register, as you have found. The 18F and 16-bit devices don't have the problem. There is a good description on page 2 in this document. Changing bits in a "shadow" register then writing the register to the output port is often used to get round the problem.


No comments:

Post a Comment

arduino - Can I use TI's cc2541 BLE as micro controller to perform operations/ processing instead of ATmega328P AU to save cost?

I am using arduino pro mini (which contains Atmega328p AU ) along with cc2541(HM-10) to process and transfer data over BLE to smartphone. I...