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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
| /* Nicolas HERVOUET
** M2 CSER
** Février 2008
*/
//INCLUDES
#include <delays.h>
#include <p18f4550.h>
#include "typedefs.h"
#include "usb.h"
//DEFINES
#define TAILLE_BUFFER 120
#define NOMBRE_BUFFER 10
#define LED0 PORTBbits.RB0 //Voie 1
#define LED1 PORTBbits.RB3 //Voie 2
#define LED2 PORTCbits.RC6 //Connexion
//VARIABLES
#pragma udata gpr1
volatile char output_buffer0[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr1
volatile char output_buffer1[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr2
volatile char output_buffer2[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr2
volatile char output_buffer3[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr3
volatile char output_buffer4[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr3
volatile char output_buffer5[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr4
volatile char output_buffer6[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr4
volatile char output_buffer7[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr5
volatile char output_buffer8[TAILLE_BUFFER];
#pragma udata
#pragma udata gpr5
volatile char output_buffer9[TAILLE_BUFFER];
#pragma udata
char * bufferActuel;
char input_buffer[2];
char useAN0, useAN1, etat, tour, buffer, delai;
char tempH;
char tempL;
//FONCTIONS
static void InitializeSystem(void);
void USBTasks(void);
void InitializeUSART(void);
void CAN(void);
void adressBuffer(void);
//MAIN
void main(void){
InitializeSystem();
while(1){
USBTasks(); // Taches USB
CAN(); // Voir user\user.c & .h
}
}
// CONVERSION ANALOGIQUE NUMERIQUE
void CAN(void){
char i;
if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return;
if(etat == 0) { //Etat Normal.
if(getsUSBUSART(input_buffer,2)){ //Recoie les données envoyées par le PC
switch(input_buffer[0]) {
case '0' : //Ne rien faire
useAN0 = 0;
useAN1 = 0;
break;
case '1' : //Acquisition voie 1
useAN0 = 1;
useAN1 = 0;
break;
case '2' : //Acquisition voie 2
useAN0 = 0;
useAN1 = 1;
break;
case '3' : //Acquisition voie 1 et 2
useAN0 = 1;
useAN1 = 1;
break;
case 'c' : //Allume la LED CONNEXION
LED2 = 1;
useAN0 = 0;
useAN1 = 0;
break;
case 'd' : //Eteint la LED CONNEXION
LED2 = 0;
useAN0 = 0;
useAN1 = 0;
break;
default :
break;
}
LED0 = useAN0;
LED1 = useAN1;
// ADONC2 : Vitesse de l'acquisition.
switch (input_buffer[1]){
case '1' : //500us
ADCON2 = 0b10111001;
delai = 0;
break;
case '2' : //1ms
ADCON2 = 0b10101010;
delai = 0;
break;
case '3' : //2ms
ADCON2 = 0b10101110;
delai = 0;
break;
case '4' :
ADCON2 = 0b10101110;
delai = 95;
break;
case '5' :
ADCON2 = 0b10101110;
delai = 190;
break;
default :
break;
}
}
tempH = 0;
tempL = 0;
tour = useAN1;
if (useAN0 || useAN1) { //Si l'acquisition est lancée sur une des 2 voies
//Dans la partie qui suit le code doit être le plus optimisé possible.
for(buffer = 0; buffer < NOMBRE_BUFFER; buffer++){
adressBuffer();
for(i=0; i<(TAILLE_BUFFER-2); i+=2) {
if (tour){ //Acquisition sur la voie 2
ADCON0 = 0x05; //Turn on AD module, select AN1
ADCON0 = 0x07; //Lancement de l'aquisition.
} else { //Acquisition sur la voie 1
ADCON0 = 0x01; //Turn on AD module, select AN0
ADCON0 = 0x03; //Lancement de l'aquisition.
}
// A partir de maintenant, il faut utiliser le temps "perdu" par la conversion
// C'est à dire faire tous les calculs, pour perdre le moins de temps possible
// à attendre que la conversion soit finie.
// Il faut aussi que le code soit le plus simple et le plus court possible
if (useAN0 && useAN1) { //Permet d'alterner les acquisitions sur les 2 voies
tour = !tour; //si elle sont actives toutes les deux.
}
if (tour) {
tempH +=64;//Voie 0
} else {
tempH +=128;//Voie 1
}
bufferActuel[i] = tempH;
bufferActuel[i+1] = tempL;
if(delai) {Delay10TCYx(delai);}
while (ADCON0bits.GO_DONE); //Attend la fin de la conversion
tempH = ADRESH;
tempL = ADRESL;
}
}
etat = 1; //Il y a des données à envoyer.
useAN0 = 0;
useAN1 = 0;
buffer = 0;
}
}
if (etat == 1) { // Si il y a des données à envoyer
if(mUSBUSARTIsTxTrfReady()){ // et si le derner envoi est terminé
adressBuffer();
mUSBUSARTTxRam((byte*)bufferActuel, TAILLE_BUFFER);
buffer++;
CDCTxService();
}
if (buffer == NOMBRE_BUFFER) {
buffer = 0;
etat = 0;
}
}
}
static void InitializeSystem(void){
TRISBbits.TRISB3 = 0; // Configure ces 3 pin en sortie.
TRISBbits.TRISB0 = 0;
TRISCbits.TRISC6 = 0;
mInitializeUSBDriver(); // voir usbdrv.h
//Config entrée analogique.
TRISA = 0b00001111; //PORTA en tant que sortie, AN0 et AN1 en entrée
//Utilisation de Vref+ et Vref-.
ADCON1 = 0b00111101; //PORTA en mode numérique, sauf AN0 et AN1 en analog/
//Utilise Vref+ et Vref-
ADCON2 = 0b10001101; // 2TAD, Fosc/16
//Initialisation des variables.
etat = 0;
useAN0 = 0;
useAN1 = 0;
tour = 0;
LED0 = 0;
LED1 = 0;
LED2 = 0;
}
// TACHES USB
void USBTasks(void){
USBCheckBusStatus();
if(UCFGbits.UTEYE!=1)
USBDriverService();
#if defined(USB_USE_CDC)
CDCTxService();
#endif
}
// Cette fonction permet d'attribuer à bufferActuel, le buffer dont on a besoin.
void adressBuffer(){
switch(buffer) {
case 0 :
bufferActuel = output_buffer0;
break;
case 1 :
bufferActuel = output_buffer1;
break;
case 2 :
bufferActuel = output_buffer2;
break;
case 3 :
bufferActuel = output_buffer3;
break;
case 4 :
bufferActuel = output_buffer4;
break;
case 5 :
bufferActuel = output_buffer5;
break;
case 6 :
bufferActuel = output_buffer6;
break;
case 7 :
bufferActuel = output_buffer7;
break;
case 8 :
bufferActuel = output_buffer8;
break;
case 9 :
bufferActuel = output_buffer9;
break;
}
} |
Partager