Está en la página 1de 108

MICROCONTROLADORES PIC

Prof. Felipe Pacheco E-mail: patxeko@hotmail.com 0414-1490291

DEFINICION DE MICROCONTROLADOR

ARQUITECTURAS
ARQUITECTURA VON NEUMANN

DATOS/PROGRAMA MEMORIA DE DATOS/PROGRAMA

PROCESADOR

DIRECCION

CONTROL

ARQUITECTURAS
ARQUITECTURA HARVARD
DATOS

CODIGO PROG.

MEMORIA DE DATOS

DIRECCION DATO

PROCESADOR

DIRECCION PRG.

MEMORIA DE PROGRAMAS

CONTROL DATO

CONTROL PROG.

ARQUITECTURA INTERNA

ARQUITECTURA INTERNA

VARIABLES

CONSTANTES
MPX

8 BITS ULA

8 BITS

ARQUITECTURA INTERNA
BUS DE DATOS INTERNO MEMORIA DE DATOS

9 BITS
MPX

FSR
VARIABLES

CONSTANTES
MPX

8 BITS ULA

8 BITS
W

ARQUITECTURA INTERNA
BUS DE DATOS INTERNO MEMORIA DE DATOS

9 BITS
MPX

FSR
VARIABLES

CONSTANTES
MPX

MEMORIA EEPROM

PUERTOS

8 BITS ULA

E/S
CONVERTIDOR A/D

8 BITS
W

USART
PUERTO SERIE SINC TIMER0/TIMER1/ TIMER2

ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192

BUS DE PROGRAMA

BUS DE DATOS INTERNO

PC
13 BITS
PILA (STACK) DE 13 NIVELES

8 BITS
MEMORIA DE DATOS

14 BITS
REG. DE INSTRCCION

9 BITS
MPX

FSR
VARIABLES

CONSTANTES
MPX

MEMORIA EEPROM

DECODIFICADOR DE INSTRUCCIONES

PUERTOS

8 BITS ULA

E/S
CONVERTIDOR A/D

8 BITS
W

USART
PUERTO SERIE SINC TIMER0/TIMER1/ TIMER2

ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192

BUS DE PROGRAMA

BUS DE DATOS INTERNO

PC
13 BITS
PILA (STACK) DE 13 NIVELES

8 BITS
MEMORIA DE DATOS

14 BITS
REG. DE INSTRCCION

9 BITS
MPX

7 BITS

FSR
VARIABLES

8 BITS
DECODIFICADOR DE INSTRUCCIONES

CONSTANTES MPX

MEMORIA EEPROM

PUERTOS

8 BITS ULA

E/S
CONVERTIDOR A/D

8 BITS
W

USART
PUERTO SERIE SINC TIMER0/TIMER1/ TIMER2

ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192

BUS DE PROGRAMA

BUS DE DATOS INTERNO

PC
13 BITS
PILA (STACK) DE 13 NIVELES

8 BITS
MEMORIA DE DATOS

14 BITS
REG. DE INSTRCCION

9 BITS
MPX

7 BITS

FSR
VARIABLES

8 BITS
DECODIFICADOR DE INSTRUCCIONES
RELOJ

CONSTANTES MPX

MEMORIA EEPROM

TEMPORIZADOR DE CONEXIN DE POTENCIA TEMPORIZADOR DE INICIO RESET POWER-ON (1.2 A 1.7V) PERRO GUARDIAN RESET BROWN OUT (3.8 Y 4.2V)

PUERTOS

8 BITS ULA

E/S
CONVERTIDOR A/D

8 BITS
W

USART
PUERTO SERIE SINC TIMER0/TIMER1/ TIMER2

PINES DEL PIC 16F877


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

16F877

PINES DEL PIC 16F877


MCLR

Vdd Vss OSC1/CLKIN OSC1/CLKOUT

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

Vdd

Vss

PINES DEL PIC 16F877


MCLR RA0/AN0 RA1/AN1 RA2/AN2/VrefRA3/AN3Vref+ RA4/T0CKI RA5/AN4

Vdd Vss OSC1/CLKIN OSC1/CLKOUT

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

Vdd

Vss

