Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DEFINICION DE MICROCONTROLADOR
ARQUITECTURAS
ARQUITECTURA VON NEUMANN
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
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
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
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
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
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
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
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
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?
If(condicin) { operacin 1 }
NO
OPERACIN 2
OPERACIN 1
operacin 2
OPERACIN 2
OPERACIN 1
NO
NO CONDICIN 2?
SI
OPERACIN 1 OPERACIN 2 OPERACIN3
OPERACIN 2
SI
OPERACIN 1
NO
OPERACIN 2
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
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)
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
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
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
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
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); } }
2#BITS - 1
011
010 001
0
Vref(-) Vref(+)
Van
SECUENCIA DE CAD
INICIO
SELECCIONAR CANAL ARRCANCAR CAD
TIEMPO DE CONVERSIN
NO
TIEMPO DE MUESTREO
LEER CAD
FIN
REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON
GO/DONE
1 ARRANCA CAD
01
10
Fosc/8
Fosc/32
001
010
1 (RA1/AN1)
2 (RA2/AN2)
0
ADON
11
Frc
011
100 101 110 111
3 (RA3/AN3)
4 (RA5/AN4) 5 (RE0/AN5) 6 (RE1/AN6) 7 (RE2/AN7)
1
0
M U X
Van
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.
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 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. 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
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 .
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
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 .
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
INTERRUPCIN INT/RB0
INTERRUPCIN INT/RB0
Ejemplo: Divisor de frecuencia Fo = Fi/2
RB0
RD2
Fo
RB7
T = 1seg
16f877 RB0
Fi
INTERRUPCIN TMR0
INTERRUPCIN TMR0
Generar una onda cuadrada por el Pin B7 de un periodo de 16 ms
RD2
16f877
5V
T = 0.1seg
RD2
PIC
L1
MAX 232
MODO CAPTURA
MODO CAPTURA
Ejemplo: Encender el L1, si la frecuencia de entrada (Fi) es mayor 0 1000Hz
RC2
Fi
T = 1seg
L1
INTERRUPCIN SPI
COMUNICACION SPI
PIC ESCLAVO 1
PIC MAESTRO
SDI RC3/SD0 RC4/SDI RC5/SCK SDO SCK
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
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( )
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