Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Preamplifiicador PGA2311


       



#1  Preamplifiicador PGA2311
downcount
Ubicación: Barcelona
Registrado: 06 Abr 2007
Mensajes: 67
citar
Hola a todos! estoy realizando un proyecto de un preamplificador basado en el control de volumen PGA2311PA y este esta controlado mediante un microcontrolador PIC18F452. El proyecto es casi el mismo que salió en la revista elektor, lo que yo estoy realizando todo el software y hardware de nuevo, aqui podeis encontrar el proyecto de elektor http://www.dh3ben.de/html/electronics/pga2311_preamp.shtml.
El PGA2311 es un control de volumen de alta fidelidad, en el qual el volumen se controla digitalmente mediante SPI. Por el momento lo he montado en una placa de pruebas y he conseguido variar el volumen con pulsadores. El codigo lo he escrito en CCS, las funciones SPI del CCS no no me funcionan, pero lo he conseguido hacer funcionar con unas funciones SPI por software. Tambien quiero que se pueda variar el volumen con mando a distancia (codigo RC5 de phillips), he utilizado el codigo que hay publicado en el foro, lo malo es que no funciona por interrupciones y no me acaba de funcionar del todo bien, a veces detecta bien el codigo y a veces no.
Estoy diseñando las placas de cirtcuito impreso, de momento he hecho la fuente de alimentacion y ahora voy a hacer la placa principal del microcontrolador con el control de volumen, pero todavia no tengo claro que puertos del PIC utilizar.
Necesito a alguien que me ayude con la programacion del codigo en CCS, gracias.



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#2  
downcount
Ubicación: Barcelona
Registrado: 06 Abr 2007
Mensajes: 67
citar
Este és el codigo para decodificar el mando a distancia, he puesto unos mensajes por el RS232 para saber si funciona la decodificacion, por el momento no me funciona. Estoy hablando con el que ha escrito el programa para ver si se puede solucionar.

//main

//*******************************************************************************
//
// Simple program to decode commands of RC5 infrared remote controls
//
//
// 01/01/2006 by Daniel Porzig www.base32.de.vu
//
//
//
//
// ATTENTION! All timervalues just fit, if the controller runs with 20 MHz!
// When you use another frequency, the values have to be adapted!
//
//
//
//
//*******************************************************************************


#include <18F452.h>

#fuses NOWDT,HS, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#include <IR.c>


void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
EXT_INT_EDGE(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);


rc5.state=0;
//input(PIN_B0);// this sets up PIN B0 as an input pin. You could use "set_tris_b(...)" too.
set_tris_b(0b00000001);
while(1)
{
if(rc5.state==1)
{
puts("works");
rc5.state=0;
enable_interrupts(INT_EXT);
}
}
}


//Libreria IR.c

#define IR_INPUT PIN_B0

#define IR_STATUS (!input(IR_INPUT))



typedef struct
{
int8 data[2];
int8 state;
} rc5_struct;

rc5_struct rc5;

int1 get_RC5(void)
{
int16 tmp,t;
int i;
int1 inp;

set_timer1(0);
while(IR_STATUS == 1);
t=get_timer1();
puts("debugg2");

if ((t<400) || (t<800)){
puts("not works");
return 0;
}

for (i=0;i<13;i++)
{
inp=IR_STATUS;
set_timer1(0);
puts("debugg3");

while (IR_STATUS==inp)
{
t=get_timer1();
if (t>800) return 0;
}

tmp<<=1;

if (inp==0) tmp++;

set_timer1(0);
while (get_timer1()<776);
}

tmp=tmp | 0x3000;
tmp=tmp & 0x37FF;

rc5.data[0]=tmp & 0xFF;
tmp>>=8;
rc5.data[1]=tmp & 0xFF;

rc5.state=1;

disable_interrupts(INT_EXT);

return 1;
}


#int_EXT
void EXT_isr()
{
puts("debugg1");
get_RC5();

}

#3  
downcount
Ubicación: Barcelona
Registrado: 06 Abr 2007
Mensajes: 67
citar
Este es el programa que envia por el SPI el volumen al PGA y lo muestra en el LCD.-El voumen se controla mediante 35 pasos, lo ideal seria utilizar los 255 que permite el PGA. El programa no esta muy bien escrito pero funciona! que ya es mucho, jejejje

//main

#include <18F452.h>
#include "funciones_preamp.c"

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#include <lcd.c>

void main()
{
int tab_vol [26]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int i=5;
int tab_volum;
unsigned char volll=50;
lcd_init();
output_bit(PIN_D3,1);
tab_volum=tab_vol[i];
printf(lcd_putc,"OCS Preamplifier");
lcd_putc('\n');
printf(lcd_putc,"Volum %u",tab_volum);
delay_ms(1000);
volume_set(volll,volll);

while(TRUE)
{
if((!input(PIN_A0))&&(i<25)) //PIN_A0 aumenta volumen
{
delay_ms(200);
i++;
tab_volum=tab_vol[i];
volll=volll+10;
lcd_putc('\f');
printf(lcd_putc,"OCS Preamplifier");
lcd_putc('\n');
printf(lcd_putc,"Volum %u",tab_volum);
volume_set(volll,volll);
}

if((!input(PIN_A1))&&(i>0)) //PIN_A1 disminuye volumen
{
delay_ms(200);
i--;
tab_volum=tab_vol[i];
volll=volll-10;
lcd_putc('\f');
printf(lcd_putc,"OCS Preamplifier");
lcd_putc('\n');
printf(lcd_putc,"Volum %u",tab_volum);
volume_set(volll,volll);
}
}
}


//libreria funciones_pream.c


void volume_set(unsigned char right, unsigned char left)
{
unsigned char i,b;
output_bit(PIN_B7,0); //Activa el PGA /CS
output_bit(PIN_B4,1); //Zero Crossing ZCEN

b=right;
for(i=8;i>0;i--) //clock
{
unsigned char x;
x=1<<(i-1);
if (b>=x)
{
output_bit(PIN_B6,1); //SDI
b-=x;
}
else
{
output_bit(PIN_B6,0); //SDI
}
output_bit(PIN_B5,0); //SCLK
output_bit(PIN_B5,1); //SCLK
}
b=left;
for(i=8;i>0;i--) //clock
{
unsigned char x;
x=1 << (i-1);
if (b>=x)
{
output_bit(PIN_B6,1); //SDI
b-=x;
}
else
{
output_bit(PIN_B6,0); //SDI
}
output_bit(PIN_B5,0); //SCLK
output_bit(PIN_B5,1); //SCLK
}
output_bit(PIN_B7,1); //Desactiva el PGA /CS
}

 Responder





 Otros temas de interés 
No hay mensajes nuevos Envio de 4 bits por radio frecuencia, distancia 15 m.
No hay mensajes nuevos Adaptar un mando de play para controlar un robot a distancia
No hay mensajes nuevos Comando a distancia simple
No hay mensajes nuevos Mando a distancia para garaje
No hay mensajes nuevos Medidor de distancia por infrarrojos

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||