PDA

View Full Version : Help with 18F2520



BertMan
- 6th October 2005, 15:54
Okay, I havent been pic programming that long, but I have been able to write simple programs with my 16f628A that would output data to the serial port of a computer from a pressure sensor and a maxim ADC. I have been working on firmware to for a Vector compass module using a pic and the code comes out to be around 15k, so I had to upgrade to a larger pic. I chose the 18f2520 with 16k.

Anyways, the problem I am having is I can get this pic to communicate to a uart host (serial port on a computer). I scraped the 15k of code and just came up with some test code that would output a simple text string over and over, and check the results in hyperterminal. Same thing. Just a bunch of characters on the screen that look like $. I know that the pic is making an effert to communicate, but something is slightly off like timing.

Here is my setup:
18f2520 with connections only to power, ground and the asyncronous output. My config bits are setup to use the internal oscillator at 8mhz, and MCLR disabled. I have defined debug to use 9600, and setup hyperterminal to use the same. My code looks something like this:

define DEBUG_REG PORTA
define DEBUG_BIT 1
define DEBUG_BAUD 9600
define DEBUG_MODE 1
define DEBUG_PACING 1000
define OSC = 8

:Main
Debug "The program is working"
Goto Main

Any suggestions?

CocaColaKid
- 6th October 2005, 16:03
You probably need to configure the A/D on PORTA.1 to a digital instead of analog.

BertMan
- 6th October 2005, 17:12
From the datasheet:

Pin Name: Pin Type: BufferType: Description:
RA1 I/O TTL Digital I/O
AN1 I Analog Analog

Praytell kind sir, how'st thou'st do'st that?

mister_e
- 6th October 2005, 17:39
datasheet, a/d converter section ADCON, ANSEL, CMCON etc etc

CocaColaKid
- 6th October 2005, 17:44
ADCON0 = %00000000 ' Turn off A/D converter
ADCON1 = %00001110 ' Make PORTA.0 & PORTA.1 analog, others digital


I believe this will do it. If I'm incorrect someone please let me know.

mister_e
- 6th October 2005, 17:54
No or partially... you forget the internal comparator, but Ra1 will be digital in deed if the comparator is turn off... not AN0

CMCON and ADCON1 only to disable all analog stuff, use ADCON0 only if you want to play really safe.

Not much... you'll discover everything in the... datasheet. it's free to download and really usefull ;)
http://ww1.microchip.com/downloads/en/DeviceDoc/39631a.pdf

BertMan
- 6th October 2005, 21:02
Thanks for the replies. I didnt have to do this with the 628A, so I just expected it to work on the 18f2520 (which is 32k code not 16k..oops). I have been reading the datasheet for a week now and it has info on ADCON, ANSEL, CMCON, etc, but not how and where to use it. Nothing in the Picbasic help about it either.

So to change these registers, I need to identify them and add them to the top of my pic basic code like TRIS? Can I do this with any register I want to alter? Or is there only a few that Picbasic recognizes?

CocaColaKid
- 6th October 2005, 21:13
I believe PBP will allow you to change virtually any register that is applicable for the MCU you've chosen.

BertMan
- 6th October 2005, 21:16
Thanks for all your help Cokehead and Mr E! I will give this a try this evening and let you know what happens.

BertMan
- 7th October 2005, 01:03
Hmm... Same thing. I put this at the top: ADCON1 = %00001111
CMCON = %00000111 and same character over and over. Could it be possible that I need to use a line driver?

Darrel Taylor
- 7th October 2005, 01:24
<bgsound src="http://www.darreltaylor.com/files/woohoo2.wav" loop="false">BertMan,

It may have just been a typo, but in your first post you had this line ...

define OSC = 8

It shouldn't have an equal sign in there, and PBP won't complain if it's wrong. But it may be thinking it's running at a different frequency.
<br>

BertMan
- 7th October 2005, 01:37
Just for grins I adjusted the baud rate in hyperterminal to see if I could get any different results, and found something very interesting. At 300 baud it works! I set the baud rate to 2400 as it is defined in pbp, and nothing.

BertMan
- 7th October 2005, 01:38
Thanks Darrel, it was a typo.

CocaColaKid
- 7th October 2005, 02:22
One more thing, use uppercase for your DEFINE statements.

BertMan
- 7th October 2005, 03:30
Figured it out! The 4x clock multiplier is enabled by default. This means I was running at 32mhz instead of 8mhz. Had to set both of these to get the oscillator to perform the way I needed it to:

OSCTUNE = %00000000
OSCCON = %11110000

This would explain running at 300baud when I selected 2400.