Está en la página 1de 52

CURSO DE LENGUAJE C PARA

MICROCONTROLADORES PIC

PIC12F683
CURSO DE LENGUAJE C PARA
MICROCONTROLADORES PIC

PIC16F887
QUE ES UN MICROCONTROLADOR?

CIRCUITO INTEGRADO QUE CONTINE EN SU


INTERIOR LAS SIGUIENTES UNIDADES BÄSICAS:

•CPU
•MEMORIA RAM Y ROM
•PUERTOS DE ENTRADA Y SALIDA
PIC12F683
 CPU RISC
 8-bits de datos
 14 bits de memoria de programa
 Arquitectura Harvard, donde la memoria
de programa y la memoria de datos se
encuentran en buses diferentes,
permitiendo mayor velocidad de acceso.
Principales características:

• Arquitectura RISC
• Frecuencia de Operación 0-20 MHz
• Oscilador interno de precisión calibrado de fábrica +/- 1%
• Selección de frecuencia por Software con un rango de
8MHz a 31KHz
• Voltaje de alimentación de 2.0-5.5V
• 6 Pines de Entrada/Salida
-Alta corriente de salida (source/sink) para operar
directamente un LED
-Resistencias de pull-up programables individualmente
por software
Principales características (2)

• 2K de memoria ROM con tecnología FLASH


-El Chip puede ser reprogramado hasta 100.000 veces
• Programación Serie In-Circuit.
El Chip puede ser programado aun instalado en la tarjeta.
• 256 bytes de memoria EEPROM
-Los datos Pueden ser escritos en EEPROM más de
1.000.000 de veces
• 128 bytes memoria RAM
• convertidor: A/D
-4-canales
-resolución 10-bits
• 3 temporizadores/contadores independientes
• Temporizador Watch-dog
Pines del PIC12F683
Características (2)
 14 fuentes de interrupciones
 Memoria de pila (stack) de 8 niveles
de profundidad
 Protecciones:
• Power-on Reset (POR)
• Power-up Timer (PWRT)
• Oscillator Start-up Timer (OST)
• Watchdog Timer (WDT) independiente del
cristal.
Puertos de entrada y salida
 RESUMEN DE PUERTOS ENTRADA/SALIDA
Características (periféricos)
 Timer 0: timer/counter de 8 bits con un
pre-escalador de 8 valores.
 Timer 1: 16-bit timer/counter con pre-
escalador
 Timer 2: 8-bit timer/counter con registro
de estado de 8-bit, pre-escalador y post-
escalador
 Un módulo de Capture, Compare, PWM
• Capture es de 16-bit, max. resolución es 12.5
ns
• Compare es de 16-bit, max. resolución es 200
Características (periféricos 2)
 Convertidor analógico a digital de
10-bit multi-canal
Arquitectura interna
 Arquitectura HARVARD.
 Buses separados (datos e
instrucciones).
 Memoria de programa : 14 bits.
 Memoria de datos: 8 bits.
 Recursos mapeados en memoria de
datos.
Arquitectura interna
PUERTOS
FUNCIONES PUERTO GPIO
Terminal
Funciones
GP5/T1CKI/OSC1/C Ent. Digital Sal. Digital Timer1 clock
LKIN

GP4/AN3/T1G/OSC Ent. Digital Sal. Digital Entrada Analógica


2/CLKOUT
3
GP3/MCLR/VPP Ent. Digital MCLR VPP

GP2/AN2/T0CKI/IN Ent. Digital Sal. Digital Entrada Analógica PWM


T/COUT/CCP1
2
GP1/AN1/CIN-/VR Ent. Digital Sal. Digital Entrada Analógica
EF/ICSPCLK ICSP CLOCK
1
GP0/AN0/CIN+/ICS Ent. Digital Sal. Digital Entrada Analógica ICSP DATA
PDAT/ULPWU
0
GPIO
TRISIO
REGISTRO ANSEL
DIAGRAMA A BLOQUES TMR0 Y PRESCALER
DIAGRAMA A BLOQUES TMR0 Y PRESCALER
ADCON0
MODULO ADC
REGISTRO INTCON
Tipos de datos
Tipo bytes Rango
(unsigned) char 1 0 .. 255
signed char 1 - 128 .. 127
(signed) short (int) 1 - 128 .. 127
unsigned short (int) 1 0 .. 255
(signed) int 2 -32768 .. 32767
unsigned (int) 2 0 .. 65535
(signed) long (int) 4 -2147483648 ..2147483647
unsigned long (int) 4 0 .. 4294967295
Tipos de datos 2
Tipo bytes Rango

float 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038

Double 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038

long double 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038


Asignación de datos
 Decimal
• int i = 10; /* decimal 10 */
• int j = -10; /* decimal -10 */
• int p = 0; /* decimal 0 */

 Hexadecimal
• short x = 0x37; /* decimal 55 */
• short y = 0x7F; /* decimal 127 */
• int z = 0x125; /* decimal 293 */
Asignación de datos
 Octal