PINES DEL PIC 16F877


MCLR RA0/AN0 RA1/AN1 RA2/AN2/VrefRA3/AN3Vref+ RA4/T0CKI RA5/AN4

Vdd Vss OSC1/CLKIN OSC1/CLKOUT

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Vdd

Vss

PINES DEL PIC 16F877


MCLR RA0/AN0 RA1/AN1 RA2/AN2/VrefRA3/AN3Vref+ RA4/T0CKI RA5/AN4

Vdd Vss OSC1/CLKIN OSC1/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Vdd

Vss

RC7RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA

PINES DEL PIC 16F877


MCLR RA0/AN0 RA1/AN1 RA2/AN2/VrefRA3/AN3Vref+ RA4/T0CKI RA5/AN4

Vdd Vss OSC1/CLKIN OSC1/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0 RD1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Vdd

Vss RD7 RD6 RD5 RD4 RC7RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3 RD2

PINES DEL PIC 16F877


MCLR RA0/AN0 RA1/AN1 RA2/AN2/VrefRA3/AN3Vref+ RA4/T0CKI RA5/AN4 RE0/AN5 RE1/AN6 RE2/AN7 Vdd Vss OSC1/CLKIN OSC1/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0 RD1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

16F877

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Vdd

Vss RD7 RD6 RD5 RD4 RC7RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3 RD2

LENGUAJE PIC C

ESTRUCTURA DE UN PROGRAMA EN PIC C


ARCHIVOS DE CABECERA. DECLARACION DE VARIABLES. DECLARACION DE FUNCIONES AUXILIARES. CODIFICACION DE PROGRAMA DE SERVICIO DE INTERRUPCIONES. CODIFICACION DE FUNCION PRINCIPAL (main). CODIFICACION DE FUNCIONES AUXILIARES.

TIPO DE VARIABLES

TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO

Int1(short)

0-1

0-1

TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO

Int1(short) Int8(int)

1 8

0-1 -128 a 127

0-1 0 - 255

TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO

Int1(short) Int8(int) Int16 (long)

1 8 16

0-1 -128 -a 127


-37768 a 37767

0-1 0 - 255 0 - 65535

TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO

Int1(short) Int8(int) Int16 (long) Int32

1 8 16 32

0-1 -128 -a 127


-37768 a 37767
-2.147.483.648 a 2.147.483647

0-1 0 - 255 0 - 65535


0a 4.294.967295

TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO

Int1(short) Int8(int) Int16 (long) Int32 Float

1 8 16 32 32

0-1 -128 -a 127


-37768 a 37767
-2.147.483.648 a 2.147.483647

0-1 0 - 255 0 - 65535


0a 4.294.967295 1.174x10-38 a +3.4x1038

-3.4x1038 a +3.4x1038

OPERADORES
RESTA (-) SUMA (+) DIVISION (/) MULTIPLICACION (*) AND LOGICO (&) (&&) OR LOGICO (|) (||) OR EXCLUYENTE (^) (^^) NEGACION (!) IGUALDAD (==)

OPERADORES
DESIGULDAD (!=) MAYOR QUE (>) MENOR QUE (<) MAYOR O IGUAL QUE (>=) MENOR O IGUAL QUE (<=) INCREMENTO (++) DECREMENTO (--)

ESTRUCTURAS DE CONTROL DE PROGRAMA


IF / ELSE ELSE / IF WHILE DO WHILE FOR SWITCH/CASE

ESTRUCTURA DE CONTROL IF
SI CONDICIN?

If(condicin) { operacin 1 }

NO
OPERACIN 2

OPERACIN 1

operacin 2

ESTRUCTURA DE CONTROL IF /ELSE


NO CONDICIN? SI

OPERACIN 2

OPERACIN 1

If(condicin) { operacin 1 } else { operacin 2 }

ESTRUCTURA DE CONTROL ELSE IF


CONDICIN 1?
SI

NO
NO CONDICIN 2?

SI
OPERACIN 1 OPERACIN 2 OPERACIN3

ESTRUCTURA DE CONTROL ELSE IF if(condicin 1) { operacin 1 } else if(condicin 2) { operacin 2 } operacin 3

