// ************************************** // JPDuinoScope - Xiloscópio multifunções // Versão de 17 de Fevereiro de 2012 // ************************************** // Alteração da taxa de amostragem das entradas analógicas #define FASTADC 1 #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif // Variaveis e buffers int comando; // Variavel de entrada série int cmd; byte trgg; byte atrs; byte Modo; // Modo de funcionamento byte Saida[803]; // Buffer de saída série byte MiniSaida[6]; // Mini Buffer de saída série int Trigger; // Variavel de limiar de disparo byte Atraso; // Variavel do atraso em milisegundos: int Leitura; // Variavel que recebe o valor da entrada analógica int i=0; // Apontador principal byte LB; // Byte menos significativo byte HB; // Byte mais significativo byte digital; // Representa entradas digitais // constantes unsigned long time; unsigned long inicio; int duracao; // Definição de pinos int PinAnalogico0=0; //Define o pino A0 como entrada 0 do sinal analógico int PinAnalogico1=1; //Define o pino A1 como entrada 1 do sinal analógico int PinDigital0=2; //Define o pino D2 como entrada 0 do sinal digital int PinDigital1=3; //Define o pino D3 como entrada 1 do sinal digital int PinDigital2=4; //Define o pino D4 como entrada 2 do sinal digital int PinDigital3=5; //Define o pino D5 como entrada 3 do sinal digital int PinDigital4=6; //Define o pino D6 como entrada 4 do sinal digital int PinDigital5=7; //Define o pino D7 como entrada 5 do sinal digital // Preparação e ajuste void setup(){ Serial.begin(800000); // Inicia porta Série. // altera prescaler da amostragem de 128 para 16 #if FASTADC sbi(ADCSRA,ADPS2) ; cbi(ADCSRA,ADPS1) ; cbi(ADCSRA,ADPS0) ; #endif } //************** Anel principal void loop(){ Modo=0; while(Modo==0){ if(Serial.available()>0){ Modo=Serial.read(); // Recebe comando de modo delay(10); cmd=Serial.read(); // Recebe comando Trigger e Atraso } } trgg=cmd>>4; // Trigger são os 4 bits mais significativos atrs=cmd<<4; // primero expulsa 4 bits mais significativos atrs=atrs>>4; // depois recoloca os 4 bits menos significativos e toma esse como valor do atraso if(trgg==0){Trigger=0;} else {Trigger=510+(2*trgg);}; Atraso=1+(4*atrs*atrs); time=millis(); //* // ********************* MODOS DE TEMPO REAL //* //***** MODO - ANALISADOR DIGITAL if(Modo==1){ // Selecção de modo - analisador digital - modo SLOW i=0; // **************** AQUI VAI FICAR TRIGGER inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel digital=0; if(digitalRead(PinDigital0)){bitSet(digital,0);}; if(digitalRead(PinDigital1)){bitSet(digital,1);}; if(digitalRead(PinDigital2)){bitSet(digital,2);}; if(digitalRead(PinDigital3)){bitSet(digital,3);}; if(digitalRead(PinDigital4)){bitSet(digital,4);}; if(digitalRead(PinDigital5)){bitSet(digital,5);}; Serial.println(digital); i++; } delay(50); } //***** MODOS OSCILOSCOPIO // ****** OSCILOSCOPIO 1 CANAL - CANAL 1 if(Modo==2){ // Selecção de modo - osciloscopio 1 canal - canal 1 - modo SLOW i=0; while(Leitura(time+1000.0)){break;}; delay(1); } inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico0); Serial.println(Leitura); i++; } delay(50); } // ****** OSCILOSCOPIO 1 CANAL - CANAL 2 if(Modo==3){ // Selecção de modo - osciloscopio 1 canal - canal 2 - modo SLOW i=0; while(Leitura(time+1000.0)){break;}; delay(1); } inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico1); Serial.println(Leitura); i++; } delay(50); } // ****** OSCILOSCOPIO 2 CANAIS - CANAL 1 + 2 if(Modo==4){ // Selecção de modo - osciloscopio 2 canais - canal 1+2 - modo SLOW i=0; while(Leitura(time+1000.0)){break;}; delay(1); } inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico0); MiniSaida[0]=170; // Byte de erro MiniSaida[1]=highByte(Leitura); // Byte mais significativo da leitura Canal1 MiniSaida[2]=lowByte(Leitura); // Byte menos significativo da leitura Canal1 Leitura=analogRead(PinAnalogico1); MiniSaida[3]=highByte(Leitura); // Byte mais significativo da leitura Canal2 MiniSaida[4]=lowByte(Leitura); // Byte menos significativo da leitura Canal2 MiniSaida[5]=170; // Byte de erro Serial.write(MiniSaida,6); i++; } delay(250); } // ********************* MODOS DE AMOSTRAGEM //* //***** MODO - ANALISADOR DIGITAL if(Modo==5){ // Selecção de modo - analisador digital - modo FAST i=0; // **************** AQUI VAI FICAR TRIGGER inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel digital=0; if(digitalRead(PinDigital0)){bitSet(digital,0);}; if(digitalRead(PinDigital1)){bitSet(digital,1);}; if(digitalRead(PinDigital2)){bitSet(digital,2);}; if(digitalRead(PinDigital3)){bitSet(digital,3);}; if(digitalRead(PinDigital4)){bitSet(digital,4);}; if(digitalRead(PinDigital5)){bitSet(digital,5);}; Saida[i]=digital; // Saida é igual ´a soma lógica ''or'' das saidas activas i++; } duracao=int(micros()-inicio); LB=lowByte(duracao); // Byte menos significativo da leitura HB=highByte(duracao); // Byte mais significativo da leitura Saida[800]=LB; Saida[801]=HB; Serial.write(Saida,802); delay(50); } //***** MODOS OSCILOSCOPIO // ****** OSCILOSCOPIO 1 CANAL - CANAL 1 if(Modo==6){ // Selecção de modo - osciloscopio 1 canal - canal 1 - modo FAST i=0; while(Leitura(time+1000.0)){break;}; delay(1); } inicio=micros(); while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico0); LB=lowByte(Leitura); // Byte menos significativo da leitura HB=highByte(Leitura); // Byte mais significativo da leitura Saida[i]=LB>>2|HB<<6; // Saida é igual ´a soma lógica ''or'' de LB OR HB i++; } // duracao=int(micros()-inicio); // LB=lowByte(duracao); // Byte menos significativo da leitura //HB=highByte(duracao); // Byte mais significativo da leitura // Saida[800]=LB; //Saida[801]=HB; Serial.write(Saida,802); delay(50); } // ****** OSCILOSCOPIO 1 CANAL - CANAL 2 if(Modo==7){ // Selecção de modo - osciloscopio 1 canal - canal 2 - modo FAST i=0; while(Leitura(time+1000.0)){break;}; delay(1); } while(i<800){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico1); LB=lowByte(Leitura); // Byte menos significativo da leitura HB=highByte(Leitura); // Byte mais significativo da leitura Saida[i]=LB>>2|HB<<6; // Saida é igual ´a soma lógica ''or'' de LB OR HB i++; } Serial.write(Saida,802); delay(50); } // ****** OSCILOSCOPIO 2 CANAIS if(Modo==8){ // Selecção de modo - osciloscopio 2 canais - modo FAST i=0; while(Leitura(time+1000.0)){break;}; delay(1); } while(i<400){ // anel de medida delayMicroseconds(Atraso); // Atraso programavel Leitura=analogRead(PinAnalogico0); LB=lowByte(Leitura); // Byte menos significativo da leitura HB=highByte(Leitura); // Byte mais significativo da leitura Saida[i]=LB>>2|HB<<6; // Saida é igual ´a soma lógica ''or'' de LB OR HB Leitura=analogRead(PinAnalogico1); LB=lowByte(Leitura); // Byte menos significativo da leitura HB=highByte(Leitura); // Byte mais significativo da leitura Saida[i+400]=LB>>2|HB<<6; // Saida é igual ´a soma lógica ''or'' de LB OR HB i++; } Serial.write(Saida,802); delay(100); } // ****** MODO DE INICIALIZAÇÃO if(Modo==25){ // Selecção de modo - osciloscopio 2 canais - modo FAST Serial.println("JPSCOPE"); delay(1000); } }