Skip to content

Instantly share code, notes, and snippets.

@davidae1704
Last active December 24, 2015 16:29
Show Gist options
  • Save davidae1704/6828459 to your computer and use it in GitHub Desktop.
Save davidae1704/6828459 to your computer and use it in GitHub Desktop.
digitalizador de señales de audio por medio de ADC del PIC18F4550
//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
}
// 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;
}
@davidae1704
Copy link
Author

Modificar la versión 2 del digitalizador según las funciones y parámetros que se usaran en el desafio

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment