Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

step by step guide

Status
Not open for further replies.

Thunderchild

New Member
Ok I know I'll get a boloking for the stupid question but i have to ask it.

I can understand the instruction set of pics what I can never get my head around is writing the whole program.

now from what I underdtand you need to define certain prameters and then put in the instructions. I find plenty of information on writing the program but nothing about setting the pic up to run the program.

is there a step by step guide to setting up the pic according to the pheripherals that will be used.

also I see (for example in nigels tutorial) a reference to an *.inc file what exactly us this.
 
This is the contents of 16F628.inc

its rather double dutch to me:



LIST
; P16F628.INC Standard Header File, Version 1.01 Microchip Technology, Inc.
NOLIST

; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F628 microcontroller. These names are taken to match
; the data sheets as closely as possible.

; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:

; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F628
; 2. LIST directive in the source file
; LIST P=PIC16F628
; 3. Processor Type entry in the MPASM full-screen interface

;==========================================================================
;
; Revision History
;
;==========================================================================

;Rev: Date: Reason:
;1.01 13 Sept 2001 Added _DATA_CP_ON and _DATA_CP_OFF
;1.00 10 Feb 1999 Initial Release

;==========================================================================
;
; Verify Processor
;
;==========================================================================

IFNDEF __16F628
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF

;==========================================================================
;
; Register Definitions
;
;==========================================================================

W EQU H'0000'
F EQU H'0001'

;----- Register Files------------------------------------------------------

INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
PCLATH EQU H'000A'
INTCON EQU H'000B'
PIR1 EQU H'000C'
TMR1L EQU H'000E'
TMR1H EQU H'000F'
T1CON EQU H'0010'
TMR2 EQU H'0011'
T2CON EQU H'0012'
CCPR1L EQU H'0015'
CCPR1H EQU H'0016'
CCP1CON EQU H'0017'
RCSTA EQU H'0018'
TXREG EQU H'0019'
RCREG EQU H'001A'
CMCON EQU H'001F'

OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
PIE1 EQU H'008C'
PCON EQU H'008E'
PR2 EQU H'0092'
TXSTA EQU H'0098'
SPBRG EQU H'0099'
EEDATA EQU H'009A'
EEADR EQU H'009B'
EECON1 EQU H'009C'
EECON2 EQU H'009D'
VRCON EQU H'009F'

;----- STATUS Bits --------------------------------------------------------

IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'

;----- INTCON Bits --------------------------------------------------------

GIE EQU H'0007'
PEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'

;----- PIR1 Bits ----------------------------------------------------------

EEIF EQU H'0007'
CMIF EQU H'0006'
RCIF EQU H'0005'
TXIF EQU H'0004'
CCP1IF EQU H'0002'
TMR2IF EQU H'0001'
TMR1IF EQU H'0000'

;----- T1CON Bits ---------------------------------------------------------
T1CKPS1 EQU H'0005'
T1CKPS0 EQU H'0004'
T1OSCEN EQU H'0003'
NOT_T1SYNC EQU H'0002'
TMR1CS EQU H'0001'
TMR1ON EQU H'0000'

;----- T2CON Bits ---------------------------------------------------------
TOUTPS3 EQU H'0006'
TOUTPS2 EQU H'0005'
TOUTPS1 EQU H'0004'
TOUTPS0 EQU H'0003'
TMR2ON EQU H'0002'
T2CKPS1 EQU H'0001'
T2CKPS0 EQU H'0000'

;----- CCP1CON Bits ---------------------------------------------------------
CCP1X EQU H'0005'
CCP1Y EQU H'0004'
CCP1M3 EQU H'0003'
CCP1M2 EQU H'0002'
CCP1M1 EQU H'0001'
CCP1M0 EQU H'0000'

;----- RCSTA Bits ---------------------------------------------------------
SPEN EQU H'0007'
RX9 EQU H'0006'
SREN EQU H'0005'
CREN EQU H'0004'
ADEN EQU H'0003'
FERR EQU H'0002'
OERR EQU H'0001'
RX9D EQU H'0000'