ESTRUCTURA DE CONTROL WHILE


while(condicin1) NO CONDICIN 1? { operacin 1 } operacin 2
OPERACIN 1

OPERACIN 2

SI

ESTRUCTURA DE CONTROL DO WHILE


Do { operacin 1 } while(condicin1) operacin 2 CONDICIN 1? SI

OPERACIN 1

NO

OPERACIN 2

ESTRUCTURA DE CONTROL FOR


CONTADOR = 1

CONTADOR<= 10

SI

OPERACIN 1

CONTADOR ++

NO

OPERACIN 2

ESTRUCTURA DE CONTROL FOR


FOR(CONTADOR = 1; CONTADOR <=10; CONTADOR++)
{ operacin 1 } operacin 2

ESTRUCTURA SWITCH/CASE
switch (cmd) { case 0: { operacin 0; break; } case 1: { operacin 1; break; } default: { operacin 2; break; } }

PUERTOS DE ENTRADA/SALIDA

INSTRUCCIONES DE MANEJO DE PUERTOS

OUTPUT_LOW()

OUTPUT_LOW()
Sintaxis: output_low (pin) Funcin: PIN 0 Ejemplo: output_low(PIN_A0); PIN_A0 0

OUTPUT_LOW()
Sintaxis: output_low (pin) Funcin: PIN 0 Ejemplo: output_low(PIN_A0); PIN_A0 0

OUTPUT_HIGH()

OUTPUT_HIGH()
Sintaxis: output_high (pin) Funcin: PIN 1 Ejemplo: output_high(PIN_A0); PIN_A0 1

OUTPUT_HIGH()
Sintaxis: output_high (pin) Funcin: PIN 1 Ejemplo: output_high(PIN_A0); PIN_A0 1

EJEMPLO 1:
Generar una onda cuadrada por el Pin D2 de un periodo de 1 segundo.

RD2 16f877
5V

T = 1seg

DIAGRAMA DE FLUJO EJEMPLO1


INICIO

RD2

RETARDO (500ms)
RD2 0

RETARDO (500ms)

PROGRAMA EJEMPLO1
#include "C:\Development\pruebas\onda.h" void main() { while(1) { output_high(PIN_D2); delay_ms(500); output_low(PIN_D2); delay_ms(500); } }

OUTPUT_X( )
Sintaxis: output_a (valor); PUERTO A output_b (valor); PUERTO B output_c (valor); PUERTO C output_d (valor); PUERTO D output_e (valor); PUERTO E VALOR VALOR VALOR VALOR VALOR

Parmetros: valor es un int de 8 bits


Ejemplo:OUTPUT_B(0xf0); PUERTO B F0h

INPUT( )
Sintaxis:valor = input (pin). Funcin: Lee el valor del pin, si el pin es 0 voltios valor = 0 y si el pin es un nivel alto valor = 1.
Parmetros: pin, es la patita que se desea leer del puerto Ejemplo:valor = input(pin_A0);

INPUT_X( )
Sintaxis: valor = input_a (); VALOR valor = input_b (); VALOR valor = input_c (); VALOR valor = input_d (); VALOR valor = input_e (); VALOR PUERTO A PUERTO B PUERTO C PUERTO D PUERTO E

Parmetros: valor es un int de 8 bits


Ejemplo: valor = input_a(); valor Si PUERTO A = 21h, valor = 21h PUERTO A

EJEMPLO 2:
Leer el puerto b, si el dato ledo es menor 6AH, enciende L1, si no apagarlo.

RD2 16f877
L1

DATO

RB7 - RB0

DIAGRAMA DE FLUJO EJEMPLO2


INICIO

dato

PB

NO

SI

Dato < 0x6A RD2 0 RD2 1

PROGRAMA EJEMPLO2
#include "C:\Development\pruebas\EJEMPLO2.h" int dato; void main() { while(1) { dato = input_b(); if(dato< 0x6a) { output_high(pin_D2); } else { output_low(pin_D2); } } }

EJEMPLO 3:
Leer los 3 bits menos significativos del puerto a presentar en un displays en puerto b el valor 7 segmentos
A F RB6 -RB0 7 SEGMENTOS 16f877
B0 = A B1 = B B2 = C B3 = D B4 = E B5 = F B6 = G

B G

DATO

RA3 - RA0

TABLA DE 7 SEGMENTOS
SEG

G F E D C B A HEX B6 B5 B4 B3 B2 B1 B0 BIT 1 0 0 0 0 0 0 40
A
F G B

E
D

TABLA DE 7 SEGMENTOS
SEG

G F E D C B A HEX B6 B5 B4 B3 B2 B1 B0 BIT 1 0 0 0 0 0 0 79
A
F G B

E
D

DIAGRAMA DE FLUJO EJEMPLO3


INICIO

indice

PA&0x0f

dato = seg[indice]
PB = dato

PROGRAMA EJEMPLO3
#include "C:\Development\clases\EJEMPLO3.h" int seg[8] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78}; int dato,indice; void main() { while(1) { indice = input_a() & 0x07; dato = seg..[indice]; output_b(dato); } }

CONVERTIDOR ANALOGICO DIGITAL (CAD).

ECUACIONES DEL CAD


Dig

2#BITS - 1
011

010 001
0
Vref(-) Vref(+)

Van

(2#BITS - 1)[Van - Vref(-)]


= Dig Vref(+) - Vref(-)

SECUENCIA DE CAD
INICIO
SELECCIONAR CANAL ARRCANCAR CAD

TIEMPO DE CONVERSIN

FIN DE CAD (EOC)


SI

NO
TIEMPO DE MUESTREO

LEER CAD

FIN

REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON

ADCS1:0 FRECUENCIA CHS2-0 CANAL


00 Fosc/2 000 0 (RA0/AN0)

GO/DONE
1 ARRANCA CAD

01
10

Fosc/8
Fosc/32

001
010

1 (RA1/AN1)
2 (RA2/AN2)

0
ADON

FIN DE CAD ACTIVA CAD


DESACTIVA CAD

11

Frc

011
100 101 110 111

3 (RA3/AN3)
4 (RA5/AN4) 5 (RE0/AN5) 6 (RE1/AN6) 7 (RE2/AN7)

1
0

ESTRUCTURA DEL CAD


0 (RA0/AN0) 1 (RA1/AN1) 2 (RA2/AN2) 3 (RA3/AN3) 4 (RA5/AN4) 5 (RE0/AN5) 6 (RE1/AN6) 7 (RE2/AN7) CHS2-0

M U X

Van

CAD

RES DE CAD Vref(+)

Vref(-) EOC START

INSTRUCCIONES DEL CAD

SETUP_ADC_PORTS ()
Sintaxis:setup_adc_ports (value). Funcin: Inicializa los pines del PUERTOA y/o PUERTOE como seales de entrada digital/analgica.
Parmetros: value, constante definida en device.h, para seleccionar condiciones de pines PA o PE. Ejemplo: setup_adc_ports(RA0_ANALOG); selecciona al pin RA0 como seal analgica

SETUP_ADC()
Sintaxis:setup_adc(value). Funcin:Activa o desactiva al CAD, tambin selecciona el tiempo de conversin
Parmetros: value, constante definida en device.h, para seleccionar tiempo de conversin.

Ejemplo: setup_adc(ADC_CLOCK_DIV_2); selecciona Fosc/2

SET_ADC_CHANNEL()
Sintaxis:set_adc_channel(chan). Funcin:Selecciona canal y arranca la conversin.
Parmetros: chan, indica cual es el canal seleccionado para la conversin (chan = 0,1,2...7). Ejemplo: set_adc_channel(1); selecciona canal 1 RA!/AN1 para CAD

READ_ADC()
Sintaxis:valor = read_adc(). Funcin:Lee la conversin analgica digital, del canal seleccionado.
Parmetros: valor, variable de 16 u 8 bits, donde se aloja el valor de la CAD.

Ejemplo: conver = read_adc(); lee la CAD y la guarda en la variable conver

EJEMPLO 4:
Muestrear la seal analgica RA0/AN0 y encender L1 si Van0 < 2.73V Vcc = 5v
RA0 16f877

RD2

L1

DIAGRAMA DE FLUJO EJEMPLO4


INICIO
CONFIGURAR RA0 COMO ENTRADA ANALGICA
NO SELECCIONAR Fosc/2 D2 SELECCIONAR CANAL 0 ARRCANCAR CAD 0 D2 1

A
Volt = (float)cad/51 SI

Volt < 2.73

RETARDO DE 20SEG
LEER CAD

PROGRAMA EJEMPLO 4
#include "C:\Development\clases\EJEMPLO2.h"
int cad; float volt; void main() {setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_DIV_2); while(1) {set_adc_channel(0); delay_us(20); cad = read_adc(); volt = (float)cad/51; if(volt < 2.73) { output_high(pin_d2); } else { output_low(pin_d2); }
} }

