PDA

View Full Version : A rant about port configurations



tekart
- 20th October 2011, 12:17
I have a pet peeve about how Microchip writes their datasheets.

I don't know about most folks, but the first thing that I need to know when I'm getting to know a new chip is what the default configurations are for the ports. Most of the time I don't need half the special features that come with the chip, I just need sufficient memory and lots of digital I/O. So I have to wade through hundreds of pages to try and figure out what the default configuration is for each port so I can disable the features that just get in the way of using the port for simple digital I/O.

Why the heck can't they put a simple page in every spec sheet that lists what the POR config is per port? It would look something like this:

PortA:
All pins digital I/O
PortB:
All pins digital I/O with pull-ups enabled
PortC:
These special features are enabled....

Is it just me, or does anyone else struggle with this issue?

Charles Linquis
- 20th October 2011, 13:42
I'm with you on this one. Every time I get a new chip I type in every register name (usually about a hundred), and look at each bit. I generally I wind up configuring all 800 bits, because I don't look at the POR defaults much, I just set them the way I need them. The whole process takes 4-5 hours, and is getting worse with some of the new "J" and "K" series parts. One upside - I learn a lot about the new part.

cncmachineguy
- 20th October 2011, 14:57
I know I may ba a little wierd, but I like reading them. Admitedly I don't read the parts I never use, like ethernet and such. I usually zoom straight for the osc section after looking at the pinout section. From there I will read the example for each port I/O it usually tells me what needs setup to make it work. I like the charts that show each pin and what it can do, this way I know where to look to see if I need to set stuff.

I HATE writing headers for the initial set up, hence my wish list item for a header wizard. I think it could knock your 4-5 hours down to 10 mins.

Charles Linquis
- 20th October 2011, 15:12
It should be possible for uChip or someone else to write such a wizard - maybe they already have. If I was really good at some 'useful' language like Java, I might try it myself. As it is, I'm going to have to wait for someone smarter than me to do it.

cncmachineguy
- 20th October 2011, 15:15
I am on that list with you. But I don't agree with the useful part. You already know the most useful language - PBP. The rest can only make pretty pictures and parse text. :)

Darrel Taylor
- 20th October 2011, 16:59
I highly dislike the method of trying to initialize ALL the registers at the top of your program.
Unless you know EVERYTHING about that chip, many of them get initialized incorrectly.
This had led to more problems than any other issue.

With the exception of comparators on the older chips ... Everything is turned OFF at power-up.

All you have to do is turn ON the things you want to use.
Don't try to turn everything off, they already are.

Now the first thing people will say is ...
Then why do I have to turn off analog pins with ADCON1 or ANSELx?

It's because you aren't turning the Analog functions OFF, you are turning the Digital Inputs ON.
Analog inputs are always ON, even when the Digital Input is enabled.

So just concentrate on what you want the chip to do, not what you don't want it to do.

tekart
- 20th October 2011, 17:59
Wise words Darrell. I will keep that in mind.

But I still think it would be nice if Microchip could add a simple chart showing the port defaults to their data sheets. It's the difference between implicit information and being explicit which is what the spec shhe should be all about

Darrel Taylor
- 20th October 2011, 18:09
That information is already in the datasheet.
For the 16F916 you are using, look at Table 2-1 (page 17)
It has the POR/BOR and "Other" reset defaults for every register.

tekart
- 20th October 2011, 18:16
Yeah, but that table does not explicitly state the POR for each pin. It just lists what each pin CAN DO, not what it wakes up to without tweaking registers.
I want a clear explicit list of the defaults, it would sure make my life simpler!

Darrel Taylor
- 20th October 2011, 18:29
The two columns on the right of that table show the Power-On state of every bit in every register.

The registers control the peripherals.
The peripherals are multiplexed with the Pins.
The peripherals are all OFF (except for comparators).
The pins are tri-stated (OFF).

What else do you need?

tekart
- 20th October 2011, 18:56
I guess what I want is something more readable and less abstract. Sure that chart contains the info - but not in a very user friendly format. Maybe you (and others) find that chart fills your needs, it just does not work for me. But I will make a point of trying to study this chart in future.

cncmachineguy
- 20th October 2011, 18:57
So my header wizard should only flip the bits needed that are not correct on POR. Got it. Then will you like it?

cncmachineguy
- 20th October 2011, 19:04
Tekart, I by no means ment to hinder your rant, ranting is fun sometimes. I do find it kinda funny that this thread shows very clearly what my wife has been saying for years - I don't need you to solve the problem, just listen to it!!

So here you started ranting for what was clearly something very annoing for you, Charles jumped in with how he hate it, and how he deals with it. I threw in my 2 cents, but with more advice on how I deal with it. Then Darrel comes along and points out where the information you seek is located on the DS.

I shudder to suggest this, but I can ALMOST see my wifes point (not admiting she ever has one mind you)

Charles Linquis
- 20th October 2011, 19:20
Darrel, I see that you "highly dislike" my method. That's OK. My code still runs.

It takes up code space, but I don't mess with chips with 1K of FLASH.
I start out with a large list and eliminate lines as I need until I get it down to just what I need in the end. By the time I have used a chip 4-5 times, I'm left with 10 lines of configs or so. In the meantime, I have learned a lot about what the chip can do.

