0% found this document useful (0 votes)
5 views44 pages

Thiet Ke He Thong Nhung Truong Quang Vinh Esd Ch5 New (Cuuduongthancong - Com)

Uploaded by

Quang Nguyen
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views44 pages

Thiet Ke He Thong Nhung Truong Quang Vinh Esd Ch5 New (Cuuduongthancong - Com)

Uploaded by

Quang Nguyen
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 44

10/24/2014

ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH


TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN-ĐIỆN TỬ
BỘ MÔN KỸ THUẬT ĐIỆN TỬ

Embedded System Design

5. Software development for an embedded

om
system

1. Software diagram
1

.c
2. C Programming for PIC
3. Timer and interrupt

ng
co
1
an
th
ng

1. Software diagram
o

• Software diagram is a diagram help software


du

developers and program managers to interpret


software application relationships, actions, and
u

processes.
cu

– Software architecture diagram: describes the high level


structure of a software system
– Program flowchart: demonstrates how a program works
within a system
– Data flow diagram: illustrates the flow of information in a
process
– State machine diagram: presents decision flows of a state
machine

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 2

1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

1. Software diagram
• Draw a software diagram:
– Use a rectangle for a process
– Use a rounded rectangle for a terminator
– Use a diamond shape for a decision
– Use a parallelogram for data
– Use a rectangle with two vertical lines for predefine process

om
N

.c
Y

process terminator decision data predefine process

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 3
an
th
ng

1. Software diagram
o

• Example for software architecture diagram


du

– Show the connections between hardware and software


– Show the connections with other systems
u

– Show
Sh ththe iinterface
t f with
ith users
cu

Examples

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 4

2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

1. Software diagram
• Software block diagram ‐ Example
Program flowchart State machine diagram

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 5
an
th
ng

1. Software diagram
o

• Data flow diagram(DFD)


du
u
cu

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 6

3
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Group discussion
• Discus about below software diagram:
START •Decision block must have
YES/NO branches
•A process block must have 1
Init LCD input and 1 output

Read
temperature T

om
Turn OFF
T>T_đặt?
heater

.c
Turn ON heater

Oven control system


ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 7
an
th
ng

Team work
o

• Draw a software diagram for your class project


du
u
cu

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 8

4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

2. C programming for PIC


• Reference
– Martin Bates, “Programming 8‐bit PIC Microcontrollers in
C”, Newnes,
C Newnes 2008

• Many C compilers for PIC:


– MikroC (www.mikroe.com)

om
– PICC18 (www.htsoft.com)
– MPLAB C18,
C18 C30 (www.microchip.com)
( i hi )

.c
– CCS C (www.microchipc.com/reviews/CCS_C/)

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 9
an
th
ng

Outline
o
du

2.1 PIC16 C Getting Started 2.4 PIC16 C Sequence Control


● Simple program and test circuit ● While loops
● Variables, looping, and decisions ● Break, continue, goto
u

● If, else, switch


● SIREN program 2.5 PIC16 C Functions and Structure
cu

2.2 PIC16 C Program Basics ● Program structure


● Variables ● Functions, arguments
● Looping ● Global and local variables
● Decisions 2.6 PIC16 C Input and Output
● RS232 serial data
2.3 PIC16 C Data Operations ● Serial LCD
● Variable types ● Calculator and keypad
● Floating point numbers 2.7 PIC16 C More Data Types
● Characters ● Arrays and strings
● Assignment operators ● Pointers and indirect addressing
● Enumeration

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 10

5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

2.1 PIC16 C Getting Started


Microcontroller programs contain three main features:
● Sequences of instructions
● Conditional repetition of sequences
● Selection of alternative sequences
Listing 2.1 A program to output a binary code
/* Source code file: OUTNUM.C
Author, date, version: MPB 11-7-07 V1.0

om
Program function: Outputs an 8-bit code
Simulation circuit: OUTBYTE.DSN
*******************************************************/

.c
#include "16F877A.h" // MCU select

void main() // Main block

ng
{
output_D(255); // Switch on outputs
}
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 11
an
th
ng

Figure 2.1 MPLAB IDE Screenshot


o
du
u
cu

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 12

6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Figure 2.2 ISIS dialogue to attach program

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 13
an
th
ng

Setup IO Ports
o

• Port modes
du

– #use fast_io(port): leaves the state of the port the same unless re‐
configured
u

– #use fixed_io(port_outputs=pin,
fixed io(port outputs=pin pin): permanently sets up the data
cu

direction register for the port


– #use standard_io(port): default for configuring the port every time it’s used
• Set directions
– set_tris_a(value);
– value = get_tris_a();