• int m = 023; /* 19 */
• short n = 016; /* 14 */

 Binario
• char dato = 0b00001111;
• short dat = 0b10101010;
• unsigned char sig = 0b11001100;

 ASCII
• char dat = ‘a’;
• char m = ‘5’;
Registros asociados
Entrada/salida
Configuración
 GPIO TRISIO
Entrada o salida
 SALIDA DE DATOS : 0
 ENTRADA DE DATOS: 1

 La asignación es individual
correspondiente a cada terminal del
puerto.
Acceso individual de bits 1
 mikroC te permite acceso individual en variables
de 8 bits (char and unsigned short). Simplemente
usando el selector (.) seguido de uno de los
identificadores F0, F1, … , F7. Siendo F7 el bit
mas significativo.

 Ejemplo:
GPIO.F0 = 1;
GPIO.F5 = 0;
GPIO.F2 = 1;

Los identificadores F0–F7 no se reconocen en minúsculas.


NOTA: Entre dos accesos a bits se debe tener un retardo
mínimo de 2 microsegundos.
Entrada o salida
 Si deseamos configurar el puerto GPIO
con la siguiente asignación:
GPIO0 entrada
GPIO1 entrada
GPIO2 entrada
GPIO3 entrada
GPIO4 salida
GPIO5 salida

 Posibles instrucciones a utilizar


TRISIO = 0b001111;
TRISIO = 0x0F;
TRISIO = 15;
ANSEL

Programación del registro ANSEL.

Este registro define cuales de las 4 entradas se configurarán


como entradas analógicas.

ANSEL = 0B0011;

Configura AN0 y AN1 como entradas analógicas.


Delay_ms (retardo por software)
 Descripción: Crea un retardo por software dado el
tiempo en milisegundos (constante). El rango de constantes
aplicables a la función depende de la frecuencia del
oscilador. Es una función interna; El código es generado en
el lugar donde se hace la llamada, así que la llamada de
esta función no cuenta dentro del
limite de llamadas anidadas.

 void Delay_ms(const time_in_ms)

 Ejemplo:
Generar un retardo de 1 segundo

Delay_ms(1000); /* Pausa de un segundo */


Estructura de un programa en C
( ciclo while )
// Definición de variables globales

// Definición de funciones

void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
while ( 1 )
{

// Programa de usuario

}
}
Estructura de un programa en C
( ciclo for )
// Definición de variables globales

// Definición de funciones

void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
for ( ; ; )
{

// Programa de usuario

}
}
Estructura de un programa en C
( ciclo do - while )
// Definición de variables globales

// Definición de funciones

void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
do
{

// Programa de usuario

} while ( 1 ) ;
}
1.- PWM
 Crear un programa que manipule el
modulo PWM y encienda de manera
gradual el led colocado en la salida
PWM que es el bit 2 del puerto GPIO
ubicado en la terminal 5 del
PIC12F683.
PWM (algoritmo)
• Configurar el bit GP2 del puerto GPIO
como salida de datos
• Configurar el bit GP5 como entrada
• Deshabilitar las entradas analogicas con
el registro ANSEL.
• Configurar registro OSCCON a 8 MHZ
• Configurar el PWM
• Entrar al ciclo infinito para manipular el
PWM conel comando PWM1_Set_Duty
DIAGRAMA ELECTRICO
Control PWM
char i,contador=0,estado=1;

void main(){

ANSEL = 0; // Configura los pines AN como E/S digitales.

TRISIO2_bit = 0; //GPIO2 como salida, aqui esta el PWM


TRISIO5_bit=1; // GPIO5 como entrada boton de aumento de pwm
OSCCON = 0B01110111;//8MHZ,OSC INTERNO,SYSTEM CLOCK USA
OSC INTERNO
PWM1_Init(5000); //Frecuencia PWM.
PWM1_Start();

for(i=0; i<255; i++) {


PWM1_Set_Duty(i);
Delay_ms(10);
}

PWM1_Set_Duty(100);
Control PWM
while (1){
if (Button(&GPIO,5,1,0)) estado=0; //Si se pulsa SW3.
if (estado==0 && Button(&GPIO,5,1,1)){ //Si se pulsa y se libera.
contador++;
if (contador>4) contador=0;
estado=1;
}
switch (contador){
case 0:
PWM1_Set_Duty(0);
break;
case 1:
PWM1_Set_Duty(64);
break;
case 2:
PWM1_Set_Duty(127);
break;
case 3:
PWM1_Set_Duty(191);
break;
case 4:
PWM1_Set_Duty(255);
}
}
}
Diagrama electrico (esquemático)
PWM ADC (programa)

