Last active
December 24, 2015 16:29
-
-
Save davidae1704/6828459 to your computer and use it in GitHub Desktop.
digitalizador de señales de audio por medio de ADC del PIC18F4550
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//primer avance del codigo | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <p18f4550.h> | |
#include <xc.h> | |
//#include "lcd.h" //incluir los header para la LCD y delays | |
//Directivas para activar los bits de configuración | |
#pragma config FOSC = INTOSCIO_EC //Oscilador Interno, Puerto A RA6 activo, | |
#pragma config WDT = OFF //Watchdog timer apagado | |
#pragma config PBADEN = OFF //Parte baja del puerto B digitales | |
#pragma config MCLRE = ON //MCLRE Disponible | |
#pragma config DEBUG = ON //Modo de depuración disponible | |
#pragma config LVP = OFF //Fuente de ISCP apagada | |
void main() { | |
ADCON0 = 0b00000000; //Configurando ADC para usar el canal analogico 0(AN0) | |
//sin activarlo | |
ADCON1 = 0b00001110; //Estableciendo voltajes de referencia y configurando | |
//bits de control para el ADC, AN0(RA0) = entrada analogica AN1-AN12 = I/O digitales | |
ADCON2 = 0b10111100; //Configurando justificacion, tiempo de adquisicion de datos | |
//y frecuencia de reloj para el ADC | |
CMCON = 0x07; //Desactivando el modulo de comparación | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Digitalizador de señales de audio | |
// Digitaliza una señal analogica de audio mediante el modulo de ADC | |
// almacena las muestras tomadas en localidades de EEPROM | |
// Y muestra los datos en la LCD | |
// Ángel Moreno | |
// David Escobar | |
// Eduardo Rivas | |
#include "p18f4550.h" | |
#include "xc.h" | |
#include "stdlib.h" | |
//#include "../utils/lcd.h" //Incluir cabeceras para manejo de LCD | |
//Directivas para activar los bits de configuracion | |
#pragma config FOSC = INTOSCIO_EC //Oscilador Interno, Puerto A RA6 activo, | |
#pragma config WDT = OFF //Watchdog timer apagado | |
#pragma config PBADEN = OFF //Parte baja del puerto B digitales | |
#pragma config MCLRE = ON //MCLRE Disponible | |
#pragma config DEBUG = ON //Modo de depuracion disponible | |
#pragma config LVP = OFF //Fuente de ISCP apagada | |
#define t100ms CCP1IF //Pasaron 100ms | |
#define edge_detect INT0IF //Entrada en RB0 | |
#define conver ADIF //se realizo una conversion de analogo a digital | |
//Variables globales | |
char message[] = "Digitalizador"; //Mensaje para LCD | |
unsigned char ds_count = 0; //Contador de decenas de segundo | |
unsigned long freq = 0; //Contador de frecuencia (flancos por segundo) | |
char ascii_freq[7] = 0; //Representacion ASCII de la frecuencia | |
char units[5] = "Hz "; //Cadena de las unidades para LCD | |
char adreg[] = 0; //Registro para almacenar datos de ADRESH:ADRESL | |
//Configuracion | |
void config() { | |
IRCF0 = 1; //configuracion del OSCCON F=8MHz | |
IRCF1 = 1; | |
IRCF2 = 1; | |
//Configuracion de interrupciones | |
IPEN = 1; //habilita la prioridad de las interrupciones | |
PEIE = 1; //habilita interrupciones periféricas | |
//Configuracion del modo comparador (generacion de eventos) | |
T3CON = 0x00; //configura TMR1 como fuente de reloj para los modulos ccp1/3 | |
CCP1M3 = 1; //genera una interrupcion al coincidir | |
CCP1M2 = 0; | |
CCP1M1 = 1; | |
CCP1M0 = 1; | |
CCPR1 = 25000; //Genera una interrupción cada 100ms | |
//configuración para el uso de la memoria EEPROM | |
EECON1 = 0b00010000; //Configuracion del estado y acceso a la EEPROM | |
EEDATA = 0;//Limpiando bahia de datos de EEPROM | |
EEADR = 0; //Limpiando bahia de dirección de EEPROM | |
//Configuracion del comparador 1 | |
CCP1IE = 1; //Habilitar interrcupciones para CCP1 | |
CCP1IP = 1; //Habilitar prioridad de int. para CCP1 | |
//configuración del modulo de ADC | |
ADCON0 = 0b00000000; //Configurando ADC para usar el canal analogico 0(AN0) | |
//sin activarlo | |
ADCON1 = 0b00001110; //Estableciendo voltajes de referencia y configurando | |
//bits de control para el ADC, AN0(RA0) = entrada analogica AN1-AN12 = I/O digitales | |
ADCON2 = 0b10111100; //Configurando justificacion, tiempo de adquisicion de datos | |
//y frecuencia de reloj para el ADC | |
ADIE = 1; //Habilitar mascara local | |
ADIP = 1; //Habilitar selector de prioridad | |
//Inicializacion de los puertos | |
CMCON = 0x07; //Desactivando el modulo de comparación | |
TRISA = 0b00000001; //Estableciendo RA0 como entrada para toma de la señal analogica | |
PORTB = 0; //Limpiar PORTB | |
LATE = 0; //Limpiar PORTE | |
LATD = 0; //Limpiar PORTD | |
TRISB0 = 1; //PORTB0 como entrada | |
TRISE = 0; //PORTE como salida | |
TRISD = 0; //PORTD como salida | |
INTEDG0 = 1; //Interrupción en PORTB0 en flanco ascendente | |
INT0IE = 1; //Habilitar interrupciones por flanco en PORTB0 | |
//Configuracion del Timer 1 | |
TMR1 = 0; //Limpiar el registro de trabajo de Timer1 | |
T1CON = 0b10110001; //Configurar y encender TIMER1 | |
//Inicializacion de los perifericos externos | |
LCD_Inicializar(); //Inicializa la pantalla LCD | |
} | |
//Función principal que no hace nada, sólo juegan las interrupciones | |
void main() { | |
config(); //Ejecutar la configuración | |
LCD_Posicion(3, 0); | |
LCD_Cadena(message); //Imprimir el mensaje: "Frecuencia" | |
GIE = 1; //Habilitar interrupciones | |
while(1){ //Bucle continuo que no hace nada | |
Nop(); | |
} | |
} | |
//Rutinas de interrupcion | |
void interrupt service(void) { | |
GIE = 0; //Desactivar mascara global de interrupcion | |
//Generación de la base de tiempo de 1s | |
if (t100ms) { //Han transcurrido 100ms en el Timer1 | |
ds_count++; //Aumentar el contador de decenas de segundo | |
//Se muestra el valor de freq en la LCD cada segundo | |
if (ds_count == 10) { //Ha transcurrido un segundo | |
ds_count = 0; //Reiniciar el conteo de decenas de segundo | |
itoa(ascii_freq, freq, 10); //Convertir freq a ASCII | |
LCD_Posicion(0x05, 0x40); //Apuntar a la segunda fila de la LCD | |
LCD_Cadena(ascii_freq); //Mostrar el valor de la frecuencia | |
LCD_Cadena(units); //Añadir las unidades: Hz | |
freq = 0; //Se limpia el contador de frecuencia cada segundo | |
} | |
t100ms = 0; //Limpiar la bandera de 100ms | |
} | |
//Detección de flanco | |
if (edge_detect) { //Se ha detectado un flanco en RB0 | |
freq++; //Aumentar el contador de frecuencia cada vez que hay flanco | |
edge_detect = 0; //Limpiar la interrupción del flanco | |
} | |
if (conver){ | |
} | |
GIE = 1; //Habilitar interrucpciones | |
return; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Modificar la versión 2 del digitalizador según las funciones y parámetros que se usaran en el desafio