microc

18
microC ® Líder en la programación de microcontroladores PIC Síguenos en | Inicio | La empresa. Contáctanos | Cómo comprar nuestros productos | Ofertas | Recursos | Mapa del sitio | Decodificador DTMF con el MT8870 - Ejemplo Comentarios de nuestros compradores en Mercado Libre Decodificador DTMF: El circuito consta de un PIC16F628A operando a partir de su oscilador interno de 4MHz. Se genera una interrupción debida al Timer0 cada 50 ms (0,050 segundos) que se toma como base de tiempo para contabilizar los diferentes intervalos necesarios para el funcionamiento del circuito. El propósito es activar y desactivar el pin RB0(6) por medio de una clave ingresada por el teclado del teléfono. La clave de activación es 1973, la clave de desactivación es 1974. Si el circuito se apaga por cualquier motivo, al encenderlo nuevamente se restablece el último estado que tenía el pin RB0. Además, al ingresar la clave 3579 el pin RB1(7) se activa durante 10 segundos. Al ingresar los dígitos el PIC espera 3 segundos. Si no se ingresa un nuevo dígito el PIC efectúa la tarea correspondiente. Si se ingresan menos o más de 4 dígitos el PIC no efectúa ninguna acción. Para ingresar una nueva clave simplemente hay que esperar más de 3 segundos. Cada 12 horas se enciende el pin RB2(8) por un lapso de 1 hora.

Upload: ramirexumsa

Post on 29-Dec-2015

104 views

Category:

Documents


0 download

DESCRIPTION

microC

TRANSCRIPT

Page 1: microC

    microC®

Líder en la programación de microcontroladores PIC

Síguenos en | Inicio   | La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | sitio |

Decodificador DTMF con el MT8870 - Ejemplo

Comentarios de nuestros compradores en Mercado Libre

Decodificador DTMF:

El circuito consta de un PIC16F628A operando a partir de su oscilador interno de 4MHz. Se genera una interrupción debida al Timer0 cada 50 ms (0,050 segundos) que se toma como base de tiempo para contabilizar los diferentes intervalos necesarios para el funcionamiento del circuito.El propósito es activar y desactivar el pin RB0(6) por medio de una clave ingresada por el teclado del teléfono. La clave de activación es 1973, la clave de desactivación es 1974. Si el circuito se apaga por cualquier motivo, al encenderlo nuevamente se restablece el último estado que tenía el pin RB0.Además, al ingresar la clave 3579 el pin RB1(7) se activa durante 10 segundos. Al ingresar los dígitos el PIC espera 3 segundos. Si no se ingresa un nuevo dígito el PIC efectúa la tarea correspondiente. Si se ingresan menos o más de 4 dígitos el PIC no efectúa ninguna acción. Para ingresar una nueva clave simplemente hay que esperar más de 3 segundos. Cada 12 horas se enciende el pin RB2(8) por un lapso de 1 hora.Debido a que el simulador Proteus no incluye este dispositivo dentro de sus librerías los circuitos se deben implementar de forma real para realizar las pruebas de funcionamiento. Para comprobar la correcta operación del DTMF MT8870 se puede armar un circuito muy simple como se indica en el probador para el MT8870, más abajo en Información complementaria.

Código en lenguaje C (mikroC).-

//DTMF.c//Microcontrolador: PIC16F628A.//Oscilador interno: 4MHz

char tecla[12], i=0, j, num_cifras, conteo=0, m=0, estado=0, pin=0, p=0;int k=0, n=0;

Page 2: microC

//Función principal.void main(){PORTB=0x00;  //Inicialización.CMCON=0x07;  //Pines RA<3:0> como E/S digital.TRISB=0x00;  //Puerto B como salida.OPTION_REG=0b11010111; //Timer0 como temporizador. Prescaler asignado                       //al Timer0. Prescaler 1:256.GIE_bit=1;             //Interrupciones habilitadas.T0IE_bit=1;            //Interrupción del Timer0 habilitada.RB0_bit=EEPROM_Read(0x00);  //Actualiza el pin RB0 a su último estado.                            //La primera vez que se enciende el PIC, el estado del                            //pin RB0 será 1.TMR0=61;               //Valor inicial del TMR0 (interrupción cada 50ms).while (1){ while (RA4_bit==0) ; //Esperar mientras no hay dato disponible. while (RA4_bit==1) ; //Dato disponible. Esperar mientras RA4 está en alto. i++; estado=1; num_cifras=i; tecla[i]=PORTA;      //Lee el dato disponible y lo almacena. conteo=0;}}