char i;
void main(){
unsigned int Valor_ADC;
CMCON0 = 7; // Disable Comparators
TRISIO = 0b00001101; // All Outputs, except GP0 and GP3
ANSEL = 0B00110001; // GP0 analog i/p
ADCON0 = 0B10000001;//Justificado a la derecha,
//ADCON,Referencia + VDD
TRISIO2_bit = 0; //GPIO2 como salida, aqui esta el PWM
TRISIO5_bit=1; // GPIO5 como entrada boton de aumento
de // pwm
OSCCON = 0B01110111;//8MHZ,OSC INTERNO,SYSTEM
CLOCK //USA OSC INTERNO
PWM ADC (programa)

PWM1_Init(5000); //Frecuencia PWM.


PWM1_Start();

while (1){
Valor_ADC = ADC_Read(0);
Valor_ADC = Valor_ADC >>2;
PWM1_Set_Duty(Valor_ADC);
Delay_ms(100);

}
}
Interrupciones TMR0
#define L1 GP2_bit
unsigned int ticks = 0;
void interrupt() {
ticks++ ; // Con una interrupción la cnt se incrementa
en 1
if (ticks >= 50) {
L1^=1;
ticks = 0;
}
TMR0 = 100; // El valor inicial se devuelve en el
temporizador TMR0
INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se
pone a 0
}
Interrupciones TMR0

void main (void) { // Inicia programa principal


ANSEL = 0;
OSCCON = 0B01110111;//8MHZ,OSC
INTERNO,SYSTEM CLOCK USA OSC INTERNO
OPTION_REG = 0x87; // Pre-escalador se le
asigna al temporizador TMR0
TMR0 = 100; // Temporizador T0 cuenta de 96 a
255
INTCON = 0xA0; // Habilitada interrupción TMR0
TRISIO2_bit = 0; //GPIO2 como salida

while(1) { // Inicio ciclo infinito

}
Interrupciones TMR1
#define L1 GP2_bit
unsigned short ticks = 0;
void interrupt() {
ticks++ ; // Con una interrupción la cnt se incrementa en 1

if (ticks >= 5) {
L1^=1;
ticks = 0;
}

TMR1L = 0x58;
TMR1H = 0x9E; // El valor inicial se devuelve en el
//temporizador TMR1
INTCON = 0x40; // Bit T0IE se pone a 1, el bit T0IF se pone a 0
PIE1 = 0X01; // Habilita inerrupcion Timer 1
PIR1 = 0; // se clarea bandera interrupcion Timer 1
}
Interrupciones TMR1
void main (void) { // Inicia programa principal
ANSEL = 0;
OSCCON = 0B01110111;//8MHZ,OSC INTERNO,SYSTEM
CLOCK //USA OSC INTERNO
OPTION_REG = 0x87; // Pre-escalador se le asigna al
//temporizador TMR0
T1CON = 0X31; //OSC/4 HABIL, ENTRE 8, Timer1 habilitado
//, lp off
TMR1L = 0; // Temporizador T0 cuenta de 0 a 65536
TMR1H = 0;
INTCON = 0xC0; // Habilitada interrupción PEIE
PIE1 = 0X01; // Habilita inerrupcion Timer 1
PIR1 = 0;// se clarea bandera interrupcion Timer 1
TRISIO2_bit = 0; //GPIO2 como salida
while(1) { // Inicio ciclo infinito

}
}
Interrupciones TMR2
#define L1 GP2_bit
unsigned short ticks = 0;
void interrupt() {
ticks++ ; // Con una interrupción la cnt se incrementa en
1

if (ticks >= 25) {

L1^=1;
ticks = 0;

INTCON = 0x40; // Bit INTE: se pone a 1, el bit INTF se


pone a 0
PIR1 = 0; // se clarean banderas Timer 2

}
Interrupciones TMR2
void main (void) { // Inicia programa principal

ANSEL = 0;
OSCCON = 0B01110111;//8MHZ,OSC INTERNO,SYSTEM
CLOCK USA OSC INTERNO
INTCON = 0xC0; // Habilitada interrupción tIMER 2
PIE1 = 0X02; // Se habilita Timer 2
PIR1 = 0; // se clarean banderas Timer 2
T2CON = 0X4F;//POST entre 1o, Preescaler entre 16
PR2 = 250;
TRISIO2_bit = 0; //GPIO2 como salida

while(1) { // Inicio ciclo infinito

}
Interrupciones Externas
#define L1 GP4_bit
unsigned short ticks = 0;
void interrupt() {
ticks++ ; // Con una interrupción la cnt se incrementa en
1

if (ticks >= 4) {

L1^=1;
ticks = 0;

Delay_ms(20); // retardo para evitar rebotes


INTCON = 0x10; // Bit INTE: se pone a 1, el bit INTF se
pone a 0

}
Interrupciones Externas

void main (void) { // Inicia programa principal


ANSEL = 0;
OSCCON = 0B01110111;//8MHZ,OSC
INTERNO,SYSTEM //CLOCK USA OSC INTERNO
OPTION_REG = 0B10000000;//Interrupcion externa 1
a //0 se activa
INTCON = 0x90; // Habilitada interrupción Externa
TRISIO2_bit = 1; //GPIO2 como entrada
L1 = 0;
TRISIO4_bit = 0; //GPIO4 como salida

while(1) { // Inicio ciclo infinito

También podría gustarte