TEMPORIZADORES / CONTADORES

INSTRUCCIONES DE TEMPORIZADORES / CONTADORES

SET_TIMER_X()
Sintaxis:set_timer_x(valor). Funcin:carga el temporizador/contador con la variable valor
Parmetros: valor, variable entera de 8 o 16 bits. Ejemplo: set_timer_0(124); TMR0

124

SETUP_TIMER_X()
Sintaxis:setup_timer_x(modo). Funcin: inicia al temporizador/contador, en un modo determinado
Parmetros: modo, constante definida en device.h, para inicializar T/C . Ejemplo: setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1); TMR0 con base de tiempo externa y Fi/1

MODOS DEL TIMER 0


RTCC_INTERNAL : BASE DE TIEMPO INTERNA RTCC_EXT_L_TO_H : BASE DE TIEMPO EXT. FLANCO DE SUBIDA

RTCC_EXT_H_TO_L : BASE DE TIEMPO EXT. FLANCO DE BAJADA RTCC_DIV_1 1:1


RTCC_DIV_256 : 1:256

GET_TIMER_X()
Sintaxis: valor = get_timer_x(). Funcin: lee registro del temporizador /contador y lo guarda en variable valor
Parmetros: valor, variable de 8 o 16 bits T/C .

Ejemplo: cont= get_timer_0(); cont

TMR0

TEMPORIZADOR/COTADOR 0
BUS DE DATOS

Fosc/4
RA4/T0CKI

0
1

1
T0SE T0CS PS2,PS1,PS0 PSA PREDIVISOR

TMR0

T0IF

Temporizacin = (4/Fosc)*(Predivisor)*(256-TMR0)

EJEMPLO 5:
Complementar L1 c/v que se pulse a S 3 veces.

RD2

Vcc
S

16f877
L1

T0CKI

MODULACION DE ANCHO DE PULSO (PWM).

ESQUEMA DE PWM
CCPR1L

CCPR1H
RC2/CCP1

R S

COMPARADOR

TMR2

T
CCPR1H = TMR2

COMPARADOR

Ta
TMR2 = PR2

PR2

ESQUEMA DE PWM
T = (4/Fosc)*(Predivisor)*(PR2+1)

Ta = (1/Fosc)*(Predivisor)*(CCPR1L)
Vprom = 5V*(Ta/T)

INSTRUCIONES DE PWM

SETUP_CCP_X()
Sintaxis: setup_ccpx (mode) . Funcin: inicia al CCP1 o 2, en un modo determinado
Parmetros: modo, constante definida en device.h, para inicializar CCPX .

Ejemplo: setup_ccp1(ccp_pwm); TMR1 como PWM

SET_PWMX_DUTY()
Sintaxis:set_pwm1_duty (value). Funcin: carga el tiempo en alto de CCP1 o 2, en modo pwm.
Parmetros: value, variable de 16 u 8 bits, usada para dar al pwm el tiempo en alto

Ejemplo: set_pwm2_duty (65), carga 65 en CCP2RL, para el tiempo en alto.

EJEMPLO 6:
Generar una seal Vo(t), proporcional al DATO de entrada al los pines RB6 - RB0, rango de DATO es de 0 a 100

RC2 16f877

Vo(t)

DATO

RB6-RB0

INTERRUPCIONES

INTERRUPCIN INT/RB0

