Buenas,
llevo un mes detras de un problema y me estoy volviendo loco. Leo perfectamente un RTC con el bus I2C si solo hago esto, pero al augmentar mi código y implementar el ADC con DMA se me corrompe la lectura del RTC y me repite datos o directamente leo 0xFF, cuando ni de coña tendria que leer esto.
Mi archivo de Inicializacion es el siguiente:
#include <p33FJ64GP204.h>
#include "comu.h"
void Inicialitzacio(void)
{
//********************************************************************************************
//INICIO PINES
//********************************************************************************************
PIN21_CLK_0 = 0;
AD1PCFGLbits.PCFG2 = 1;
//********************************************************************************************
PIN22_DAT_0 = 0;
AD1PCFGLbits.PCFG3 = 1;
ETC ETC....
//********************************************************************************************
//CONFIGURACION PERIFERICOS
//********************************************************************************************
RPINR18bits.U1CTSR = 0b10011;
RPINR18bits.U1RXR = 0b10110;
RPOR6bits.RP12R = 0b00011;
RPOR7bits.RP15R = 0b00100;
RPOR0bits.RP0R = 0b01000;
RPOR0bits.RP1R = 0b00111;
//********************************************************************************************
//CONFIGURACION DEL SPI MODO MASTER
//********************************************************************************************
SPI1CON1bits.SPRE = 0b000;
SPI1CON1bits.PPRE = 0b11;
SPI1CON1bits.MSTEN = 1;
SPI1CON1bits.MODE16 = 0;
SPI1STATbits.SPIROV = 0;
SPI1CON1bits.SMP = 1;
SPI1STATbits.SPIEN = 1;
SPI1CON1bits.DISSDO = 0;
SPI1CON1bits.DISSCK = 0;
SPI1CON1bits.CKE = 1;
// SPI1CON1bits.CKP = 1;
//********************************************************************************************
//CONFIGURACION DEL TIMER1 250 ms // 419.424 ms
//********************************************************************************************
T1CONbits.TON = 0;
T1CONbits.TCS = 0;
T1CONbits.TGATE = 0;
T1CONbits.TCKPS = 0b11;
T1CONbits.TSIDL = 0;
TMR1 = 0x00;
PR1 = 39062;
IPC0bits.T1IP = 0x001;
IFS0bits.T1IF = 0;
IEC0bits.T1IE = 1;
T1CONbits.TON = 1;
//********************************************************************************************
//CONFIGURACIO DEL TIMER2 1 ms
//********************************************************************************************
T2CONbits.TON = 0;
T2CONbits.T32 = 0;
T2CONbits.TCS = 0;
T2CONbits.TGATE = 0;
T2CONbits.TCKPS = 0b00;
T2CONbits.TSIDL = 0;
TMR2 = 0x00;
PR2 = 40000;
IPC1bits.T2IP = 0x001;
IFS0bits.T2IF = 0;
IEC0bits.T2IE = 1;
T2CONbits.TON = 1;
//********************************************************************************************
//CONFIGURACIO DEL TIMER3 500 us
//********************************************************************************************
T3CONbits.TON = 0;
T3CONbits.TCS = 0;
T3CONbits.TGATE = 0;
T3CONbits.TCKPS = 0b00;
T3CONbits.TSIDL = 0;
TMR3 = 0x00;
PR3 = 20000;
IPC2bits.T3IP = 0x001;
IFS0bits.T3IF = 0;
IEC0bits.T3IE = 1;
T3CONbits.TON = 1;
//********************************************************************************************
//CONFIGURACIO DEL TIMER4 250 us
//********************************************************************************************
T4CONbits.TON = 0;
T4CONbits.TCS = 0;
T4CONbits.TGATE = 0;
T4CONbits.TCKPS = 0b00;
T4CONbits.TSIDL = 0;
TMR4 = 0x00;
PR4 = 800;
IPC6bits.T4IP = 0x001;
IFS1bits.T4IF = 0;
IEC1bits.T4IE = 1;
T4CONbits.TON = 1;
//*********************************************************************************************
//CONFIGURACIO DEL DMA
//*********************************************************************************************
DMA0CONbits.AMODE = 2; // Configure DMA for Peripheral indirect mode
DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA0PAD=(volatile unsigned int)&ADC1BUF0;
DMA0CNT = 31;
DMA0REQ = 13;
DMA0STA = __builtin_dmaoffset(BufferA);
DMA0STB = __builtin_dmaoffset(BufferB);
IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit
IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit
IPC1bits.DMA0IP = 0b001;
DMA0CONbits.CHEN=1;
//*********************************************************************************************
//CONFIGURACIO DEL ADC
//*********************************************************************************************
AD1CON1bits.FORM = 0; // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 7; // Sample Clock Source: GP Timer starts conversion
AD1CON1bits.ASAM = 1; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation
AD1CON2bits.ALTS = 1; // Alternate Input Sample Mode Select Bit
AD1CON2bits.CHPS = 0; // Converts CH0
AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.ADCS = 63; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*64 = 1.6us (625Khz)
// ADC Conversion Time for 10-bit Tc=12*Tab = 19.2us
AD1CON1bits.ADDMABM = 0; // DMA buffers are built in scatter/gather mode
AD1CON2bits.SMPI = 1; // SMPI Must be programmed to 1 for this case
AD1CON4bits.DMABL = 4; // Each buffer contains 16 words
AD1CHS0bits.CH0SA = 0; // MUXA +ve input selection (AIN4) for CH0
AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (Vref-) for CH0
AD1CHS0bits.CH0SB=1; // MUXB +ve input selection (AIN5) for CH0
AD1CHS0bits.CH0NB=0; // MUXB -ve input selection (Vref-) for CH0
AD1PCFGLbits.PCFG0 = 0; // AN0 as Analog Input
AD1PCFGLbits.PCFG1 = 0; // AN1 as Analog Input
IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 0; // Do Not Enable A/D interrupt
AD1CON1bits.ADON = 1; // Turn on the A/D converter
//*********************************************************************************************
//CONFIGURACION DEL CN
//*********************************************************************************************
CNEN1bits.CN6IE = 1;
CNEN1bits.CN7IE = 1;
CNEN1bits.CN1IE = 1;
IEC1bits.CNIE = 1; // Enable CN interrupts
IFS1bits.CNIF = 0; // Reset CN interrupt
}
Bien, entonces cuando comento el T4+DMA+ADC no se me corrompe el I2C. El T4 comentado solo si se corrompe, el ADC comentado solo también, el DMA comentado solo también, DMA + ADC comentado también, el T4 + ADC no lo hace, el T4 + DMA tampoco lo hace y así infinidad de combinaciones que he ido probando y cada vez hacen que todo sea mas absurdo, sin sentido, y termine por perder la cabeza.
También si lo tengo todo SIN comentar, pero con las interrupciones CON TODO comentado (menos el borrar el flag de la interrupción) TAMBIÉN se corrompe.
Para solucionarlo de una forma chapuza hago que lea tantas veces como sea necesario el RTC hasta que los bits de control sean los que tengan que ser, y algunas veces lo lee una vez, otras dos, tres etc pero esta no es la solución elegante, solo una chapuza
Ya no se que mas probar... Y problema de hardware no es, ya que he provado con otra placa de mi compañero que funciona correctamente y hace lo mismo. Creo que el problema es de configuración, ya que el código en si del I2C es el que da Microchip y me funciona sin el T4, DMA y ADC
Alguien se le acude que puede ser??
Espero un rayo de luz a mi proyecto con ansias
Muchas gracias