SETUP_CCP1(CCP_CAPTURE_RE);
ENABLE_INTERRUPS(INT_CCP1);
Hola suky, esa es la misma página que mencioné antes, y esta muy bueno lo que has hecho.
Y según he leído en los codigos fuentes de las Notas de aplicación de Microchip es mejor utilizar la interrupción INTx y cambiar la frecuencia del MCP_CLKI así varías la cantidad de muestras que pueden ser obtenidas del MCP3909 y me imagino que se disminuye la enregía consumida ya que se realiza menos trabajo.
Por aquí encontre otra nota de aplicación en la que nos dan un código fuente en C
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926)
En tu código he observado que primero esperas a que ocurra el pulso de DR y luego pones el pin CS del MCP a cero para iniciar la recepción de datos, ¿es esto correcto?
#include <18f4550.h>
#include <Medidor Energia MCP3909.h>
#include <Puertos.c>
#include <variables_64bits.c>
#include <declaraciones.h>
#include <math.h>
#use spi(FORCE_HW, BITS=16)
#INT_EXT2
void MCP_READ(){
MCP_CS=0;
delay_us(2);
V=spi_xfer();
I=spi_xfer();
delay_us(2);
MCP_CS=1;
delay_us(1);
MCP_CS=0;
}
void MCP_init(void){
MCP_MCLR=1;
delay_cycles(1);
MCP_CS=0;
delay_us(2);
spi_write(0xAC);
delay_us(2);
MCP_CS=1;
}
void Hardware_init(void){
TRISA=0;
TRISB=0B100;
TRISC=0;
DISABLE_INTERRUPTS(GLOBAL);
SETUP_ADC_PORTS(NO_ANALOGS);
PORTA=0;
PORTB=0;
PORTC=0;
MCP_CS=1;
SETUP_TIMER_0(T0_8_BIT|T0_INTERNAL|T0_DIV_4);
SET_TIMER0(0x78);
SETUP_TIMER_3(T3_INTERNAL|T3_DIV_BY_8);
SET_TIMER3(0);
SETUP_TIMER_2(T2_DIV_BY_1,5,1);
//! SETUP_CCP1(
SET_PWM2_DUTY(3);
SETUP_CCP2(CCP_PWM);
setup_spi(SPI_MASTER|SPI_CLK_DIV_4|SPI_L_TO_H|SPI_SAMPLE_AT_END);
ENABLE_INTERRUPTS(INT_EXT2_L2H);
ENABLE_INTERRUPTS(GLOBAL);
}
void main(){
Hardware_init();
MCP_init();
MCP_CS=0;
while(1);
}
Hola amigos,
:oops: Me podrían hacer el favor de probar el código ya que en estos momentos no tengo a mano el MCP3909 y no puedo probarlos en físico, todos los dispositivos me llegan dentro de un mes.
Seguiré el tema, esta interesante...
Sobre el hardware ya tienes algo hecho??
Ya he simulado la transmisión SPI y mediante el SPI debugger he comprobado que se realiza la transmisión de los 16 bits.
Mi principal temor es que si funciona el CS y se transmite cuando ocurre la interrupción externa 2, además no sé si los ADC del MCP realizarán correctamente su trabajo.
Por eso quería comprobar el código que tengo hasta el momento antes de seguir, para evitar hacer un código sumamente grande que despues sea muy dificil de corregir.
Por probar el hardware no te preocupes, ya que habrán muchas personas interesadas en hacerlo, para eso es el foro no, :D
Para otorgarle CLK al MCP pienso utilizar el módulo CCP2 y generar una frecuencia de reloj de 2MHz para obtener 128 muestras, y si quiero modificarlo a 64 muestras solo divido a la mitad la frecuencia, igualmente si quiero 256 muestras multiplico por 2 la frecuencia.
Mi principal temor es que si funciona el CS y se transmite cuando ocurre la interrupción externa 2,
Ahora el ultimo comentario que realizas, un filtro pasa-bajos para eliminar la componente DC? Entiendo que es pasa-altos, pero en ese caso el MCP ya lo tiene incluido en el hardware, solo hay que habilitarlo.
Ahora el ultimo comentario que realizas, un filtro pasa-bajos para eliminar la componente DC? Entiendo que es pasa-altos, pero en ese caso el MCP ya lo tiene incluido en el hardware, solo hay que habilitarlo.
:oops: Si me equivoque, los filtros pasa bajos son para eliminar la componentes AC y dejar solo las componentes DC ya que estas al final son las potencias activa y aparente.
Yo pedí muestras del CS5463 de Cirrus Logic, a ver como va la cosa. :mrgreen: :mrgreen:
Yo tengo entendido que es necesario aplicar la sumatoria y la division entre N y luego la raíz cuadrada para obtener los valores RMS y tamién se deben filtrar los valores despues de sacar los cuadrados y antes de la sumatoria.