Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MICROCONTROLADORES PIC
PIC12F683
CURSO DE LENGUAJE C PARA
MICROCONTROLADORES PIC
PIC16F887
QUE ES UN MICROCONTROLADOR?
•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)
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;
ANSEL = 0B0011;
Ejemplo:
Generar un retardo de 1 segundo
// Definición de funciones
void main(void)
{
// Definición de variables locales
// 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
// 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
// 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(){
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)
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
}
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
L1^=1;
ticks = 0;
}
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
}
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;
}
Interrupciones Externas