Sesión 3 Sesión 3 Introducción a la programación Introducción a la programación
de de MicrocontroladoresMicrocontroladores
1M.C. Marco A. Ramírez Barrientos
• Introducción a los sistemas digitales.• Introducción a LabView.• Introducción a la programación de
ContenidoContenido
• Introducción a la programación de Microcontroladores PIC.
• Controladores Lógicos Programables, PLCs.
16, 23, 30 nov. y 7 dic. de 2011
2
OBJETIVO GENERAL
Conocer los conceptos fundamentales para laprogramación de microcontroladores, mediantelenguajes de programación ensamblador y C.lenguajes de programación ensamblador y C.
BIBLIOGRAFIA BÁSICA
1. Microcontrolador PIC16F84; Enrique Palacios, 2006; Alfaomega marcombo; 2ª. edición; 623 páginas.
2. Microcontroladores PIC. Diseño práctico de aplicaciones, Angulo Usategui, José María y Angulo Martínez, Ignacio, McGraw-Hill.Martínez, Ignacio, McGraw-Hill.
3. Advanced PIC Microcontroller Projects in C, Dogan Ibrahim, 2008, Ed. Elsevier.
INTRODUCCION AL MICROCONTROLADOR
• Un poco de historiaUn poco de historiaUn poco de historiaUn poco de historia
Inicialmente cuando no existían los microprocesadores, se requería para el diseño de circuitos electrónicos muchos diseño de circuitos electrónicos muchos componentes y cálculos matemáticos. Un circuito lógico básico requería de una gran cantidad de elementos electrónicos basados en transistores, resistencias, etc,
5
INTRODUCCION AL MICROCONTROLADOR
� Un poco de historiaUn poco de historiaUn poco de historiaUn poco de historia
En el año 1971 apareció el primer microprocesador el cual originó un cambio decisivo en las técnicas de diseño de la decisivo en las técnicas de diseño de la mayoría de los equipos.
Entre los microprocesadores mas conocidos tenemos el popular Z-80 y el 8085.
6
INTRODUCCION AL MICROCONTROLADOR
• Un poco de historiaUn poco de historiaUn poco de historiaUn poco de historia
Los diseñadores de equipos electrónicos ahora tenían equipos que podían realizar mayor cantidad de tareas en menos tiempo y mayor cantidad de tareas en menos tiempo y su tamaño se redujo considerablemente.
sin embargo, después de cierto tiempo aparece una nueva tecnología llamada microcontrolador que simplifica aun mas el diseño electrónico.
7
DIFERENCIA ENTRE MICROCONTROLADOR Y MICROPOCESADOR
• MicroprocesadorMicroprocesadorMicroprocesadorMicroprocesador
Es un sistema abierto con el que puede construirse un computador con las características que se desee, acoplándole características que se desee, acoplándole los módulos necesarios.
La Unidad Central de Proceso (UCP), interpreta las instrucciones y el cambio de datos que las ejecuta.
8
DIFERENCIA ENTRE MICROCONTROLADOR Y MICROPOCESADOR
• MicroprocesadorMicroprocesadorMicroprocesadorMicroprocesador
9
DIFERENCIA ENTRE MICROCONTROLADOR Y MICROPOCESADOR
• MicrocontroladorMicrocontroladorMicrocontroladorMicrocontrolador
Es un sistema cerrado que contiene un computador completo.
Todas las partes del computador están contenidas en su interior y solo salen al exterior las líneas que gobiernan los periféricos.
10
DIFERENCIA ENTRE MICROCONTROLADOR Y MICROPOCESADOR
11
Cada fabricante de microcontroladores oferta un
elevado número de modelos diferentes, desde los
más sencillos hasta los más sofisticados.
ARQUITECTURA INTERNA
Un microcontrolador posee todos los componentes de un computador, pero con unas características fijas que no pueden alterarse:– Procesador– Procesador– Memoria de programa (No volátil)– Memoria datos (lectura y escritura)– Líneas E/S para los controladores de
periféricos– Recursos auxiliares
12
ARQUITECTURA INTERNA
1. Procesador o CPU.2. Memoria no volátil para contener el programa.3. Memoria de lectura y escritura para guardar los datos.4. Líneas de E/S para los controladores de periféricos.5. Recursos auxiliares (Módulos para el control de
periféricos)13
PROCESADOR O CPU
Es el elemento más importante del microcontrolador y determina sus principales características, tanto a nivel de hardware como de software
Existen dos arquitecturas, se diferencian en la forma de conexión de la memoria al procesador y en los buses que cada una necesita:
– Arquitectura Von Neumann– Arquitectura Harvard
14
ARQUITECTURA VON NEUMANN
15
Algunas familias de microcontroladores como la INTEL-51 y la Z80
ARQUITECTURA VON NEUMANN
Existe una sola memoria, donde coexisten las instrucciones de programa y los datos, accedidos con un bus de dirección, uno de accedidos con un bus de dirección, uno de datos y uno de control.
16
ARQUITECTURA VON NEUMANN
Limitación:� Longitud de las instrucciones por el bus de
datos (varios accesos a memoria para instrucciones complejas).instrucciones complejas).
�Velocidad de operación (bus único para datos e instrucciones) e impide superponer ambos tiempos de acceso.
17
ARQUITECTURA HARVARD
18
Utilizada en sistemas embebidos en general.
ARQUITECTURA HARVARD
– Memoria de datos separada de la memoria de instrucciones
– Palabra de datos– Palabra de instrucción
– Conjunto reducido de instrucciones (RISC)– Conjunto reducido de instrucciones (RISC)– Ejecución de instrucciones en un ciclo de
instrucción.– Paralelismo implícito, segmentación del
procesador (pipe-line)
19
• El alto rendimiento que poseen los microcontroladores se debe a tres técnicas:
– Arquitectura Harvard– Arquitectura Harvard– Arquitectura RISC– Segmentación
20
TIPOS DE MEMORIAS
Esta diseñado para que en su memoria de programa se almacenen todas las instrucciones del programa de control.
1. ROM con máscara2. OTP (One Time Programmable)3. EPROM4. EEPROM5. FLASH
21
MEMORIA DE PROGRAMA (ROM)
1.1.1.1. ROM con máscaraROM con máscaraROM con máscaraROM con máscara
Se graba durante el proceso de fabricación mediante el uso de “máscaras”Se aconseja este tipo de memoria cuando Se aconseja este tipo de memoria cuando se precisan series muy grandes
22
MEMORIA DE PROGRAMA (ROM)
2 . OTP (One Time Programmable)2 . OTP (One Time Programmable)2 . OTP (One Time Programmable)2 . OTP (One Time Programmable)
Sólo se puede grabar una vez por parte del usuario.Se aconseja este tipo de memoria para Se aconseja este tipo de memoria para prototipos finales.
23
MEMORIA DE PROGRAMA (ROM)
3. EPROM3. EPROM3. EPROM3. EPROM
En la superficie de la cápsula del microcontrolador existe una ventana de cristal por la que se puede someter al chip de cristal por la que se puede someter al chip de la memoria a rayos ultravioleta para producir su borrado y emplearla nuevamente.
24
MEMORIA DE PROGRAMA (ROM)
4. EEPROM4. EEPROM4. EEPROM4. EEPROM
La grabación es similar a las memorias OTP y EPROM, pero el borrado es mucho más sencillo al poderse efectuar de la misma sencillo al poderse efectuar de la misma forma que el grabado, o sea, eléctricamente.Garantizan 1.000.000 de ciclos de escritura/borrado.
25
MEMORIA DE PROGRAMA (ROM)
5. FLASH5. FLASH5. FLASH5. FLASH
Se puede escribir y borrar en circuito al igual que la EEPROM, pero suelen disponer de mayor capacidad que estas últimas.mayor capacidad que estas últimas.Pueden ser programadas con las mismas tensiones de alimentación del microcontrolador.
26
MEMORIA DE DATOS (RAM)
Es una memoria volátil y se destina a guardar las variables y los datos (SRAM).
Los microcontroladores disponen de Los microcontroladores disponen de capacidades de RAM comprendidas entre 20 y 512 bytes.
Existen microcontroladores que disponen de memoria EEPROM para contener datos.
27
REGISTROS Y BITS
Un registro es una posición de memoria en la cual se puede almacenar un dato. Es decir que la memoria esta dividida en pequeñas partes llamadas “Registros”.
El primer registro de una memoria corresponde a la dirección 00H.
Hay un conjunto de registros que ya vienen “Predefinidos” desde la fábrica.
Cada registro esta dividido en 8 partes, Bits.28
LINEAS DE ENTRADA/SALIDA (PUERTOS)
Los microcontroladores cuentan con una serie de pines destinados a entrada y salida de datos o señales digitales. A estos pines se les denomina “Puerto”.
Los puertos están controlados por los registros.
Entradas salidas de propósito general, trabajo con dispositivos simples como relés, Leds, etc.
29
RECURSOS AUXILIARES
• Circuito de reloj.• Temporizadores y contadores.• Conversores AD y DA.• Comparadores• Modulador de ancho de pulsos (PWM)• Modulador de ancho de pulsos (PWM)• Puerto serie• Otros puertos de comunicación (USB, CAN)• Sistema de protección.• Estado de reposo
30
LOS MICROCONTROLADORES PIC
Los 'PIC' son una familia de microcontroladores tipo RISC (Reduced Instruction Set Computer) fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica desarrollado por la división de microelectrónica de General Instruments.
PIC “Peripheral Interface Controller”.
El PIC de 8 bits se desarrollo para el año 1975
31
LOS MICROCONTROLADORES PIC
Los microcontroladores PIC incorporan en su procesador tres características:� Procesador tipo RISC� Procesador segmentado� Procesador segmentado� Arquitectura HARVARD
Con estos recursos los PIC son capaces de ejecutar en un ciclo de instrucción todas las instrucciones, excepto las de salto que tardan el doble.
32
LA FAMILIA DE LOS PIC
Se divide en cuatro gamas:Gama enana, gama baja, gama media y gama alta.
Sus diferencias radica en:Sus diferencias radica en:El numero de instrucciones y longitudEl número de puertos y funciones.
Lo cual se refleja en el encapsulado, la complejidad interna y de programación, y en el número de aplicaciones.
33
NOMENCLATURA DE LOS PIC’S
PIC nnLLLxxx
nn: Un número propio de la gama del PIC
LLL: Código de letras donde la primera
indica la tensión de alimentación y lasotras dos el tipo de memoria que utiliza
Xxx: Número que indica el modelo del PIC.
34
NOMENCLATURA DE LOS PIC’S
35
GAMA ENANA
PIC 12C(F)XXX, de 8 patas (pines)
Aunque solo tienen 8 pines, pueden destinar hasta 6 como líneas de E/S para los periféricos porque disponen de un oscilador interno R-C.
36
GAMA ENANA
Características de los modelos PIC16C5X
37
GAMA BAJA O BASICA
• Mejores relaciones coste/prestaciones.• Encapsulados con 18 y 28 pines• Pueden alimentarse con una tensión 2.5V• 33 instrucciones con formato de 12bits.
38
GAMA BAJA PIC16C5X
39
Principales características de los modelos de gama baja.
GAMA MEDIA
• Encapsulado desde 18 hasta 68 pines• 35 instrucciones de 14 bits
40
GAMA MEDIA PIC16CXXX
41
Características relevantes de los modelos PIC16X8X de la gama media
GAMA ALTA
• Alcanzan 58 instrucciones de 16 bits• Sistema de gestión de interrupciones
vectorizadas • Incluyen variados controladores de • Incluyen variados controladores de
periféricos, puertas de comunicación serie y paralelo
• Arquitectura abierta.
42
EL PIC16X84
• Pertenece a la familia de la gama media• Tiene solo 18 pines• Tiene solo 18 pines• Posee una memoria de programa de 1K
palabras de 14bits cada una• 64 bytes como memoria de datos
auxiliar y opcional
43
TARJETA DE PRESENTACION DE PIC16X84
• Memoria de programa 1Kx14• Memoria de datos RAM 36 byte-PIC16C84 y
de 68 byte-PIC16F84• Memoria de datos 64bytes/EEPROM• Memoria de datos 64bytes/EEPROM• Pila de 8 niveles• Interrupciones 4 tipos diferentes• Juego de instrucciones 35• Encapsulado Platico DIP de 18 pines• Frecuencia de trabajo 10MHz Máxima
44
TARJETA DE PRESENTACION DE PIC16X84
• Temporizadores : Solo uno TMR0• Líneas E/S digitales : 13 Puerta A y Puerta B• Voltaje de alimentación : VDD de 2 a 6VDC• Voltaje de alimentación : VDD de 2 a 6VDC• Corriente máxima absorbida : 80mA-Puerta A
y 150mA-Puerta B• Corriente máxima suministrada : 50mA-
Puerta A y 100mA-Puerta B
45
ASPECTO EXTERNO
46
FRECUENCIA DE FUNCIONAMIENTO. EL RELOJ
Cuando un PIC16X8X funciona a 10MHz, le corresponde un ciclo de instrucción de 400ns.
Ciclo de instrucción: 4x100ns=400nsCiclo de instrucción: 4x100ns=400ns
Todas las instrucciones del PIC se realizan en un ciclo de instrucción menos las de salto.
Se aplica la técnica de segmentación o Pipeline
47
TIPOS DE OSCILADORES
• OSCILADOR TIPO RC
Un oscilador formado por una resistencia y un condensador
48
TIPOS DE OSCILADORES
• OSCILADOR TIPO HS
Un oscilador que alcanza una alta velocidad entre 4 y 20MHz, basado en un cristal de cuarzo o un resonador cerámicocristal de cuarzo o un resonador cerámico
49
TIPOS DE OSCILADORES
• OSCILADOR TIPO XT
Es un resonador de cristal o resonador para frecuencias estándar, comprendida entre 100KHz y 4MHz.100KHz y 4MHz.
50
TIPOS DE OSCILADORES
• OSCILADOR TIPO LP
Oscilador de bajo consumo con cristal o resonador diseñado para trabajar en un rango de frecuencias de 35 a 200KHz.rango de frecuencias de 35 a 200KHz.
El cristal de cuarzo o el resonador cerámico se coloca entre los pines OSC1 y OSC2
51
REINICIALIZACION O RESET
Con un nivel lógico bajo en MCLR# el microcontrolador se reinicializa:
1. El contador de programa se carga con la 1. El contador de programa se carga con la dirección 0.
2. La mayoría de los registros de estado y control del procesador toman un estado conocido y determinado.
52
ESQUEMA MINIMO DE MONTAJE DEL PIC16F84
53
EN EL INTERIOR DEL PROCESADOR
Los microcontroladores PIC incorporan tres característica:– Procesador tipo RISC– Procesador segmentado– Arquitectura Harvard
Una condición es la simetría y ortogonalidad en el formato de las instrucciones (14bits)
El juego de instrucciones se reduce a 35 y con la estructura segmentada se pueden realizar simultáneamente las dos fases que compone cada instrucción
54
EN EL INTERIOR DEL PROCESADOR
• El manejo intensivo del banco de registros, los cuales participan de una manera muy activa en la ejecución de instrucciones.
• La ALU, efectúa sus operaciones lógico-aritmética con dos operandos, uno es del registro W(Work) y el otro que puede provenir de cualquier registro o del propio código de instrucción.
55
ARQUITECTURA INTERNA DEL PIC16C84
Consta de siete bloques fundamentales:
• Memoria de programa EEPROM 1K x 14bits.
• Memoria de datos formada por dos áreas, una RAM aloja 22 registros de (SFR), 36 registros (GPR) y tipo EEPROM de 64 bytes.
• Camino de datos con la ALU de 8 bits y un registro de trabajo W.
56
Assembly language programming
• In order to function properly, we must define several microcontroller parameters such as: - type of oscillator,- whether watchdog timer is turned on, and
57
- whether watchdog timer is turned on, and- whether internal reset circuit is enabled.All this is defined by the following directive:
_CONFIG _CP_OFF&_WDT_OFF&PWRTE_ON&XT_OSC
58
Clock and Instruction Cycles
•• Instruction ClockInstruction Clock– Clock from the oscillator enters a microcontroller via OSC1 pin where internal circuit of a
microcontroller divides the clock into four even clocks Q1, Q2, Q3, and Q4 which do not overlap.
– These four clocks make up one instruction cycle (also called machine cycle) during which one instruction is executed.
– Execution of instruction starts by calling an instruction that is next in string.– Instruction is called from program memory on every Q1 and is written in instruction register – Instruction is called from program memory on every Q1 and is written in instruction register
on Q4.– Decoding and execution of instruction are done between the next Q1 and Q4 cycles. On the
following diagram we can see the relationship between instruction cycle and clock of the oscillator (OSC1) as well as that of internal clocks Q1-Q4.
– Program counter (PC) holds information about the address of the next instruction.
PIC16F877A Features
High Performance RISC CPU:• Only 35 single word instructions to learn
• All single cycle instructions except for program • All single cycle instructions except for program branches, which are two-cycle
• Operating speed: DC - 20 MHz clock input DC -200 ns instruction cycle
PIC16F877A Pin Layout
PORTA PORTB
PORTE
ADC inputs
Counter
0
external PORTE
PORT
C
PORTC
PORT
D
PORTD
external
input
PIC Memory
� The PIC16F877A has an 8192 (8k) 14bit instruction
program memory
368 Bytes Registers as Data Memory :� 368 Bytes Registers as Data Memory :
�Special Function Registers: used to control peripherals
and PIC behaviors
�General Purpose Registers: used to a normal
temporary storage space (RAM)
� 256 Bytes of nonvolatile EEPROM
PIC Program Memory� The PIC16F877 8192 (8k) 14bit instructions
When the
controller is
reset, program
execution starts
Takes a max of 8 addresses,
the ninth address will write
over the first.
If interrupted, program
execution continues
from here
execution starts
from here
PIC Data Memory
The
most
importa
nt
registers
The data memory is devided into 4 memory banks
registers
have
addresses
in all
the four
banks
Register Addressing ModesImmediate Addressing:
Movlw H’0F’
Indirect Addressing:
• Full 8 bit register address is written the special function
register FSR
• INDF is used to get the content of the address pointed by FSR
• Exp : A sample program to clear RAM locations H’20’ –
H’2F:MOVLW 0x20 ;initialize pointer
MOVWF FSR ;to RAM
NEXT CLRF INDF ;clear INDF register
Direct Addressing:
Uses 7 bits of 14 bit instruction to identify a register file
address 8th and 9th bit comes from RP0 and RP1 bits of
STATUS register.
i.e. Z equ D’2’ ; Z=2
btfss STATUS, Z ; test if the 3rd bit of the
STATUS register is set
PIC Family Control Registers
• Uses a series of “Special Function Registers” for controlling peripherals and PIC behaviors.
� STATUS ���� Bank select bits, ALU bits (zero, borrow,
carry)carry)
� INTCON � Interrupt control: interrupt enables, flags, etc.
� OPTION_REG � contains various control bits to
configure the TMR0 prescaler/WDT postscaler
,the External INT Interrupt, TMR0 and the weak
pull-ups on PORTB
Special Function Register
”STATUS Register“
Special Function Register
”INTCON Register“
PIC Peripherals
� Each peripheral has a set of SFRs to control its operation.
� Different PICs have different on-board peripherals
Peripheral Features
� 5 Digital I/O Ports
� Three timer/counter modules
� Timer0: 8-bit timer/counter with 8-bit pre-scaler
� Timer1: 16-bit timer/counter with pre-scaler, can be incremented during SLEEP via
external crystal/clock
� Timer2: 8-bit timer/counter with 8-bit period register, pre-scaler and post-scaler
� A 10-bit ADC with 8 inputs � A 10-bit ADC with 8 inputs
� Two Capture, Compare, PWM modules
� Capture is 16-bit, max. resolution is 12.5 ns
� Compare is 16-bit, max. resolution is 200 ns
� PWM max. resolution is 10-bit
� Synchronous Serial Port (SSP) with SPI™ (Master mode) and I2C™ (Master/Slave)
� Universal Synchronous Asynchronous Receiver Transmitter (USART/SCI) with 9-
bit address detection
� Parallel Slave Port (PSP) 8-bits wide, with external RD, WR and CS controls
PIC Peripherals: Ports (Digital I/O)
� Ports are basically digital I/O pins which exist in all PICs
� The PIC16F877A have the following ports:
� PORT A has 6 bit wide, Bidirectional
� PORT B,C,D have 8 bit wide, Bidirectional
PORT E has 3 bit wide, Bidirectional� PORT E has 3 bit wide, Bidirectional
� Ports have 2 control registers
� TRISx sets whether each pin is an input (1) or output (0)
� PORTx sets their output bit levels or contain their input bit levels
� Pin functionality “overloaded” with other features
� Most pins have 25mA source/sink thus it can drive LEDs directly
PIC Peripherals: Analogue
to Digital Converter
�Only available in 14bit and 16bit cores
�Fs (sample rate) < 54KHz�Fs (sample rate) < 54KHz
� the result is a 10 bit digital number
�Can generate an interrupt when ADC conversion is
done
PIC Peripherals: Analogue to
Digital Converter
� The A/D module has four registers. These registers are:� A/D Result High Register (ADRESH)
� A/D Result Low Register (ADRESL)
� A/D Control Register0 (ADCON0)
� A/D Control Register1 (ADCON1)
� Multiplexed 8 channel inputs� Must wait Tacq to charge up sampling capacitor� Must wait Tacq to charge up sampling capacitor
� Can take a reference voltage different from that of the controller
PIC Peripherals: USART: UART
� Serial Communications Peripheral:
Universal Synch./Asynch. Receiver/Transmitter
� Interrupt on TX buffer empty and RX buffer full� Interrupt on TX buffer empty and RX buffer full
� Asynchronous communication: UART (RS-232C serial)
� Can do 300bps - 115kbps
� 8 or 9 bits, parity, start and stop bits, etc.
� Outputs 5V so you need a RS232 level converter (e.g.,
MAX232)
PIC Applications
� LED Flasher
Loop:
bsf PORTB, 0
call Delay_500mscall Delay_500ms
bcf PORTB, 0
call Delay_500ms
goto Loop
PIC Applications
� Button Read
Movlw0
movwf TRISD, f
bsf TRISD, 2
Loop:Loop:
btfsc PORTD, 2
goto light
goto No_light
Light:
bsf PORTB,0
goto Loop
No_light:
bcf PORTB,0
goto Loop
mikro C
77
Las variables básicas en este compilador específico son: • bit
• char• char
• short
• int
• long
• float
• double 78
• Las variables bit permiten almacenar un valor lógico es decir verdadero o falso, 0 ó 1.
• Las variables char se utilizan para almacenar caracteres codificados con el código ASCII, son útiles para guardar letras o textos.
• Una variable short almacena un número entero de 8 bits corto puede valer de: -127 a 127.
• Las variables tipo int guardan números enteros de 16 bits, está variable permite guardar números de: -32767 a 32767.
• La variable tipo long almacena números enteros largos de 32 bits, su rango puede ser de:
• -2147483647 a 2147483647. • Las variables tipo float y double permiten guardar números
con punto decimal79
80
• bit VARIABLE1_BIT; //Declaración de una variable tipo bit.
• char CARACTER; //Declaración de una variable tipo char.
• char CARACTER2='J'; //Declaración de una variable tipo char
inicializada con el
• //valor ASCII del carácter J.
• int ENTERO=1234; //Declaración de una variable tipo entera inicializada
con
• //el valor 1234.
• float DECIMAL=-12.45; //Declaración de una variable con punto decimal
• //inicializada con el valor -12,45.
• double DECIMAL2=56.68; //Declaración de una variable con punto
decimal
• //inicializada con el valor 56,68.
• long ENTERO2=-954261; //Demacración de una variable de tipo entero
largo
• //inicializada con el valor -954261.81
• Los siguientes ejemplos muestras como declarar variables sin signo:
• unsigned char CARACTER; //Declaración de una
variable tipo char sin signo.
• unsigned int ENTERO; //Declaración de una variable • unsigned int ENTERO; //Declaración de una variable
tipo entera sin signo.
• unsigned long ENTERO2; //Demacración de una
variable de tipo entero largo sin signo.
82
void main() {
TRISA = 0x00; // set direction to be output
TRISB = 0x00; // set direction to be output
TRISC = 0x00; // set direction to be output
TRISD = 0x00; // set direction to be output
do {
PORTA = 0x00; // Turn OFF LEDs on PORTA
83
PORTA = 0x00; // Turn OFF LEDs on PORTA
PORTB = 0x00; // Turn OFF LEDs on PORTB
PORTC = 0x00; // Turn OFF LEDs on PORTC
PORTD = 0x00; // Turn OFF LEDs on PORTD
Delay_ms(100); // 1 second delay
PORTA = 0xFF; // Turn ON LEDs on PORTA
PORTB = 0xFF; // Turn ON LEDs on PORTB
PORTC = 0xFF; // Turn ON LEDs on PORTC
PORTD = 0xFF; // Turn ON LEDs on PORTD
Delay_ms(100); // 1 second delay
} while(1); // Endless loop
}
84