Microprocesadores Introducción al Lenguaje C - Parte VI Prof. Luis Araujo Universidad de Los Andes Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores Conversor Análogo Digital (ADC) Prof. Luis Araujo Microprocesadores adc 4620.h # ifndef ADC_4620_H # define ADC_4620_H // Definiciones void ADC_init ( unsigned int ); int ADC_get ( char ); # endif Prof. Luis Araujo Microprocesadores adc 4620.h # define ADC_VREF_P # define ADC_VREF_N 0 x0010 0 x0020 # define # define # define # define # define # define # define # define # define # define # define # define # define 0 x000E 0 x000D 0 x000C 0 x000B 0 x000A 0 x0009 0 x0008 0 x0007 0 x0006 0 x0005 0 x0004 0 x0003 0 x0002 ADC_AN01 ADC_AN02 ADC_AN03 ADC_AN04 ADC_AN05 ADC_AN06 ADC_AN07 ADC_AN08 ADC_AN09 ADC_AN10 ADC_AN11 ADC_AN12 ADC_AN13 Prof. Luis Araujo Microprocesadores adc 4620.h # define ADC_10bit # define ADC_08bit 0 x8000 0 x0000 # define # define # define # define # define # define # define # define 0 x0380 0 x0300 0 x0280 0 x0200 0 x0180 0 x0100 0 x0080 0 x0000 ADC_20TAD ADC_16TAD ADC_12TAD ADC_08TAD ADC_06TAD ADC_04TAD ADC_02TAD ADC_00TAD Prof. Luis Araujo Microprocesadores adc 4620.h # define # define # define # define # define # define # define ADC_FRC ADC_FOSC64 ADC_FOSC16 ADC_FOSC04 ADC_FOSC32 ADC_FOSC08 ADC_FOSC02 # define ADC_OFF 0 x0300 0 x0600 0 x0500 0 x0400 0 x0200 0 x0100 0 x0000 0 x0000 Prof. Luis Araujo Microprocesadores adc 4620.c # include < xc .h > # include " adc_4620 . h " void ADC_init ( unsigned int conf ) { if ( conf == ADC_OFF ) { ADCON1 = 0 x0F ; ADCON0 = 0 x00 ; } else { ADCON2 = conf >> 8; ADCON1 = conf ; ADCON0 = 0 x01 ; } } Prof. Luis Araujo Microprocesadores adc 4620.c int ADC_get ( char canal ) { if ( ADON == 1) { ADCON0 = ( canal << 2) | 0 x01 ; GO_nDONE = 1; while ( GO_nDONE == 1) continue ; if ( ADFM == 1) return ( int ) ADRESH * 256 + ADRESL ; else return ( int ) ADRESH ; } return 0; } Prof. Luis Araujo Microprocesadores Sensor de Temperatura LM35 Prof. Luis Araujo Microprocesadores Ejercicio 16 (E16) Prof. Luis Araujo Microprocesadores Ejercicio 16 (E16) # include < xc .h > # include < stdio .h > # include < string .h > # include " lcd_4bit . h " # include " adc_4620 . h " // Palabra de CONFIGURACION void main ( void ) { float temperatura ; char texto [17] = " ** Termometro ** " ; OSCCON = 0 x68 ; LCD_init (); ADC_init ( ADC_AN01 | ADC_10bit | ADC_FOSC04 | ADC_02TAD ); // ...... } Prof. Luis Araujo Microprocesadores Ejercicio 16 (E16) LCD_clear (); LCD_puts ( texto ); while (1) { temperatura = ADC_get (0) * 500.0 / 1023; sprintf ( texto , " %5.2 f %cC " , temperatura ,0 xDF ); LCD_gotoxy (4 ,1); LCD_puts ( texto ); } Prof. Luis Araujo Microprocesadores Ejercicio 16 (E16) Imprimir en Entero sprintf ( texto , " %02 d %cC " ,( int ) temperatura , 0 xDF ); Trabajando con 8 bits ADC_init ( ADC_AN01 | ADC_08bit | ADC_FOSC04 | ADC_02TAD ); temperatura = ADC_get (0) * 500.0 / 255; Prof. Luis Araujo Microprocesadores Ejercicio 17 (E17) Prof. Luis Araujo Microprocesadores Ejercicio 17 (E17) void main ( void ) { int temperatura ; char texto [17] = " ** Termometro ** " ; OSCCON = 0 x68 ; LCD_init (); ADC_init ( ADC_AN01 | ADC_10bit | ADC_FOSC04 | ADC_02TAD | ADC_VREF_P ); LCD_clear (); LCD_puts ( texto ); while (1) { temperatura = ADC_get (0) * 100 / 341; sprintf ( texto , " %02 d %cC " , temperatura ,0 xDF ); LCD_gotoxy (4 ,1); LCD_puts ( texto ); } } Prof. Luis Araujo Microprocesadores Interrupciones Existen 2 métodos para comunicar el microcontrolador y los dispositivos externos Sondeo Interrupciones Prof. Luis Araujo Microprocesadores Sondeo En este método, el microcontrolador accede al dispositivo externo en un tiempo especifico y obtiene la información requerida. El perı́odo de tiempo es determinado por el usuario. Cuando se utiliza el método, el microcontrolador debe acceder al dispositivo y solicitar la información que se necesita para ser procesada. En este método, no hay independencia de los dispositivos externos mismos, sino que dependen del microcontrolador. El inconveniente principal de utilizar este método es que se produce pérdida de tiempo. El microcontrolador tiene que esperar y revisar si una nueva información llegó. Prof. Luis Araujo Microprocesadores Interrupción La Interrupción es una señal enviada al microcontrolador para indicar un acontecimiento que requiere atención inmediata. La Interrupción pide al procesador que pare la ejecución del programa en curso y ejecute un código especial. El método de interrupción es la opción para transferir la información generada por los dispositivos externos al interior del microcontrolador, por ellos mismos. Una vez que el ocurra la Interrupción, el microcontrolador puede acceder y recibir la información y utilizarla. Finalizada la interrupción, el microcontrolador continua la ejecución del programa. Prof. Luis Araujo Microprocesadores Fuentes de Interrupción Interrupciones externas INTx Interrupción por cambio lógico en el puerto B (pines RB7 a RB4) Interrupciones por desborde de los Timers Interrupción del Convertidor A/D Interrupción del Puerto Serial Interrupción del Módulo CCP Interrupción del EEPROM etc Prof. Luis Araujo Microprocesadores Interrupciones PIC16F87 Prof. Luis Araujo Microprocesadores Configurar Interrupciones XXIE bit que permite activa la interrupción de un dispositivo especifico XXIF bit que indica que se activo la interrupción de un dispositivo especifico GIE bit que permite habilitar las Interrupciones PEIE bit que permite activa el segundo nivel de interrupciones bit = 1 → Activada o Habilitada bit = 0 → Desactivada o Des-habilitada Prof. Luis Araujo Microprocesadores Interrupciones PIC16F87 Prof. Luis Araujo Microprocesadores Interrupciones PIC18F4620 Prof. Luis Araujo Microprocesadores Interrupciones PIC18F4620 Prof. Luis Araujo Microprocesadores Configurar Interrupciones IPEN bit que permite habilitar el uso de la prioridad en las interrupciones IPEN = 1 → Prioridad Habilitada IPEN = 0 → Prioridad Des-habilitada GIEH/GIE bit que permite habilitar las Interrupciones de Alto Nivel GIEL/PEIE bit que permite habilitar las Interrupciones de Bajo Nivel XXIP bit que permite establecer la prioridad de la interrupción XXIP = 1 → Interrupción de Alta Prioridad XXIP = 0 → Interrupción de Baja Prioridad Prof. Luis Araujo Microprocesadores Interrupciones PIC18F4620 Prof. Luis Araujo Microprocesadores Interrupciones PIC18F4620 Prof. Luis Araujo Microprocesadores Interrupciones PIC18F4620 Prof. Luis Araujo Microprocesadores Ejercicio 18 (E18) Prof. Luis Araujo Microprocesadores Ejercicio 18 (E18) # include < xc .h > # include < stdio .h > # include " lcd_4bits . h " // Palabra de Configuracion char hor = 0 , min = 0 , seg = 0; char texto [17] = " ** Cronometro ** " ; char contar = 0; void Delay_Seg ( char ); Prof. Luis Araujo Microprocesadores Ejercicio 18 (E18) void main ( void ) { OSCCON = 0 x68 ; INTE = 1; GIE = 1; LCD_init (); LCD_clear (); LCD_puts ( texto ); sprintf ( texto , " %02 d : %02 d : %02 d " , hor , min , seg ); LCD_gotoxy (4 ,1); LCD_puts ( texto ); while (1) { } } Prof. Luis Araujo Microprocesadores Ejercicio 18 (E18) if ( contar == 0) continue ; Delay_Seg (1); if ( contar == 1) { if ( seg == 59) { seg = 0; if ( min == 59) { min = 0; if ( hor == 23) hor = 0; else hor ++; } else min ++; } else seg ++; } sprintf ( texto , " %02 d : %02 d : %02 d " , hor , min , seg ); LCD_gotoxy (4 ,1); LCD_puts ( texto ); Prof. Luis Araujo Microprocesadores Ejercicio 18 (E18) void interrupt isr ( void ) { if ( INTF == 1) { if ( contar == 0) contar = 1; else contar = 0; INTF = 0; } } Prof. Luis Araujo Microprocesadores