void interrupt(void){ TMR0=61;             //Valor inicial del TMR0. conteo++; if (conteo==60 && estado==1){  if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==3 && num_cifras==4){ //Clave:1973   RB0_bit=1;              //Activa el pin RB0.   EEPROM_Write(0x00,1);   //Guarda el estado del pin RB0.  }  if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==4 && num_cifras==4){ //Clave:1974   RB0_bit=0;              //Desactiva el pin RB0.   EEPROM_Write(0x00,0);   //Guarda el estado del pin RB0.  }  if (tecla[1]==3 && tecla[2]==5 && tecla[3]==7 && tecla[4]==9 && num_cifras==4){ //Clave:3579   RB1_bit=1;              //Activa el pin RB1.   for (j=1;j<=10;j++)     //Espera 10 segundos.    Delay_1sec();   RB1_bit=0;              //Desactiva el pin RB1.  }  i=0; conteo=0; estado=0; }  if (conteo==60)           //Reinicia la variable conteo si no se ha pulsado tecla alguna  conteo=0;                //en 3 segundos. 

 k++;

Page 3: microC

 if (k==28800){            //Contabiliza 12 horas (28.800x30x0,050 segundos).  k=0;  m++;  if (m==30){   m=0;   RB2_bit=1;              //Enciende el pin RB2.   pin=1;                  //Registra el encendido de RB2.  } }  if (pin==1){             //Contabiliza 1 hora si RB2 está encendido.  n++;  if (n==14400){          //Contabiliza 1 hora (14.400x5x0,050 segundos).   n=0;   p++;   if (p==5){    p=0;    RB2_bit=0;            //Apaga el pin RB2 luego de 1 hora.    pin=0;   }  } } T0IF_bit=0;               //Borra la bandera de interrupción.}

Esquema eléctrico del decodificador DTMF MT8870:

Page 4: microC

Información complementaria

Probador para el MT8870 MT8870 DTMF datasheet

Copyright © microCQuito-Ecuador

Trabajopolis.com

    microC®

Líder en la programación de microcontroladores PIC

Síguenos en | Inicio   | La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | sitio |

Page 5: microC

Reloj con display 7 segmentos - Ejemplo

Comentarios de nuestros compradores en Mercado Libre

Reloj de 24 horas con display 7 segmentos. La hora se muestra en formato 14:35 (dos de la tarde y 35 minutos). Dispone de botones para ajuste de horas y minutos. Un botón adicional permite activar la presentación (encender el display) por un lapso de 1 segundo. Luego de lo cual el display se apaga pero el conteo del tiempo sigue corriendo. Un pin se activa por un lapso de 1 segundo a dos horas diferentes programables por software. Para que los proyectos funcionen correctamente el PIC16F877A se tiene que polarizar de acuerdo al esquema indicado en la polarización básica (ver link más abajo).

Código en lenguaje C (mikroC)

//reloj7seg.c//Microcontrolador: PIC16F877A//Oscilador: Externo 4MHz (modo HS)//******//El Proteus 7.5 Professional no acepta la simulación del puerto E y presenta un mensaje de error//al intentar su simulación. Se probó un ejemplo básico para encender un LED el cual//funcionó perfectamente en la práctica pero el Proteus generaba el error "Internal Exception://acces violation in module PIC16.DLL".//******//Entradas://AA: Avance Automático al mantener presionado (también avance paso a paso al pulsar y soltar).//Ajuste de HORAS (AA) ->RB7(40)//Ajuste de MINUTOS (AA) ->RC7(26)//ACTIVAR ->RD7(30)//Salidas://Horas -> Puertos  A y B//Minutos -> Puertos C y D//Dos puntos (:) ->RE1(9)//Pulso de 1 segundo -> RE0(8)

//Función para transformar de binario(decimal) a 7 segmentos:char Bin2_7seg(char digit){ switch (digit){   case 0: return 0x3F;  //0x3F es el código 7-segmentos del 0.   case 1: return 0x06;  //0x06 es el código 7-segmentos del 1.   case 2: return 0x5B;   case 3: return 0x4F;   case 4: return 0x66;   case 5: return 0x6D;   case 6: return 0x7D;

Page 6: microC

   case 7: return 0x07;   case 8: return 0x7F;   case 9: return 0x67; }}

char contador=0,segundos=0,minutos=0,horas=0, minutosBCD, unidades, decenas, horasBCD, j=0;bit activar;

void main(){PORTA=0x00;RE0_bit=0;RE1_bit=0;ADCON1=0x06; //Pines RA<5:0> como E/S digital.PORTB=0x00;  //Inicialización.PORTC=0x00;PORTD=0x00;TRISA=0x00;  //Puerto A como salida.TRISB=0x80;  //RB7 como entrada. RB<6:0> como salidas.TRISC=0x80;  //RC7 como entrada. RC<6:0> como salidas.TRISD=0x80;  //RD7 como entrada. RD<6:0> como salidas.TRISE0_bit=0;  //RE0 como salida.TRISE1_bit=0;  //RE1 como salida.OPTION_REG=0b01010111;      //Pull ups habilitados.Timer0 como temporizador.                            //Prescaler asignado al Timer0. Prescaler 1:256.

TMR0=61;                    //Valor inicial del TMR0. Interrupción cada 50 ms.GIE_bit=1;                  //Interrupciones habilitadas.T0IE_bit=1;                 //Interrupción del Timer0 habilitada.activar=1;while (1){ if (segundos==60){  minutos++;  segundos=0; }

 if (minutos==60){  horas++;  minutos=0; }  if (horas==24) horas=0;

 //Encender los displays por 1 segundo al presionar ACTIVAR: if (activar==1){  //Encender los dos puntos ":" :  RE1_bit=1;    //Transformar los minutos para su presentación:  minutosBCD=Dec2Bcd(minutos);          //Transforma de binario a BCD.  unidades=0b1111&minutosBCD;           //Sacar las unidades.  decenas=0b11110000&minutosBCD;        //Sacar las decenas.

Page 7: microC

  decenas=decenas>>4;                   //Desplazar 4 bits a la derecha.  PORTD=Bin2_7seg(unidades);            //Unidades al puerto D.  PORTC=Bin2_7seg(decenas);             //Decenas al puerto C.

  //Transformar las horas para su presentación:  horasBCD=Dec2Bcd(horas);              //Transforma de binario a BCD.  unidades=0b1111&horasBCD;             //Sacar las unidades.  decenas=0b11110000&horasBCD;          //Sacar las decenas.  decenas=decenas>>4;                   //Desplazar 4 bits a la derecha.  PORTB=Bin2_7seg(unidades);            //Unidades al puerto B.  if (decenas==1)   PORTA=Bin2_7seg(decenas);            //Decenas al puerto A.  if (decenas==2)   PORTA=0x3B;                          //Formar el número "2".  if (decenas==0) PORTA=0;              //Apagar las decenas cuando valgan cero. } else{  PORTA=0;  PORTB=0;  PORTC=0;  PORTD=0;  PORTE=0; }  //Generar un pulso a una determinada hora, por ejemplo a las 2h01. if (horas==2 && minutos==01 && segundos==0)  RE0_bit=1; if (horas==2 && minutos==01 && segundos==1)  RE0_bit=0;

 //Generar un pulso a una determinada hora, por ejemplo a las 15h25. if (horas==15 && minutos==25 && segundos==0)  RE0_bit=1; if (horas==15 && minutos==25 && segundos==1)  RE0_bit=0;}}

void interrupt(void){ //Botón HORAS presionado: if (Button(&PORTB,7,1,0)){  activar=1;  horas++;  if (horas==24) horas=0;  Delay_ms(200); }  //Botón MINUTOS presionado: if (Button(&PORTC,7,1,0)){  activar=1;  minutos++;  if (minutos==60) minutos=0;  Delay_ms(200); } 

Page 8: microC

 //Botón ACTIVAR presionado: if (Button(&PORTD,7,1,0))  activar=1;

 //Medir 1 segundo (para el encendido de los displays): if (activar==1){  j++;  if (j==20){   j=0;   activar=0;  } }

 //Medidor de segundos (para el reloj): TMR0=61;                   //Valor inicial del TMR0. Interrupción cada 50 ms. contador++; if (contador==20){  segundos++;  contador=0; } T0IF_bit=0;              //Borra la bandera de interrupción.}

Esquema eléctrico:

Page 9: microC

Información complementaria

Display 7 segmentos de cátodo común (k) Polarización básica del PIC16F877A

Copyright © microCQuito-Ecuador

Page 10: microC

    microC®

Líder en la programación de microcontroladores PIC

Síguenos en | Inicio   | La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | sitio |

Comunicación PIC a PIC - Ejemplo

Comentarios de nuestros compradores en Mercado Libre

Comunicación entre dos PICs:

Comunicación entre dos microcontroladores PIC16F628A usando el módulo USART-Software del compilador mikroC.

Consta de dos proyectos, uno para cada PIC:

1. El proyecto PIC a PIC LCD es utilizado para recibir datos y presentarlos en un LCD 2x16.

2. El proyecto PIC a PIC se utiliza para enviar datos.

Código en lenguaje C (mikroC).-

Primer código fuente://PIC_a_PIC_LCD.c//Microcontrolador: PIC16F628A//Oscilador: Interno-4MHz//Este programa se almacena en uno de los dos microcontroladores (U2) y recibe continuamente un//dato (la letra 'r') cada 300 ms por el pin de recepción RB6(12). El pin de transmisión es//RB7(13). El dato recibido se va presentando en el LCD.//Comunicación PIC a PIC usando la biblioteca UART por Software (Software UART).//La velocidad de transmisión de 600 Baudios fue seleccionada experimentalmente por un//procedimiento de ensayo y error. El pin RB0(6) se enciende por 1 segundo en el caso de//intentar establecer una velocidad de transmisión muy alta o muy baja.

//Declaración de las 12 variables necesarias para la conexión//del módulo LCD.

Page 11: microC

sbit LCD_RS at RA4_bit;sbit LCD_EN at RA6_bit;sbit LCD_D4 at RA0_bit;sbit LCD_D5 at RA1_bit;sbit LCD_D6 at RA2_bit;sbit LCD_D7 at RA3_bit;

sbit LCD_RS_Direction at TRISA4_bit;sbit LCD_EN_Direction at TRISA6_bit;sbit LCD_D4_Direction at TRISA0_bit;sbit LCD_D5_Direction at TRISA1_bit;sbit LCD_D6_Direction at TRISA2_bit;sbit LCD_D7_Direction at TRISA3_bit;// Fin de declaración de variables de conexión.

char error, byte_read;void main(){CMCON=0x07;                 //Pines RA<3:0> como E/S digital.PORTB=0x00;TRISB0_bit=0;Lcd_Init();                 //Inicializa el LCD.Lcd_Cmd(_LCD_CLEAR);        //Borra el display.Lcd_Cmd(_LCD_CURSOR_OFF);   //Apaga el cursor.error = Soft_UART_Init(&PORTB, 6, 7, 600, 0); //Inicializa el módulo UART-Software a 600 Baudios.  if (error >0){    RB0_bit=1;    Delay_ms(1000);    RB0_bit=0;    while(1);              //Detiene el programa en caso de error.  }  Delay_ms(100);  while(1) {    byte_read = Soft_UART_Read(&error); //Recibe un dato y lo guarda en byte_read.    if (!error)            //Si no hay error.      Lcd_Chr_CP(byte_read); //Envía el dato recibido hacia el LCD.      Delay_ms(200);  }}

Segundo código fuente://PIC_a_PIC.c//Microcontrolador: PIC16F628A//Oscilador: Interno-4MHz//Este programa se almacena en uno de los dos microcontroladores (U1) y transmite continuamente un//dato (la letra 'r') cada 300 ms por el pin de transmisión RB6(12). El pin de recepción es//RB7(13).//Comunicación PIC a PIC usando la biblioteca UART por Software (Software UART).//La velocidad de transmisión de 600 Baudios fue seleccionada experimentalmente por un//procedimiento de ensayo y error. El pin RB0(6) se enciende por 1 segundo en el caso de

Page 12: microC

//intentar establecer una velocidad de transmisión muy alta o muy baja.

char error;void main(){CMCON=0x07;                 //Pines RA<3:0> como E/S digital.PORTB=0x00;TRISB0_bit=0;error = Soft_UART_Init(&PORTB, 7, 6, 600, 0); //Inicializa el módulo UART-Software a 600 Baudios.  if (error >0){    RB0_bit=1;    Delay_ms(1000);    RB0_bit=0;    while(1);              //Detiene el programa en caso de error.  }  Delay_ms(100);  while (1){   Soft_UART_Write('r');  //Envía el carácter 'r' cada 300 ms.   Delay_ms(300);  }}

Esquema eléctrico de la comunicación PIC a PIC:

Page 13: microC
Page 14: microC

Copyright © microCQuito-Ecuador

    microC®

Líder en la programación de microcontroladores PIC

Síguenos en | Inicio   | La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | sitio |

Tacómetro digital con PIC - Ejemplo

Comentarios de nuestros compradores en Mercado Libre

El circuito consta de un PIC16F88, una pantalla LCD 2x16 , un sensor tipo herradura GP3S62 de Sharp, y un regulador de 5V/100mA. El Timer0 del PIC trabaja como contador de las transiciones alto-bajo en el pin RA4/T0CKI durante 1 segundo. Este valor corresponde al número de revoluciones por segundo (r.p.s) el cual es transformado a r.p.m y rad/s para su presentación en el LCD. La lectura se actualiza continuamente cada 2 segundos. Se genera una transición cada vez que la ranura en el disco giratorio pasa  en frente del emisor de luz, es decir una transición por vuelta.

Código en lenguaje C (mikroC)

//Tacometro.c//El registro OPTION_REG tiene todos sus bits en 1 después del //encendido por lo tanto el Timer0 actúa como contador, //incrementa en transición descendente y el prescaler //está asignado al WDT.//Declaración de las 12 variables necesarias para la conexión//del módulo LCD.sbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB6_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;

Page 15: microC

sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB6_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit;// Fin de declaración de variables de conexión.

char texto1[7], texto2[7], numflancos=0;int rpm, rads;

void main(){OSCCON=0x40; //Oscilador interno a 1MHz.ANSEL=0x00;  //Pines AN<6:0> como E/S digital.Lcd_Init();                //Inicializa el LCD.Lcd_Cmd(_LCD_CLEAR);       //Borra el display.Lcd_Cmd(_LCD_CURSOR_OFF);  //Apaga el cursor.Lcd_Out(1,1,"TacometroDigital");Lcd_Out(2,1,"Wmax=15.300 rpm");Delay_ms(3000);Lcd_Cmd(_LCD_CLEAR);       //Borra el display.while (1){ TMR0=0;                   //Inicializa el registro TMR0. Delay_1sec();             //Cuenta durante 1 segundo. numflancos=TMR0;          //numflancos=velocidad en rps. rpm=60*numflancos;        //Transformación a rpm. rads=6.28*numflancos;     //Transformación a rad/s. IntToStr(rpm,texto1);     //Transformación de rpm a texto. Lcd_Out(1,1,"W[rpm]="); Lcd_Out(1,10,texto1); IntToStr(rads,texto2);    //Tramsformación de rads a texto. Lcd_Out(2,1,"W[rad/s]="); Lcd_Out(2,10,texto2); Delay_ms(1000);           //Espera para la nueva medición.}}

Esquema eléctrico del tacómetro digital

Page 16: microC

Información complementaria

GP3S62 datasheet (hoja de referencia)

Copyright © microCQuito-Ecuador