;----- CMCON Bits ---------------------------------------------------------

C2OUT EQU H'0007'
C1OUT EQU H'0006'
C2INV EQU H'0005'
C1INV EQU H'0004'
CIS EQU H'0003'
CM2 EQU H'0002'
CM1 EQU H'0001'
CM0 EQU H'0000'

;----- OPTION Bits --------------------------------------------------------

NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'

;----- PIE1 Bits ----------------------------------------------------------

EEIE EQU H'0007'
CMIE EQU H'0006'
RCIE EQU H'0005'
TXIE EQU H'0004'
CCP1IE EQU H'0002'
TMR2IE EQU H'0001'
TMR1IE EQU H'0000'

;----- PCON Bits ----------------------------------------------------------

OSCF EQU H'0003'
NOT_POR EQU H'0001'
NOT_BO EQU H'0000'
NOT_BOR EQU H'0000'
NOT_BOD EQU H'0000'

;----- TXSTA Bits ----------------------------------------------------------
CSRC EQU H'0007'
TX9 EQU H'0006'
TXEN EQU H'0005'
SYNC EQU H'0004'
BRGH EQU H'0002'
TRMT EQU H'0001'
TX9D EQU H'0000'

;----- EECON1 Bits ---------------------------------------------------------
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

;----- VRCON Bits ---------------------------------------------------------

VREN EQU H'0007'
VROE EQU H'0006'
VRR EQU H'0005'
VR3 EQU H'0003'
VR2 EQU H'0002'
VR1 EQU H'0001'
VR0 EQU H'0000'

;==========================================================================
;
; RAM Definition
;
;==========================================================================

__MAXRAM H'01FF'
__BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
__BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
__BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
__BADRAM H'185', H'187'-H'189', H'18C'-H'1EF'

;==========================================================================
;
; Configuration Bits
;
;==========================================================================

_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_CP_ALL EQU H'03FF'
_CP_75 EQU H'17FF'
_CP_50 EQU H'2BFF'
_CP_OFF EQU H'3FFF'
_DATA_CP_ON EQU H'3EFF'
_DATA_CP_OFF EQU H'3FFF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_MCLRE_ON EQU H'3FFF'
_MCLRE_OFF EQU H'3FDF'
_ER_OSC_CLKOUT EQU H'3FFF'
_ER_OSC_NOCLKOUT EQU H'3FFE'
_INTRC_OSC_CLKOUT EQU H'3FFD'
_INTRC_OSC_NOCLKOUT EQU H'3FFC'
_EXTCLK_OSC EQU H'3FEF'
_LP_OSC EQU H'3FEC'
_XT_OSC EQU H'3FED'
_HS_OSC EQU H'3FEE'

LIST
 
The .inc file is a handy list of the registers. It is provided by Microchip so that we don't have to write them all out from the data sheet each time we write a program.

It is much easier to use names for registers.

For example:-

Code:
	bsf	0x03, 0x02
	bsf	STATUS, Z

Both those lines do the same thing, but the second is much easier to understand. Also it makes the source code more portable, meaning that it is easier to translate for other processors. In some cases all that needs to be changed is the .inc file, but if the code needs to be translated to very different processors, it is easier to understand that the zero flag is being set, so the equivalent instuction can be used.
 
Thanks for asking, Thunderchild, because I've been working through this stuff myself lately. Anything following a semicolon (";'), is a remark, right? So whenever you see that, you've gotta think, "Ok, this isn't something the program's doing, it's something someone thought they'd write in there to make this all easier for me to understand. So what are they trying to tell me?"

Bear in mind I'm not an expert, just trying to work through it like you. Looking at the first part of the .inc
Code:
LIST
; P16F628.INC Standard Header File, Version 1.01 Microchip Technology, Inc.
NOLIST

; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F628 microcontroller. These names are taken to match
; the data sheets as closely as possible.

; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:

; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F628
; 2. LIST directive in the source file
; LIST P=PIC16F628
; 3. Processor Type entry in the MPASM full-screen interface

;================================================= =========================
I'm not sure what the "LIST.. ...NO LIST" part's suppose to do exactly, so maybe someone else can clarify that. But the rest is all remarks, mostly describing four different ways that the programmer can select the processor. Kind of makes sense that the processor be selected before the include file, so that the compiler can be sure that it's using the appropriate code for the chip being used.

Code:
================================================= =========================
;
; Revision History
;
;================================================= =========================

;Rev: Date: Reason:
;1.01 13 Sept 2001 Added _DATA_CP_ON and _DATA_CP_OFF
;1.00 10 Feb 1999 Initial Release

;================================================= =========================
;
More remarks, this time on revision history. Pretty boring and nothing really to be bothered about - it's not exactly as exciting as the history channel, is it? Remember, as remarks, you could delete all this stuff from any include file, and it would make a difference - but don't! Someone, for some reason, saw some reason to put this stuff in there. You wouldn't want him to lose his job, would you?

Code:
=========================

IFNDEF __16F628
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF

;================================================= =========================
For all my smart remarks, you'd think I'd be able to shed some light on how the stuff that isn't the code remarks works, but I can't. I'm not sure exactly how this "IF" statement works, but it looks like at this point in the .inc file it checks to make sure you did indeed select this particular chip before it goes ahead and does all the rest of the work in the .inc file. If the chip you've selected is different than this .inc file (i.e. the include file you've indicated in your .asm code in MPLAB), the .inc file returns an error at this point.

The rest of the include file is doing as Diver300 stated. It's essentially saying, "When the programmer writes this in assembly code, it equals (equ) this number." It's assistance that enables you to use assembly code that has more apparent meaning than if you had to use the actual numerical equivalents for certain registers. So it keeps you programming in assembly, instead of requiring you to think/program in what is basically hex.

Diver300 said:
Also it makes the source code more portable, meaning that it is easier to translate for other processors.
That's the best reason I can think of for using a .inc file for any given chip. Figuring out the hex equivalent registers for any one chip would be hard enough. Keeping them straight in your head (e.g. which hex values represent which register functions) when you start using more than one chip would be near impossible.
 
Last edited:
I'm not sure what the "LIST.. ...NO LIST" part's suppose to do exactly, so maybe someone else can clarify that.

LIST turns listing output on (i.e. the following source code gets written into the .LST file that the assembler produces).

NOLIST turns listing output off.

Code:
=========================

IFNDEF __16F628
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF

;================================================= =========================
For all my smart remarks, you'd think I'd be able to shed some light on how the stuff that isn't the code remarks works, but I can't. I'm not sure exactly how this "IF" statement works, but it looks like at this point in the .inc file it checks to make sure you did indeed select this particular chip before it goes ahead and does all the rest of the work in the .inc file. If the chip you've selected is different than this .inc file (i.e. the include file you've indicated in your .asm code in MPLAB), the .inc file returns an error at this point.

IFNDEF is a directive. IFNDEF __16F628 is true if __16F628 is defined; it will be defined if that processor is the one that was selected. If IFNDEF is true, the following line is assembled (the MESSG line), otherwise the assembler skips to the matching ELSE or ENDIF which is the next line. The MESSG line writes a message into the listing file.
 
ok so how do I set up the peripherals to my liking ? for example on the 16F88 how do I choose what the ports should be (PWM, ADC, standard) how do I choose the clock speed and clocking method ?
 
ok so how do I set up the peripherals to my liking ? for example on the 16F88 how do I choose what the ports should be (PWM, ADC, standard) how do I choose the clock speed and clocking method ?

You simply set the registers accordingly - you need to consult the datasheet for exact details - the INC file just contains all the text names for the registers and bits you need to use.

Notice it's just a text file containing lines like this:

PORTA EQU H'0005'

This is just a simple text substitution (just like search and replace in a word processor), so when the assembler runs it searches for the text string 'PORTA' and replaces it with H'0005'. Then the code is actually assembled using those numeric values.
 
ah right so basically the inc file is just telling the assembler what I'm talking about when i name a register or port its not about telling the pic what i want the pins to be
 
ok so how do I set up the peripherals to my liking ? for example on the 16F88 how do I choose what the ports should be (PWM, ADC, standard) how do I choose the clock speed and clocking method ?

you dont tell the pic which pins is what ......you select its option for that specific pin. Like look at the pic diagrams. in the datasheet. It will tell you what pin does what.

you control the pins from code. Not what port should be this and that but ... what this and that can do on the port its on.

Hope your not too confused with this post lol :D
 
Last edited:
you dont tell the pic which pins is what ......you select its option for that specific pin. Like look at the pic diagrams. in the datasheet. It will tell you what pin does what.

you control the pins from code. Not what port should be this and that but ... what this and that can do on the port its on.

Hope your not too confused with this post lol :D

To make things even more confusing, with some of the highest spec PICs (24F. dsPIC, and so on) for some pins and functions you can control which functions are on which pins (Peripheral Pin Select).
 
To make things even more confusing, with some of the highest spec PICs (24F. dsPIC, and so on) for some pins and functions you can control which functions are on which pins (Peripheral Pin Select).

in case you forgot the 16F88 does that too thats what I'm on about configuring the ports for what i want the 16F88 has ADC, timer, PWM outputs, and standard TTL logic

thats what i'm trying to say.

so if i get this right at the begining of the program I move a byte (or two) into a few registers which set it up the way I want just like i am writing a byte to any port or register.
 
in case you forgot the 16F88 does that too thats what I'm on about configuring the ports for what i want the 16F88 has ADC, timer, PWM outputs, and standard TTL logic

thats what i'm trying to say.

You misunderstand me.

On the 16F88 18-pin DIP package, as an example, the USART transmit is on pin 11. Pin 11 is also RB5, SS/ (SPI slave select), and CK (USART synchronous clock), so you need to set up the device to say which of those you want pin 11 to be, but if you want the UART TX functionality it is only pin 11 it can be on.

By contrast, as another example, on the 28-pin DIP package for the 24FJ64GA002, USART1 TX can be on mapped on to any of pins 4 to 7, 11, 14 to 18, and 21 to 26. It's another level of complication ...

so if i get this right at the begining of the program I move a byte (or two) into a few registers which set it up the way I want just like i am writing a byte to any port or register.

That's the way I understand it .
 
in case you forgot the 16F88 does that too thats what I'm on about configuring the ports for what i want the 16F88 has ADC, timer, PWM outputs, and standard TTL logic

thats what i'm trying to say.

so if i get this right at the begining of the program I move a byte (or two) into a few registers which set it up the way I want just like i am writing a byte to any port or register.

Yes, check my tutorials for examples.

David James is perhaps confusing you further, by introducing some of the extra facilities on some new top end devices.
 
oh I'm not confused by whats available etc I'm aware that a pic can do a few of many things at one time and as long as you set up the ports to be what you want you can work trouble free not worrying about the unused functions, yes even the 16F88 has more than one pin that can do things like ADC

for example:

PIC microcontrollers : chapter 7 - Examples

the line below the pic model *.inc line is something i never really found explanations for are these what declare the functions of the ports the clock speed the type of clock used etc etc
 
oh I'm not confused by whats available etc I'm aware that a pic can do a few of many things at one time and as long as you set up the ports to be what you want you can work trouble free not worrying about the unused functions, yes even the 16F88 has more than one pin that can do things like ADC

for example:

PIC microcontrollers : chapter 7 - Examples

the line below the pic model *.inc line is something i never really found explanations for are these what declare the functions of the ports the clock speed the type of clock used etc etc

The __CONFIG directive is used to set the configuration fuses, check the datasheet for the possible options, clock type is one of them (xtal, RC etc.).
 
Status
Not open for further replies.

New Articles From Microcontroller Tips

Back
Top