Hola a todos.
Bueno estoy haciendo un proyecto de trabajo. Consiste en que la salida de audio de un amplificador (LM380) entre al PIC18F26k22. Quiero que el micro haga la función de un vumetro; más aparte que se transmita (solo) una comunicación serial a la PC como comprobar los valores salidos.
Nada fácil ¡¿Eh?!
Permitidme explicarles que es lo que hice para dar una rápida solución a esto. Utilice el arduino, el siguiente código dice lo siguiente.
Se toma los valores del audio y las va sumando (1000 por segundo), de tal forma que el resultado lanzado se divide entre 1000 lanzando el promedio en la terminal.
El voltaje promedio es el que se utilizó para determinar el rango de los 10 led's de salida.
De 0 a 85 prenderá el LED 1.
De 86 a 170 el LED 2.
De 171 a 255 el LED3.
De 256 a 340 el LED4.
De 341 a 425 el LED5.
De 426 a 510 el LED6.
De 511 a 595 el LED 7.
De 596 a 680 el LED 8.
De 681 a 765 el LED 9.
De 766 a 850 el LED 10.
Bueno. esto fue lo que hice en el fabuloso Arduino.
Ahora estoy de novato con el C18, ya que en el trabajo manejan ese PIC y la programación igual.
Estoy leyendo el Data de ese PIC y les dejo lo que eh echo y con ayuda de varios blogs, foros y páginas que me eh encontrado en la red (Aún no esta completo) pero me gustaría que lo revisarán y dieran su opinión y sugerencias en mi programa.
Difícil empezar, pero no imposibles.
Soy novato en este foro, esté es mi segunda entrada, mismo tema. Espero sus ataques (En serio)
Bueno estoy haciendo un proyecto de trabajo. Consiste en que la salida de audio de un amplificador (LM380) entre al PIC18F26k22. Quiero que el micro haga la función de un vumetro; más aparte que se transmita (solo) una comunicación serial a la PC como comprobar los valores salidos.
Nada fácil ¡¿Eh?!
Permitidme explicarles que es lo que hice para dar una rápida solución a esto. Utilice el arduino, el siguiente código dice lo siguiente.
Se toma los valores del audio y las va sumando (1000 por segundo), de tal forma que el resultado lanzado se divide entre 1000 lanzando el promedio en la terminal.
Código:
void loop() {
Serial.flush();
temp = 0;
prom = 0;
cuenta = 0;
while (temp < 1000) {
sensorValue = analogRead(sensorPin);
cuenta = (float)cuenta + sensorValue;
temp++;
}
prom = ((cuenta) / 1000);
Serial.println(prom);
El voltaje promedio es el que se utilizó para determinar el rango de los 10 led's de salida.
De 0 a 85 prenderá el LED 1.
De 86 a 170 el LED 2.
De 171 a 255 el LED3.
De 256 a 340 el LED4.
De 341 a 425 el LED5.
De 426 a 510 el LED6.
De 511 a 595 el LED 7.
De 596 a 680 el LED 8.
De 681 a 765 el LED 9.
De 766 a 850 el LED 10.
Bueno. esto fue lo que hice en el fabuloso Arduino.
Ahora estoy de novato con el C18, ya que en el trabajo manejan ese PIC y la programación igual.
Estoy leyendo el Data de ese PIC y les dejo lo que eh echo y con ayuda de varios blogs, foros y páginas que me eh encontrado en la red (Aún no esta completo) pero me gustaría que lo revisarán y dieran su opinión y sugerencias en mi programa.
Código:
/*
* File: vumetro_mainp18.c
* Author: R. Giskard Raventlov
*
* Created on 29 de junio de 2016, 00:01 AM
*/
//LIBRERÍAS
#include <p18f26k22.h> // Librería del microcontrolador que se va a utilizar.
#include <usart.h>
//CONFIGURACIÓN DE BITS DEL PIC.
// CONFIG1H
#pragma config FOSC = INTIO7 // Oscillator Selection bits (Internal oscillator block, CLKOUT function on OSC2)
#pragma config PLLCFG = ON // 4X PLL Enable (Oscillator multiplied by 4)
#pragma config PRICLKEN = ON // Primary clock enable bit (Primary clock enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power-up Timer Enable bit (Power up timer disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 190 // Brown Out Reset Voltage bits (VBOR set to 1.90 V nominal)
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<5:0> pins are configured as digital I/O on Reset)
#pragma config HFOFST = ON // HFINTOSC Fast Start-up (HFINTOSC output and ready status are not delayed by the oscillator stable status)
#pragma config MCLRE = EXTMCLR // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection Block 0 (Block 0 (000800-003FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection Block 1 (Block 1 (004000-007FFFh) not code-protected)
#pragma config CP2 = OFF // Code Protection Block 2 (Block 2 (008000-00BFFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection Block 3 (Block 3 (00C000-00FFFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection Block 0 (Block 0 (000800-003FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection Block 1 (Block 1 (004000-007FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection Block 2 (Block 2 (008000-00BFFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection Block 3 (Block 3 (00C000-00FFFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection Block 0 (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection Block 1 (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection Block 2 (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection Block 3 (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
//TERMINA CONFIGURACIÓN DE BITS DEL PIC.
void main(void) {
// CONFIGURACIÓN DEL OSCILADOR INTERNO.
OSCCONbits.IDLEN = 0; // Entra en modo de suspensión con instrucción.
OSCCONbits.IRCF = 0b111; // Frecuencia del oscilador a 16 MHz (HFINTOSC).
OSCCONbits.HFIOFS = 1; // Frecuencia de HFINTOSC es estable.
//CONFIGURACIÓN DEL MODULO ADC.
ANSELAbits.ANSA3 = 1; //Entrada digital del buffer desactivada.
ADCON0bits.CHS = 0b00011; // Seleción del canal AN3 (RA3).
ADCON0bits.GO_DONE = 1; // Se pone a 1 para iniciar el proceso de conversión.
ADCON0bits.ADON = 1; // ADC está activado.
ADCON1bits.PVCFG = 0b00; //Voltage positivo a 5V.
ADCON1bits.NVCFG = 0b00; //Voltage negativo a 0V.
ADCON2bits.ADFM=1; // Se justifica hacia la derecha.
ADCON2bits.ADCS = 0b100; //Se divide entre 4 los 16MHz.
// CONFIGURACIÒN DEL UART.
/* Configuración de pines TX y RX. */
ANSELCbits.ANSC6 = 0; //Entrada digital del buffer activada.
ANSELCbits.ANSC7 = 0; //Entrada digital del buffer activada.
TRISCbits.TRISC6 = 1; // Tx como entrada.
TRISCbits.TRISC7 = 1; // Rx como entrada.
/* Estatus y control del registro de trasmisión. */
TXSTA1 = 0b00100010;
/* TXSTA1.TRMT = 1 // Registro de tranmision de cambio vacío.
* TXSTA1.BRGH = 0 // Baja velocidad en la trasmisiòn de datos.
* TXSTA1.SYNC = 0 // Se activa el modo Asincrono.
* TXSTA1.TXEN = 1; // Habilitar la transmisiòn.
*/
/* Estatus y control del registro de recepción.*/
RCSTA1 = 0b10010000;
/* RCSTA1.SPEN = 1 // Habilita el puerto serial.
* RCSTA1.CREN = 1 // Habilita la recepción continua.
*/
/* Rango de control del registro BAUD. */
BAUDCON1bits.BRG16 = 0;
}
Difícil empezar, pero no imposibles.
Soy novato en este foro, esté es mi segunda entrada, mismo tema. Espero sus ataques (En serio)