Professional Documents
Culture Documents
DEFINICION DE MICROCONTROLADOR
ARQUITECTURAS
ARQUITECTURA VON NEUMANN
BUS DE DATOS/PROGRAMA
PROCESADOR
BUS DE DIRECCION
MEMORIA DE DATOS/PROGRAMA
BUS DE 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
ARQUITECTURA INTERNA
BUS DE DATOS INTERNO MEMORIA DE DATOS
9 BITS
MPX FSR
VARIABLES
CONSTANTES MPX
ARQUITECTURA INTERNA
BUS DE DATOS INTERNO MEMORIA DE DATOS
9 BITS
MPX FSR
VARIABLES
CONSTANTES MPX MEMORIA EEPROM
PUERTOS
E/S
CONVERTIDOR A/D USART
ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192
BUS DE PROGRAMA
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
E/S
CONVERTIDOR A/D USART
ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192
BUS DE PROGRAMA
PC 13 BITS
PILA (STACK) DE 13 NIVELES
8 BITS
MEMORIA DE DATOS
14 BITS
REG. DE INSTRCCION
9 BITS
MPX FSR
VARIABLES
MEMORIA EEPROM MPX
7 BITS
8 BITS
DECODIFICADOR DE INSTRUCCIONES
CONSTANTES
PUERTOS
E/S
CONVERTIDOR A/D USART
ARQUITECTURA INTERNA
MEMORIA DE PROGRAMA 14x8192
BUS DE PROGRAMA
PC 13 BITS
PILA (STACK) DE 13 NIVELES
8 BITS
MEMORIA DE DATOS
14 BITS
REG. DE INSTRCCION
9 BITS
MPX FSR
VARIABLES
MEMORIA EEPROM MPX
7 BITS
8 BITS
DECODIFICADOR DE INSTRUCCIONES
RELOJ
CONSTANTES
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
E/S
CONVERTIDOR A/D USART
16F877
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
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
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
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
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
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
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 0 - 255
TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO
1 8 16
TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO
1 8 16 32
TIPO DE VARIABLES
TIPO NUMERO DE BITS RANGO CON SIGNO RANGO SIN SIGNO
1 8 16 32 32
-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 (--)
ESTRUCTURA DE CONTROL IF
SI CONDICIN?
NO
OPERACIN 2
OPERACIN 1
OPERACIN 2
OPERACIN 1
SI
OPERACIN 1 OPERACIN 2 OPERACIN3
{ operacin 1 }
operacin 2
OPERACIN 2
OPERACIN 1
OPERACIN 1
NO
OPERACIN 2
SI
CONTADOR<= 10
SI
OPERACIN 1
CONTADOR ++
NO
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
CANAL N = 0, CORTE
CANAL P = 1, CORTE CANAL N = 1, SAT. CANAL P = 0, SAT.
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
RD2
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 Parmetros: valor es un int de 8 bits
Ejemplo:OUTPUT_B(0xf0); PUERTO B Ejemplo:OUTPUT_B(75); PUERTO B F0h 75
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
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
dato
PB
NO
SI
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
E
D
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 E C B
TABLA DE 7 SEGMENTOS
SEG
BIT
G F E D C B A HEX B6 B5 B4 B3 B2 B1 B0 1 0 0 0 0 0 0 79
A F G E C B
indice
PA&0x0f
dato = seg[indice]
PB = dato
PROGRAMA EJEMPLO3
#include "C:\Development\clases\EJEMPLO3.h"
2#BITS - 1
011
010 001
0
Vref(-) Vref(+)
SECUENCIA DE CAD
INICIO
SELECCIONAR CANAL ARRCANCAR CAD
TIEMPO DE CONVERSIN
NO
TIEMPO DE MUESTREO
FIN
REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON
ADCS1:0 FRECUENCIA CHS2-0 CANAL 00 01 10 11 Fosc/2 Fosc/8 Fosc/32 Frc 000 001 010 011 100 101 110 111 0 (RA0/AN0) 1 (RA1/AN1) 2 (RA2/AN2) 3 (RA3/AN3) 4 (RA5/AN4) 5 (RE0/AN5) 6 (RE1/AN6) 7 (RE2/AN7)
GO/DONE 1 0 ADON 1 0 ACTIVA CAD DESACTIVA CAD ARRANCA CAD FIN DE CAD
M U X
Van
CAD
RES DE CAD
Vref(+)
EOC
START
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
RA0_ANALOG 0xE //!old only provided for compatibility NO_ANALOGS 7 // None ALL_ANALOG 0 // A0 A1 A2 A3 A5 E0 E1 E2 AN0_AN1_VSS_VREF 5 // A0 A1 VRefh=A3 AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08 // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2 AN0_AN1_AN2_AN3_AN4_AN5 0x09 // A0 A1 A2 A3 A5 E0 AN0_AN1_AN2_AN4_AN5_VSS_VREF 0x0A // A0 A1 A2 A5 E0 VRefh=A3 AN0_AN1_AN4_AN5_VREF_VREF 0x0B // A0 A1 A5 E0 VRefh=A3 VRefl=A2 AN0_AN1_AN4_VREF_VREF 0x0C // A0 A1 A5 VRefh=A3 VRefl=A2 AN0_AN1_VREF_VREF 0x0D // A0 A1 VRefh=A3 VRefl=A2 A
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 RA1/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
A
Volt = (float)cad/51 SI
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
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.
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
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
TMR0
T0SE T0CS
PREDIVISOR
T0IF
PS2,PS1,PS0
PSA
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
ESQUEMA DE PWM
CCPR1L CCPR1H RC2/CCP1
COMPARADOR
S
T
CCPR1H = TMR2
TMR2
COMPARADOR
Ta
TMR2 = PR2
PR2
ESQUEMA DE PWM
T = (4/Fosc)*(Predivisor)*(PR2+1)
Ta = (4/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 .
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 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
LOGICA DE INTERRUPCIONES
INTERRUPCIN INT/RB0
INTERRUPCIN INT/RB0
Ejemplo: Divisor de frecuencia Fo = Fi/2
RB0
Fo
RB7
T = 1seg
Fi
INTERRUPCIN TMR0
INTERRUPCIN TMR0
Generar una onda cuadrada por el Pin B7 de un periodo de 16 ms
RD2
16f877
5V
T = 16ms
RD2
PIC
L1
MAX 232
MODO CAPTURA
MODO CAPTURA
Ejemplo: Encender el L1, si la frecuencia de entrada (Fi) es mayor 1000Hz
RC2
RC2
Fi
16f877
RB0
T = 1seg
L1
INTERRUPCIN SPI
COMUNICACION SPI
PIC ESCLAVO 2
SDI SDO SCK
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
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_write(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( )
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 SDO SCK
PIC MAESTRO
RC3/SD0
RC4/SDI
RD1
RC5/SCK