// KO  le 15 /06 /11 sur 64MC802
// exemple de mise en oeuvre de convertion ADC
// 4 capteurs à convertir:
// AN4 sur CH0,AN0 sur CH1,AN1 sur CH2,AN2 sur sur CH3
// scénario: automatic sample , trigger timer (declenchement auto des convertions sur IT timer)
// overflow timer => 4 conv séquentielles des voies
// IT ADC qd les 4 conv ont été réalisés
// stockage dans un tableau de mesures
// détail  datasheet 16.3.5.2 EXTERNAL CONVERSION TRIGGER
// détail dans datasheet  16.3.6 Multi-Channel Sample Conversion Sequence


#include "p33FJ64MC802.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <timer.h>


#include "ConfigSystem.h"  // definition des labels Fcy etc....
#include "delay.h"





_FOSCSEL(FNOSC_FRC);			
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_XT);	// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
													// OSC2 Pin Function: OSC2 is Clock Output
													// Primary Oscillator Mode: XT Crystal
_FWDT(FWDTEN_OFF); 


// les differentes configs on été eclatées dans des fichiers distinct
// meilleure visibilité
extern  void  Init_DMA_Multivoies( void );
extern void initDma0(void);
extern void UART_puts(char * string);
extern  void InitClock();
extern void InitUART();
extern void InitPORT_AND_PIN();
extern void InitTimer3();// ATTENTION: modification du source pour initialiser timer3 (exemple precedent avec timer1)


   
int  BufferA[24]  __attribute__((space(dma),aligned(256))); 
int  BufferB[24]  __attribute__((space(dma),aligned(256)));
unsigned int DmaBuffer = 0; // gestion des 2 buffers alternés (mode ping pong)
unsigned int flagITDMA = 0; // Pour Traitement différé des échantillons
/*=============================================================================
_DMA0Interrupt(): ISR name is chosen from the device linker script.
=============================================================================*/
/*
BufferA[0]=AN4 ( CH0)
BufferA[1]= AN0 (CH1)
BufferA[2]= AN1 (CH2)
BufferA[3]= AN2 (CH3)

*/
void __attribute__((interrupt, no_auto_psv)) _DMA0Interrupt(void)
{

	DmaBuffer ^= 1; 	// change buffer A<->B
	flagITDMA = 1;		// pour traitement différé des buffers
	PORTBbits.RB15=!PORTBbits.RB15; // debug
 	IFS0bits.DMA0IF = 0;		//Clear the DMA0 Interrupt Flag

}


char BUFFER[50]={0};
unsigned char HelloMsg[7]="Bonjour";



int main ( void )
{
	unsigned int ADCValue=0;

	

	InitClock();	// This is the PLL settings	
	InitPORT_AND_PIN();
	InitUART();
	initDma0();// init DMA
	Init_DMA_Multivoies(); // init ADC avec DMA
	InitTimer3();


	UART_puts(HelloMsg);



    /* Infinite Loop */


    while ( 1 )
	{  
	
	PORTBbits.RB14=!PORTBbits.RB14; // debug

		if (flagITDMA==1) // traitement différé des samples
		{
			if (DmaBuffer==0) // traitement buffer A
			{
			sprintf(BUFFER,"capt 0 AN0: %d \n", BufferA[1]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 1 AN1: %d \n", BufferA[2]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 2 AN2: %d \n", BufferA[3]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 3 AN4: %d \n", BufferA[0]);
			UART_puts(BUFFER);
			}
			else // traitement buffer B
			{
			sprintf(BUFFER,"capt 0 AN0: %d \n", BufferB[1]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 1 AN1: %d \n", BufferB[2]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 2 AN2: %d \n", BufferB[3]);
			UART_puts(BUFFER);
			sprintf(BUFFER,"capt 3 AN4: %d \n", BufferB[0]);
			UART_puts(BUFFER);
			}
		}


	}	


		
	
	
}