EVENTO: FLANCO DE SUBIDA O DE BAJADA EN EL PIN RB0. DIRECTIVA: #INT_EXT

INTERRUPCIN INT/RB0
Ejemplo: Divisor de frecuencia Fo = Fi/2
RB0

RD2

Fo
RB7

T = 1seg

16f877 RB0

Fi

INTERRUPCIN TMR0

EVENTO: DESBORDAMIENTO DEL TIMER0 DIRECTIVA: ##INT_TIMER0

INTERRUPCIN TMR0
Generar una onda cuadrada por el Pin B7 de un periodo de 16 ms

RD2

16f877

5V

T = 0.1seg

INTERRUPCIN PUERTO SERIE


EVENTO: RECEPCIN DE DATO VIA PUERTO SERIE. DIRECTIVA: #INT_RDA

INTERRUPCIN PUERTO SERIE


Ejemplo: Encender el L1, cuando el PC enva 50 por el puerto serie y apagarlo cunado el PC enva 60 por el puerto serie.
RC7/RX RC6/RTX

RD2

PIC
L1

MAX 232

MODO CAPTURA

MODO CAPTURA
Ejemplo: Encender el L1, si la frecuencia de entrada (Fi) es mayor 0 1000Hz
RC2

RC2 16f877 RD2

Fi

T = 1seg

L1

INTERRUPCIN SPI

EVENTO: RECEPCIN DE DATO VIA PUERTO SPI DIRECTIVA: #INT_SSP

COMUNICACION SPI

PIC ESCLAVO 1
PIC MAESTRO
SDI RC3/SD0 RC4/SDI RC5/SCK SDO SCK

PIC ESCLAVO 2
SDI SDO SCK

INSTRUCCIONES DE MANEJO DE COMUNICACIN SPI

SPI_READ( )
Sintaxis:value = spi_read ( ). Funcin: Lee el buffer de recepcin del SPI
Parmetros: value, registro de 8 bits, donde se carga el dato leido

Ejemplo: dato = spi_read( ); El buffer de recepcin SPI es cargado en el registro Dato.

SPI_WRITE( )
Sintaxis: spi_write (value ). Funcin: Enva value a la interfaz SPI
Parmetros: value, registro de 8 bits, para ser enviado va SPI

Ejemplo: spi_read(89); La interfaz SPI enviar el numero 89.

SPI_DATA_IS_IN( )
Sintaxis: result = spi_data_is_in ( ). Funcin: Indica si existe un dato en el buffer SPI de entrada
Parmetros: result, result = 0, si no hay dato en el buffer, result = 1, si hay dato en el buffer.

Ejemplo: while(!spi_data_is_in()); Se queda esperando hasta que el buffer de entrada SPI se cargue con un dato.

SETUP_SPI( )

Sintaxis: setup_spi(modo). Funcin: Inicializa la interfaz SPI, segn el parmetro modo

MODOS DE LA INTERFAZ SPI


SPI_MASTER : El SPI es programado en modo maestro. SPI_SLAVE: El SPI: es programado como esclavo SPI_H_TO_L: Muestrea por cada flanco de bajada

SPI_L_TO_H: Muestrea por cada flanco de subida


SPI_CLK_DIV_4 : Perodo de SCK = 4/Fosc SPI_CLK_DIV_16 : Perodo de SCK = 16/Fosc SPI_CLK_DIV_64 : Perodo de SCK = 64/Fosc SPI_CLK_T2 : SCK = es la salida del TMR2

MODOS DE LA INTERFAZ SPI


EJEMPLO: setup_spi(spi_master|spi_l_to_h|spi_clk_div_16 );

La SPI, es programada como Maestra, muestrea por flanco de subida de SCK y el leloj SCK = 16/Fosc

COMUNICACION SPI
Ejemplo: Enviar por el PB del PIC maestro la C.A.D. del pin RA0 del PIC Vcc = 5v esclavo, c/v que pulsemos a S
RA0

CAD
Vcc S

PB

PIC ESCLAVO 1
SDI RC3/SD0 RC4/SDI

PIC MAESTRO

SDO

SCK

RD1

RC5/SCK

También podría gustarte