tekart
- 20th October 2011, 20:30
Charles,
I see Darrel's point. But in my case if I were to use your "shotgun" approach I would worry about accidentally setting up conflicting registers. In fact I just did that today. I thought I had set a port to all digital I/O by disabling comparators AND configuring the A/D properly, but I accidentally set a bit that I did not need to in the ADCON0 register and it took me an hour to see my error.

cncmachineguy,
Listening to the question is good, as is reading answers from Darrell.

My wife and I have an agreement "I am always right - unless she's right"! :) What would we do with out our wives? ;)

Charles Linquis
- 20th October 2011, 20:52
If I set up conflicting registers, my code doesn't run and I go back and fix them like I would anything else. I have had mysterious problems from time to time that were traced to the fact that I SHOULD have set a register, but didn't. Once everything is working,
I carefully start removing the setups in small groups, all the while noting what the defaults are. If everything keeps on working, I
can remove more at my pace. If not, I go back and see why. I use only about 4 chips. None of my headers contains more than about 10 lines of setup - now.

cncmachineguy
- 20th October 2011, 22:14
My wife and I have an agreement "I am always right - unless she's right"!

My approach is a little different:
She is always right, and I am always happy. It took me many years to realize the reason men work is to be right sometimes. At home - just happy :)

HankMcSpank
- 20th October 2011, 23:03
I really like Darrel's idea...at least with everything off, you know that you have to turn whatever you need on! (whereas at the minute even the stuff you want to turn on, might conflict with something else that's already turned on!)

Over time (& with starting to get a grip of this stuff), I find myself turning most stuff off at the top of my program anyway.

Would it be quick (or even possible) to do a 'switch off everything' header?

tekart
- 21st October 2011, 00:51
Would it be quick (or even possible) to do a 'switch off everything' header?

Cool! I LIKE that. Darrell - does that sound feasible? Is it "just code"? I would totally value a header that disables ALL peripherals so I could knowingly start from a clean slate.

Darrel Taylor
- 21st October 2011, 02:51
That's the point!
Everything is already OFF.

Except the comparators on old chips, which can be turned off easily with ...
INCLUDE "AllDigital.pbp"
But that also enables all Digital Inputs, so technically everything's not OFF anymore.

Some REALLY OLD 12-bit chips made the T0CKI pin unable to control the TRIS bit while TMR0 was "OFF".
So that's about the extent of the "Turn it all off" header wizard.

; if chip has a 12-bit core
OPTION_REG.5 = 0 ; Free TRISIO.2 bit

But then again, you're really turning something ON (TMR0).

Don't worry about turning things OFF.
Turn stuff ON if you want to use it.

tekart
- 21st October 2011, 19:16
Thanks for that Darrell. Thing is I only need to learn a new PIC every 12-18 months, so I tend to forget how to set them up. I had really never seen it as "everything is already OFF". As I blunder around a new spec sheet I get distracted by all the registers and features and tend to lose sight of the basics.
Sometimes it takes someone like you to make the obvious clear. ;) Like Charles, I tend to start off in shotgun mode and try setting all the registers. I see now that I have to think of the PIC as a blank slate (except for the comparators).

I guess I should re-word my rant to: "Why the heck do PIC chips all come with the blasted comparators enabled by default!" That has always tripped me up in the past. I don't see the reasoning behind it personally. Never used the comparator feature in all my years of PICing (15 and counting). But then I'm a simple soul... ;)

kenif
- 25th October 2011, 06:48
Great timing as this exact problem has just consumed about 5 hours and I seem to hit a similar brick wall with every new PIC.

18F27J53 ~ outputs OK, inputs always read 0.
I know what the problem is, just can't fix it. Is there something else besides ADCON that needs setting?

Datasheet: ADON: A/D On bit 1 = A/D Converter module is enabled 0 = A/D Converter module is disabled
Tried ADCON0 = $0F, ADCON0 = %00000000 and all the individual bits such as ADCON0.0 = 0.

Instead of a rant at Microchip, this should be a programming project or feature request for the IDE.
Heck, if I knew how to set ADCON, I'd program it myself...

HenrikOlsson
- 25th October 2011, 11:00
Hi,
The ADCON register controls the the actual converter, not the input buffers of the pins. For the 27J53, check the ANCON0 and ANCON1 registers, page 371 in the datasheet (http://ww1.microchip.com/downloads/en/DeviceDoc/39964B.pdf).

The ANCON0 and ANCON1 registers are used to configure the operation of the I/O pin associated with each analog channel. Setting any one of the PCFG bits configures the corresponding pin to operate as a digital
only I/O. Clearing a bit configures the pin to operate as an analog input for either the A/D Converter or the comparator module. All digital peripherals are disabled and digital inputs read as ‘0’. As a rule, I/O pins that are multiplexed with analog inputs default to analog operation on device Resets.

Looking up ANCON0 and ANCON1 in table 5.1 (page 76) shows that they default to all zeros at POR meaning that when the chip powers up all analog pins are analog.

/Henrik.

kenif
- 25th October 2011, 15:48
Thanks, Henrik, that did it.
I'll be back on this project in a couple of days and you saved a lot of brain hurt.
Ken