• Read / write IO ports


– value = input_A();
– output_A(value);
– output_high(pin); //set an output to logic 1
– output_low(pin); //set an output to logic 0
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 14

7
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

2.2 PIC16 C Program Basics

PIC16 C Program Basics


● Variables
● Looping
● Decisions

•The purpose of an embedded program is


• to read in data or control inputs,
• to process them and operate the outputs as required.

om
•The program for processing the data usually contains repetitive loops
and conditional branching,
branching which depends on an input or calculated

.c
value.

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 15
an
th
ng

Variables
o

• Variables:
du

– is a label attached to the memory location where the variable value is


stored.
u

– automatically
i ll assigned
i d to theh next available
il bl location
l i or llocations
i (many
(
cu

variable types need more than 1 byte of memory).


– must be declared at the start of the program block, so that the compiler
can allocate a corresponding set of locations.
– Only alphanumeric characters (a–z, A–Z, 0–9) can be used for variable
names
• Variable values
– in decimal by default
– in hexadecimal with the prefix 0x, for example, 0xFF
• By default, the CCS compiler is not case sensitive,

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 16

8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Listing 2.2 Variables

/* Source code file: VARI.C


Author, date, version: MPB 11-7-07 V1.0
Program function: Outputs an 8-bit variable
Simulation circuit: OUTBYTE DSN
OUTBYTE.DSN
*******************************************************/

#include "16F877A.h"

void main()

om
{
int x; // Declare variable and type

.c
x=99; // Assign variable value
output_D(x); // Display the value in binary
}

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 17
an
th
ng

Looping
o

• Most real‐time applications need to execute continuously until the


du

processor is turned off or reset.


• In C this can be implemented as a “ while ” loop, as in Listing 2.3 .
u

/* Source code file: ENDLESS.C


cu

Author, date, version: MPB 11-7-07 V1.0


Program function: Outputs variable count
Simulation circuit: OUTBYTE.DSN
*******************************************************/
#include "16F877A.h”
void main()
{
int x; // Declare variable

while(1) // Loop endlessly


{ output_D(x); // Display value
x++; // Increment value
}
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 18

9
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Decision Making
• The simplest way to illustrate basic decision making is to change an output
depending on the state of an input.
• Figure 2.4 show test circuit with input switch

•The effect of the program


is to switch on the output if

om
the input is high.
•The switch needs to be
closed before running to
see this effect.

.c
•The LED cannot be
switched off again until the
program is restarted.

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 19
an
th
ng

Listing 2.4 IF statement


o
du

/* Source code file: IFIN.C


Author, date, version: MPB 11-7-07 V1.0
Program function: Tests an input
u

Simulation circuit: INBIT.DSN


*******************************************************/
cu

#include "16F877A.h"

void main()
{
int x; // Declare test var.
output_D(0); // Clear all outputs

while(1) // Loop always


{
x = input(PIN_C0); // Get input
if(x==1)output_high(PIN_D0); // Change out
}
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 20

10
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Loop Control
• The program can be simplified by combining the input function
with the condition statement as follows:
– if (input(PIN_C0)) output_high(PIN_D0);
• The conditional sequence can also be selected by a while
condition.
• In Program WHILOOP.C ( Listing 2.5 )
– the input is tested in the loop condition statement and the output flashed on

om
and off while the switch is open (input high).
– If the switch is closed, the flash loop is not executed and the LED is switched off.

.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 21
an
th
ng

Listing 2.5 Conditional loop


o
du

/* Source code file: WHILOOP.C


Author, date, version: MPB 11-7-07 V1.0
Program function: Input controls output loop
Simulation circuit: INBIT.DSN
u

*******************************************************/
cu

#include "16F877A.h"
#use delay (clock=1000000) // MCU clock = 1MHz
void main(){
while(1)
{
while(input(PIN_C0)); // Repeat while switch open
{ output_high(PIN_D0);
d l
delay_ms(300);
(300) // D
Delay
l 0
0.3s
3
output_low(PIN_D0);
delay_ms(500); // Delay 0.5s
}
output_low(PIN_D0); // Switch off LED
}
}
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 22

11
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

FOR Loop
• The WHILE loop repeats until some external event or internally
modified value satisfies the test condition.
• In other cases,, we need a loopp to repeat
p a fixed number of
times.
• The FOR loop uses a loop control variable, which is set to an
initial value and modified for each iteration while a defined
condition is true.

om
• In the demo program FORLOOP.C ( Listing 2.6 ), the loop control
parameters are given within the parentheses that follow the for

.c
keyword.

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 23
an
th
ng

FOR Loop
o
du
u
cu

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 24

12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

SIREN Program
• A program combining some of these basic features is shown in
SIREN.C ( Listing 2.7 ).
• This program outputs to a sounder rather than an LED,LED
operating at a higher frequency.
• The output is generated when the switch is closed (input C0
low).
• The delay picks up the incrementing value of “ step” giving a

om
longer pulse each time the for loop is executed.
• This
hi causes a burst
b off 255 pulses
l off increasing
i i length
l h (reducing
( d i

.c
frequency), repeating while the input is on.
• Note that 255 is the maximum value allowed for “ step, ” as it is

ng
an 8‐bit variable. co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 25
an
th
ng

Listing 2.7 Siren Program


o
du

/* Source code file: SIREN.C


Author, date, version: MPB 11-7-07 V1.0
Program function: Outputs a siren sound
Simulation circuit: INBIT.DSN
u

*******************************************************//
#include "16F877A.h"
cu

#use delay (clock=1000000)


void main()
{
int step;
while(1)
{
while(!input(PIN_C0)) // loop while switch ON
{
for(step=0;step<255;step++) // Loop control
{
output_high(PIN_D0); // Sound sequence
delay_us(step);
output_low(PIN_D0);
delay_us(step);
}
}
}
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 26

13
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Listing 2.8 Program Blank

/* Source Code Filename:


Author/Date/Version:
Program Description:
Hardware/simulation:
************************************************************/

#include "16F877A.h" // Specify PIC MCU


#use // Include library routines

void main() // Start main block

om
{
int // Declare global variables

.c
while(1) // Start control loop
{
// Program statements

ng
}
} // End main block
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 27
an
th
ng

Blank Program
o

• A blank program is shown in Listing 2.8 , which could be used


du

as a general template.
• We should tryy to be consistent in the header comment
u

information, so a standard comment block is suggested.


cu

• Compiler directives are preceded by hash marks and placed


before the main block.
• Other initialization statements should precede the start of the
main control loop. Inclusion of the unconditional loop option
while(1) assumes that the system will run continuously until
reset.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 28

14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Table 2.1 A basic set of CCS C components

Compiler Directives
#include source files Include another source code or header file
#use functions(parameters) Include library functions

C Blocks
main(condition) {statements } Main program block
while(condition) {statements } Conditional loop
if(condition) {statements } Conditional sequence
for(condition) {statements } Preset loop

om
C Functions
delay_ms(nnn) Delay in milliseconds

.c
delay_us(nnn) Delay in microseconds
output_x(n) Output 8-bit code at Port X
output_high(PIN_nn) Set output bit high

ng
output_low(PIN_nn) Set output bit low
input(PIN_nn) Get input
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 29
an
th
ng

2.3 PIC16 C Data Operations


o
du

● Variable types
u

● Floating
Fl ti point i t numbers
b
cu

● Characters
● Assignment operators

A main function of any computer program is to carry out calculations


and other forms of data processing. Data structures are made up of
different types of numerical and character variables, and a range of
arithmetical and logical
g operations
p are needed.

Microcontroller programs do not generally need to process large


volumes of data, but processing speed is often important.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 30

15
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Table 2.1 Integer Variables

Name Type Min Max

int1 1 bit 0 1

unsigned int8 8 bits 0 255

signed int8 8 bits -127 +127

16 bits 0 65525

om
unsigned int16

signed int16 16 bits -32767 +32767

.c
unsigned int32 32 bits 0 4294967295

signed int32 32 bits -2147483647 +2147483647

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 31
an
th
ng

Floating Point Number Format


o

Table 2.2 Microchip/CCS Floating Point Number Format


du

Exponent Sign Mantissa


xxxx xxxx x xxx xxxx xxxx xxxx xxxx xxxx
u

8 bits 1 23 bits
cu

Table 2.4 Example of 32-bit floating point number conversion

FP number: 1000 0011 1101 0010 0000 0000 0000


0000
Mantissa: 101 0010 0000 0000 0000
0000

Exponent: 1000 0011

Sign: 1 = negative number

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

16
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Figure 2.5 Variable Types

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Table 2.5 ASCII Codes


o

Low High Bits


du

Bits 0010 0011 0100 0101 0110 0111


0000 Space 0 @ P ` p
0001 ! 1 A Q a q
u

0010 " 2 B R b r
cu

0011 # 3 C S c s
0100 $ 4 D T d t
0101 % 5 E U e u
0110 & 6 F V f v
0111 ' 7 G W g w
1000 ( 8 H X h x
1001 ) 9 I Y i y
1010 * : J Z j z
1011 + ; K [ k {
1100 , < L \ l |
1101 - = M ] m }
1110 . > N ^ n ~
1111 / ? O _ o Del

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

17
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Table 2.6 Arithmetic and Logical Operations


OPERATION OPERATOR DESCRIPTION SOURCE CODE EXAMPLE RESULT

Single operand
Increment ++ Add one result = num1++; 0000 0000 0000
to integer 0001

Decrement -- Subtract one result = num1--; 1111 1111 1111


from integer 1110

Complement ~ Invert all bits result = ~num1; 0000 0000 1111


of integer 1111

Arithmetic Operation

Add + Integer or result = 0000 1010 0000


Float num1 + num2; + 0000 0011 1101

Subtract - Integer or result = 0000 1010 0000

om
Float num1 - num2; - 0000 0011 0111

Multiply * Integer or result = 0000 1010 0001


Float num1 * num2; * 0000 0011 1110

Divide / Integer
g or result = 0000 1100 0000
Float num1 / num2; / 0000 0011 0100

.c
Logical Operation
Logical AND & Integer result = 1001 0011 0001
Bitwise num1 & num2; & 0111 0001 0001

ng
Logical OR | Integer result = 1001 0011 1111
Bitwise num1 | num2; | 0111 0001 0011

Exclusive OR ^ Integer result = 1001 0011 1110


Bitwise
co
num1 ^ num2; ^ 0111 0001 0010
an
th
ng

Figure 2.6 Variable Operations


o
du
u
cu

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

18
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Table 2.7: Conditional Operators


Operation Symbol EXAMPLE

Equal to == if(a == 0) b=b+5;

Not equal to != if(a != 1) b=b+4;

Greater than > if(a > 2) b=b+3;

Less than < if(a < 3) b=b+2;

om
Greater than or equal to >= if(a >= 4) b=b+1;

L
Less th
than or equall tto <
<= if( <
if(a <= 5) b
b=b+0;
b+0

.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

2.4 PIC16 C Sequence Control


o
du

● While loops
● Break, continue, goto
u

● If,
If else,
else switch
cu

• Conditional branching operations are a basic feature of any


program.
• These must be properly organized so that the program
structure is maintained and confusion avoided.
• The program then is easy to understand and more readily
modified and upgraded.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

19
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

While Loops

The basic while(condition) provides a logical test at the start of


a loop, and the statement block is executed only if the
condition is true. It may, however, be desirable that the loop
bl k b
block be executedt d att lleastt once, particularly
ti l l if th
the ttestt
condition is affected within the loop. This option is provided by
the do..while(condition) syntax. The difference between these
alternatives is illustrated in Figure 2.7 . The WHILE test occurs
before the block and the DO WHILE after.

om
The program DOWHILE shown in Listing 2 2.9
9 includes the

.c
same block of statements contained within both types of loop.
The WHILE block is not executed because the loop control
variable has been set to 0 and is never modified. By contrast, ‘

ng
count ’ is incremented within the DO WHILE loop before being
co
tested, and the loop therefore is executed.
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Figure 2.3.1 Comparison of While and Do..While Loop


o
du
u

Conditio
Statement
cu

n True?
Block

Statement
Block Conditio
n True?

(a) While loop (b) Do..While loop

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

20
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Listing 2.9 DOWHILE.C contains both types of ‘while’ loop


// DOWHILE.C
// Comparison of WHILE and DO WHILE loops
#include "16F877A.H”
main()
{
int outbyte1=0;
int outbyte2=0;
int count;
count=0; // This loop is not
while (count!=0) // executed
{ output_C(outbyte1);

om
outbyte1++;
count--;
}
count=0; // This loop is

.c
do // executed
{ output_C(outbyte2);
outbyte2++;

ng
count--;
} while (count!=0);
while(1){};
}
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Break, Continue, and Goto


o
du

It may sometimes be necessary to break the execution of a loop or


block in the middle of its sequence ( Figure 2.8 ). The block must be
exited in an orderly way,
way and it is useful to have the option of restarting
u

the block (continue) or proceeding to the next one (break).


cu

Occasionally, an unconditional jump may be needed, but this should


be regarded as a last resort, as it tends to threaten the program
stability. It is achieved by assigning a label to the jump destination and
executing a goto..label.

The use of these control statements is illustrated in Listing 2.10 . The


events that trigger break and continue are asynchronous (independent
of the program timing) inputs from external switches, which allows the
counting loop to be quit or restarted at any time.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

21
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Figure 2.8 Break, continue and goto

label

Statement
Block

Continue

om
Goto
Break

.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Listing 2.10 Continue, Break & Goto


o

// CONTINUE.C
du

// Continue, break and goto jumps


#include "16F877A.H"
#use delay(clock=4000000)
u

main()
i ()
cu

{
int outbyte;
again: outbyte=0; // Goto destination
while(1)
{
output_C(outbyte); // Loop operation
delay_ms(10);
outbyte++;
if (!input(PIN_D0)) continue; // Restart loop
if (!input(PIN_D1)) break; // Terminate loop
delay_ms(100);
if (outbyte==100) goto again; // Unconditional jump
}
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Figure 2.9 Comparison of If and If..Else

YES NO
Condition Condition
True? True?
NO
YES

If If Else
block block block

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Figure 2.10 Switch..case branching structure


o
du

Test Variable
u

Value = 1? YES Procedure 1


cu

NO

Value = 2? YES Procedure 2

NO

Value = 3? YES Procedure 3

NO

Value = n? YES Procedure n

NO
Default
Procedure

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Listing 2.11 Comparison of Switch and If..Else control


// SWITCH.C
// Switch and if..else sequence control
// Same result from both sequences
#include "16F877A.h”
void main()
{
int8 inbits;
while(1)
{
inbits = input_D(); // Read input byte
// Switch..case option................................................
switch(inbits) // Test input byte
{
case 1: output_C(1); // Input = 0x01, output = 0x01
break; // Quit block

om
case 2: output_C(3); // Input = 0x02, output = 0x03
break; // Quit block
case 3: output_C(7); // Input = 0x03, output = 0x07
break; // Quit block
default:output_C(0); // If none of these, output = 0x00

.c
}

// If..else option....................................................
if (input(PIN_D0)) output_C(1); // Input RD0 high

ng
if (input(PIN_D1)) output_C(2); // Input RD1 high
if (input(PIN_D0) && input(PIN_D1)) output_C(7); // Both high
else output_C(0); // If none of these, output = 0x00
}
co
}
an
th
ng

Class Assignments
o

1. Write a C function to convert a BCD code to a


du

common‐anode 7‐segment LED code


u

2 Write a C program to read 8‐bit value from Port B


2. B,
cu

then add 5 to them and output the result to Port D.


3. Write a C statement to convert numbers 0 to 9 to
their ASCII hex code.
4. Write a function to detect a button press and
button release with de
de‐bouncing
bouncing ability
5. Write a C program to create a chasing LED effect
with 8 single LEDs at port D.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 48

24
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

2.5 PIC16 C Functions and Structure


● Program structure
● Functions, arguments
● Global and local variables

• The structure of a C program is created using functions ( Figure 2.11 ). This is


a block of code written and executed as a self‐contained process, receiving
the required parameters (data to be processed) from the calling function
and returning results to it. Main() is the primary function in all C programs,

om
within which the rest of the program is constructed.

• When running on a PC, main() is called by the operating system, and control

.c
is returned to the OS when the C program is terminated. In the
microcontroller, main() is simply used to indicate the start of the main

ng
control sequence, and more care needs to be taken in terminating the
program. co
• Normally,
Bộ môn Kỹ Thuật Điện
the Tử - ĐHBKruns in a continuous loop, but if not, the final
program
an
th
ng

Figure 2.11 Hierarchical C program structure


o
du

LEVEL 0 LEVEL 1 LEVEL 2

void fun1()
u

{
statements
cu

...
...
Main() }
{
statements
fun1()
statements
statements
....
.... void fun2(arg) void fun3
.... { {
.... statements statements
statements ... ...
fun2(arg) fun3 ...
statements ... }
} return(val)
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

25
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Basic Functions
• A simple program using a function is shown in FUNC1.C, Listing 2.12 . The
main block is very short, consisting of the function call out() and a while
statement, which provides the wait state at the end of main().
• IIn thi
this case, the
th variables
i bl are d declared
l d before
b f th
the main
i bl
block.
k This
Thi makes
k
them global in scope; that is, they are recognized throughout the whole
program and within all function blocks. The function out() is also defined
before main() , so that, when it is called, the function name is recognized. The
function starts with the keyword void , which indicates that no value is

om
returned by the function. The significance of this is explained shortly.
• The function itself simply increments Port C from 0 to 255. It contains a for
l
loop to
t provide
id a delay,
d l so thatth t the
th output
t t countt iis visible.
i ibl Thi
This iis a simple
i l

.c
alternative to the built‐in delay functions seen in previous examples and is
used here to avoid the inclusion of such functions while we study user‐
defined functions. It simply counts up to a preset value to waste time. The

ng
delay time is controlled by this set value.
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Listing 2.12 Basic function call


o

// FUNC1.C
du

// Function call structure


#include "16F877A.H”
int8 outbyte=1;
u

int16 n;
cu

void out() // Start of function block


{
while (outbyte!=0) // Start loop, quit when output =0
{
output_C(outbyte);// Output code 1 – 0xFF
outbyte++; // Increment output
for(n=1;n<500;n++); // Delay so output is visible
}
}
main()
{
out(); // Function call
while(1); // Wait until reset
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

26
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Global and Local Variables


• Now, assume that we wish to pass a value to the function for local. The
simplest way is to define it as a global variable, which makes it available
throughout the program. In program FUNC2.C, Listing 2.13 , the variable
count,
t h
holding
ldi ththe d
delay
l count, t h
hence th
the d
delay
l ti
time, iis global.
l b l
• If there is no significant restriction on program memory, global variables
may be used. However, microcontrollers, by definition, have limited
memory, so it is desirable to use local variables whenever possible within
the user functions. This is because local variables exist only during function

om
execution, and the locations used for them are freed up on completion of
function call. This can be confirmed by watching the values of C program
variables
i bl whenh theth program is i executed
t d iin simulation
i l ti moded — the
th llocall

.c
ones become undefined once the relevant function block is terminated.
• If only global variables are used and the functions do not return results to

ng
the calling block, they become procedures. Program FUNC3.C, Listing 2.14 ,
shows how local variables are used. co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

Listing 2.13 Passing a parameter to the function


o

// FUNC2.C
du

#include "16F877A.H”
int8 outbyte=1; // Declare global variables
int16 n,count;
u
cu

void out() // Function block


{
while (outbyte!=0)
{ output_C(outbyte);
outbyte++;
for(n=1;n<count;n++);
}
}
main()
{
count=2000;
out(); // Call function
while(1);
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Listing 2.14 Local variables


// FUNC3.C
// Use of local variables

#include "16F877A.H"

int8 outbyte=1;
outbyte 1; // Declare global variables
int16 count;

int out(int16 t) // Declare argument types


{
int16 n; // Declare local variable

while (input(PIN_D0)) // Run output at speed t

om
{ outbyte++;
for(n=1;n<t;n++);
}
return outbyte; // Return output when loop stops

.c
}

main()
{

ng
count=50000;
out(count); // Pass count value to function
output_C(outbyte); // Display returned value
while(1);
co
}
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
an
th
ng

2.6 PIC16 C More Data Types


o
du

● Arrays and strings


● Pointers and indirect addressing
● Enumeration
u
cu

The data in a C program may be most conveniently


handled as sets of associated variables. These occur more
frequently as the program data becomes more complex,
but only the basics are mentioned here.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

28
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

om
.c
ng
co
an
th
ng

2.8 PIC16 C Compiler Directives


o
du

● Include and use directives


● Header file listing and directives
u
cu

Compiler directives are typically used at the top of the program to set
up compiler options, control project components, define constant
labels, and so on before the main program is created. They are
preceded by the hash symbol to distinguish them from other
types of statements and do not have a semicolon to end the line.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

29
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

om
.c
ng
co
an
th
o ng
du
u
cu

30
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

om
.c
ng
co
an
th
o ng
du
u
cu

31
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

om
.c
ng
co
an
th
o ng
du
u
cu

32
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

om
.c
ng
co
an
th
ng

3. Timer and Interrupt


o

• Interrupt:
du

– Interrupts allow an external event to


initiate a control sequence that takes
u

priority over the current MCU activity.


cu

– The interrupt service routine (ISR)


carries out some operation associated
with the port or internal device that
requested the interrupt.

– Interrupts are frequently used with


hardware timers, which provide delays,
timed intervals and measurement.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 66

33
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

3. Timer and Interrupt


• PIC16F877 has 14 interrupt sources
No Interrupt Label Interrupt Source
1 INT_EXT External interrupt detect on RB0
2 INT_RB Change on Port B detect
3 INT_TIMER0 Timer 0 overflow
(INT_RTCC)

om
4 INT_TIMER1 Timer 1 overflow
5 INT TIMER2
INT_TIMER2 Timer 2 overflow

.c
6 INT_CCP1 Timer 1 capture or compare detect
7 INT_CCP2 Timer 2 capture or compare detect

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 67
an
th
ng

3. Timer and Interrupt


o

• PIC16F877 has 14 interrupt sources


du

No Interrupt Label Interrupt Source


u

8 INT_TBE USART transmit data done


cu

9 INT_RDA USART receive data ready


10 INT_SSP Serial data received at SPI or I2C
11 INT_BUSCOL I2C collision detected
12 INT_PSP Data ready at parallel serial port
13 INT_AD Analog‐to‐digital converter complete
14 INT_EEPROM EEPROM write completion

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 68

34
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

C Interrupts
• CCS C Interrupt Functions

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 69
an
th
ng

Interrupt example
o
du

C1 4MHz
U1
13 33
OSC1/CLKIN RB0/INT
14
OSC2/CLKOUT RB1
34 R1
15pF 1 35 10k
MCLR/Vpp/THV RB2
X1 36
u

RB3/PGM
2 37
C2 3
RA0/AN0 RB4
38
cu

RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
15pF 6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT U2 RP1
19 1 20 9
RD0/PSP0
20 2 19 8
RD1/PSP1
21 3 18 7
RD2/PSP2
22 4 17 6
RD3/PSP3
27 5 16 5
RD4/PSP4
28 6 15 4
RD5/PSP5
29 7 14 3
RD6/PSP6
30 8 13 2
RD7/PSP7
9 12
PIC16F877 10 11 1

220R

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 70

35
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Interrupt example
#include " 16F877A.h "
#use delay(clock = 4000000)
#int_ext // Interrupt name
void isrext() { // Interrupt service routine
output_D(255); // ISR action
delay_ms(1000);
}
void main() {
int x;

om
enable_interrupts(int_ext); // Enable named interrupt
enable_interrupts(global); // Enable all interrupts
ext_int_edge(H_TO_L); // Interrupt signal polarity

.c
while(1) { // Foreground loop
output_D(x); x + + ;

ng
delay_ms(100);
}
}
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 71
an
th
ng

Interrupt statements
o

• #int_xxx
du

– Tells the compiler that the code immediately following is


the service routine for this particular interrupt
u
cu

– The interrupt name is preceded by #(hash) to mark the


start of the ISR definition and to differentiate it from a
standard function block.
– An interrupt name is defined for each interrupt source.
• enable_interrupts(int_ext);
– Enables the named interrupt by loading the necessary
codes into the interrupt control registers

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 72

36
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Interrupt statements
• enable_interrupts(level);
– Enables the interrupt at the given level.
– Examples:
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);

• Disable_interrupts(level)

om
– Disable interrupt at the given level
• ext_int_edge(H_TO_L);

.c
– Enables the edge on which the edge interrupt should trigger.

ng
This can be either rising or falling edge.
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 73
an
th
ng

Class Assignment
o

1. Write C code to enable an external interrupt


du

at RB0 with the trigger low to high


u

2. Write a C program to control 4 output pins


cu

RC0‐RC3 from 4 input pins RB4‐RB7 using


port interrupt.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 74

37
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

3. PIC16 Hardware Timers


• The PIC 16F877 has three hardware timers
built in:
– Timer0:
Ti 0 88‐bit,
bi originally
i i ll called
ll d RTCC,
RTCC the
h real‐time
l i
counter clock
– Timer1: 16‐bit
– Timer2: 8‐bit

om
• The p
principal
p modes of operation
p

.c
– Counters for external events
– Timers using the internal clock.

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 75
an
th
ng

Counter/Timer Operation
o

• A counter/timer register consists of a set of bistable stages


du

(flip‐flops) connected in cascade (8, 16, or 32 bits).


u
cu

Flag is set to 1 when overflow (7 to 0)

• An 8‐bit counter counts up from 0x00 to 0xFF


Bộ môn Kỹ Thuật Điện Tử - ĐHBK 76

38
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Counter/Timer Operation
• Timer0 is an 8‐bit register that can count pulses at RA4; for this
purpose, the input is called T0CKI (Timer0 clock input).
• Timer1 is a 16‐bit register that can count up to 0xFFFF (65,535)
(65 535)
connected to RC0 (T1CKI) .
• The count can be recorded at any chosen point in time;
alternatively, an interrupt can be generated on overflow to notify
the processor that the maximum count has been exceeded.

om
• If the register is preloaded with a suitable value, the interrupt
occurs after a known count.
count

.c
• Timer0 has a prescaler that divides by up to 128;
• Timer1 has one that divides by 2, 4, or 8;

ng
• Timer2 has a prescaler and postscaler that divide by up to 16.
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 77
an
th
ng

Timer Functions
o
du

Functions Description Examples

Setup_timer_x Setup timer set_timer_0(RTCC_INTERN


u

AL | RTCC_DIV_8);
cu

Set_timerx(value) Set the value of the Set_timer0(81);


timer
Get_timerx() Get the value of the int x = get_timer0();
timer
Setup_ccpx(mode) Set PWM, capture, or setup_ccp1(ccp_pwm);
compare mode
Set_pwmx_duty(value) Set PWM duty cycle set+_pwm1_duty(512);

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 78

39
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Timer Functions
• Set_timer_0(mode)
– RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L
– RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32,
RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
• Set_timer_1(mode)
– T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC
– T1_CLK_OUT

om
– T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8
• Example:

.c
set_timer_0(RTCC_INTERNAL | RTCC_DIV_8)
– setup_timer_1 ( T1_DISABLED ); //disables timer1
– setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );

ng
– setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 79
an
th
ng

Timer Functions
o

• setup_timer_2 (mode, period, postscale)


du

– mode may be one of T2_DISABLED, T2_DIV_BY_1,


u

T2 DIV BY 4 T2
T2_DIV_BY_4, T2_DIV_BY_16
DIV BY 16
cu

– period is a int 0‐255 that determines when the


clock value is reset,
– postscale is a number 1‐16 that determines how
many timer overflows before an interrupt: (1
means once, 2 means ttwice,
i and d so on).
)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 80

40
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Timer Functions
• Create delay by timers
N = 2n – (T * Fclock) / (4*Prescaler)
 N: the count number
 n: bit number of timer (Timer 0 & 2: n=8, Timer1:
n = 16)
 T: delay time

om
 Fclock: frequency of crystal

.c
 Prescaler: prescaler number

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 81
an
th
o ng
du
u
cu

The program that carries out


the function of a counting
circuit counts from 00 to 19
and displays on two 7-seg
leds connected to port C

82

41
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

PWM mode
• In Pulse Width Modulation mode, a CCP module can
be used to generate a timed output signal.
• This provides an output pulse waveform with an
adjustable high (mark) period.
• CCS C functions:
 Set_pwm1_duty(value);

om
 Set_pwm2_duty(value);
 duty cycle = value / [ 4 * (PR2 +1 ) ]

.c
 PR2 is the count value of timer 2

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 83
an
th
ng

PWM mode ‐ Example


o
du

#include " 16F877A.h "


void main()
u

{
cu

setup_ccp1(ccp_pwm); // Select timer and mode


set_pwm1_duty(500); // Set on time
setup_timer_2(T2_DIV_BY_16,248,1); // Clock rate & output
//period
while(1)
( ){} // Wait until reset
}

Produce an output at CCP1 of 250Hz (4ms) and a mark-space ratio of 50%


with a 4-MHz MCU clock. Explain?

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 84

42
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Compare Mode
• Generate a timed output in conjunction with Timer1.
• The 16‐bit CCPR register is preloaded with a set value, which is
continuously compared with the Timer1 count count. When the count
matches the CCPR value, the output pin toggles and a CCP
interrupt is generated. If this operation is repeated, an interrupt
and output change with a known period can be obtained.

om
.c
ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 85
an
th
ng

Capture mode
o

• The CCP pin is set to input and monitored for a change of state.
du

• When a rising or falling edge (selectable) is detected, the timer


register is cleared to 0 and starts counting at the internal clock
u

rate.
cu

• When the next active edge is detected at the input, the timer
register value is copied to the CCP register. The count therefore
corresponds to the period of the input signal. With a 1MHz
instruction clock, the count is in microseconds

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 86

43
CuuDuongThanCong.com https://fb.com/tailieudientucntt
10/24/2014

Exercise – Timer Interrupt


1) Calculate the
frequency of the pulse
on PIN B0 created by
the program on the
right figure, given that
FOSC = 4MHz

om
2) Write the program that
create a 2Hz pulse on

.c
PIN_B1, given that
FOSC = 4MHz and
dutycycle = 20%

ng
co
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 87
an
th
ng

Class Assignment
o

1. Write a program for PIC16F877 to create


du

rectangle pulses 2KHz at RB1 using interrupt


u

Timer 0.
0
cu

2. Write a C program for PIC16F877 to create


rectangle pulses 0.5KHz and 1KHz at RC0 and
RC1 with duty cycle 50%. Use Timer1 interrupt
with 4MHz OSC.
3. Write the program that create a 2Hz pulse on
PIN_B1, given that FOSC = 4MHz and dutycycle
= 20%
Bộ môn Kỹ Thuật Điện Tử - ĐHBK 88

44
CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like