#include<18f2550.h>
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
#define led1 PIN_B2 //está encendido el pic
#define led2 PIN_B3 //esta listo para comunicar
#define led3 PIN_B4 //titila cuando está comunicando
#define salida1 PIN_B5 //avanza el cilindro
#define salida2 PIN_B6 //retrocede el cilindro
#define req PIN_C0 //pin solicita señal a la regla
#define dat PIN_C1 //pin recibe dato de la regla
#define clk PIN_C2 //pin recible reloj de la regla
#define pin_on output_high
#define pin_off output_low
int8 Mensaje[14];
int8 valor_adc_alta=0; // Contiene el MSB del valor del ADC.
int8 valor_adc_baja=0; // Contiene el LSB del valor del ADC.
void config_adcon2(void) {
#asm
movlw 0b10111110
iorwf 0xFC0,1
#endasm
}
void lecturaanalogica1 (void) {
//lectura de canal 0
Mensaje[1]= 0;
Mensaje[2]= 0;
valor_adc_alta=0;
valor_adc_baja=0;
set_adc_channel(0); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_adc_alta = (read_adc()>>8); // Enviamos la parte alta de la conversión de 10 bits.
valor_adc_baja = (int)(read_adc()); // Enviamos la parte baja de la conversión de 10 bits.
//fin de lectura de canal 0
Mensaje[1]=valor_adc_alta;
Mensaje[2]=valor_adc_baja;
}
void lecturaanalogica2 (void) {
//lectura de canal 1
Mensaje[3]= 0;
Mensaje[4]= 0;
valor_adc_alta=0;
valor_adc_baja=0;
set_adc_channel(1); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_adc_alta = (read_adc()>>8); // Enviamos la parte alta de la conversión de 10 bits.
valor_adc_baja = (int)(read_adc()); // Enviamos la parte baja de la conversión de 10 bits.
//fin de lectura de canal 0
Mensaje[3]=valor_adc_alta;
Mensaje[4]=valor_adc_baja;
}
void lecturaregladigital(void) {
int8 i = 0; int8 j = 0; int8 k = 0; //variable aux para obtener el valor de la regla
int8 datoObtenido[14];
Mensaje[5]=0;
Mensaje[6]=0;
Mensaje[7]=0;
Mensaje[8]=0;
Mensaje[9]=0;
Mensaje[10]=0;
Mensaje[11]=0;
Mensaje[12]=0;
Mensaje[13]=0;
datoObtenido[] = 0;
pin_on(req);
for (i=0; i<13; i++){
k=0;
for (j=0; j<4; j++){
while (!input(clk)) {};
while (input(clk)) {};
if (input(dat)==0) bit_clear(k,j);
if (input(dat)==1) bit_set(k,j);
}
datoObtenido[i] = k;
}
Mensaje[5]=datoObtenido[5]; //valor metro
Mensaje[6]=datoObtenido[6]; //valor decimetro
Mensaje[7]=datoObtenido[7]; //valor centimetro
Mensaje[8]=datoObtenido[8]; //valor milimetro
Mensaje[9]=datoObtenido[9]; //valor decimal
Mensaje[10]=datoObtenido[10]; //valor centecimal
Mensaje[11]=datoObtenido[11]; //decimal
Mensaje[12]=datoObtenido[12]; //unidad
Mensaje[13]=datoObtenido[4]; //singo
//fin de lectura de la regla digital
}
void main(void) {
unsigned char datoIN; // Dato que llega por la USART
// definiciones del pic:
set_tris_b(0x00);
delay_cycles(5);
pin_off(led1);
pin_off(led2);
pin_off(led3);
pin_off(salida1);
pin_off(salida2);
setup_adc_ports(AN0_TO_AN1); // Configura canales usados por el ADC.
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: reloj\64.
config_ADCON2(); // Configuramos el ADCON2.
// inicio de puerto usb:
usb_cdc_init(); // Configura el puerto
usb_init(); // Inicializamos el stack USB.
usb_task();
while (!usb_cdc_connected()) {}; // espera a detectar una transmisión de la PC (Set_Line_Coding).
do{
usb_task();
if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host.
if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
datoIN=usb_cdc_getc(); // Lee lo que llego al buffer
//datoIN debe como un byte, cada bit representa las siguientes funciones
//bit 7 = Solicita lectura analógica 2
//bit 6 = Solicita lectura analogica 1
//bit 5 = Solicita lectura de regla
//bit 4 = Enciente salida 2
//bit 3 = Enciende salida 1
//bit 2 = Enciende led 3
//bit 1 = Enciende led 2
//bit 0 = Enciende led 1
if (!bit_test(datoIN,0)){
pin_off(led1);
}
if (bit_test(datoIN,0)){
pin_on(led1);
}
if (!bit_test(datoIN,1)){
pin_off(led2);
}
if (bit_test(datoIN,1)){
pin_on(led2);
}
if (!bit_test(datoIN,2)){
pin_off(led3);
}
if (bit_test(datoIN,2)){
pin_on(led3);
}
if (!bit_test(datoIN,3)){
pin_off(salida1);
}
if (bit_test(datoIN,3)){
pin_on(salida1);
}
if (!bit_test(datoIN,4)){
pin_off(salida2);
}
if (bit_test(datoIN,4)){
pin_on(salida2);
}
if (bit_test(datoIN,5)==1){
lecturaregladigital();
}
if (bit_test(datoIN,6)==1){
lecturaanalogica1();
}
if (bit_test(datoIN,7)==1){
lecturaanalogica2();
}
printf(usb_cdc_putc, "%Xa%Xb%Xc%Xd%U%U%U%U%U%U%U%U%Uq", Mensaje[1], Mensaje[2], Mensaje[3],
Mensaje[4], Mensaje[5], Mensaje[6], Mensaje[7], Mensaje[8], Mensaje[9],
Mensaje[10], Mensaje[11], Mensaje[12], Mensaje[13]);
}
}
}while (TRUE); // bucle infinito.
}
The same as putc(), sends a character. It actually puts a character into the transmitusb_cdc_putc_fast(c)
buffer, and if the transmit buffer is full will wait indefinitely until there is space for the
character.
The same as usb_cdc_putc(), but will not wait indefinitely until there is space for the
character in the transmit buffer. In that situation the character is lost.
for (i=0; i<13; i++){
k=0;
for (j=0; j<4; j++){
while (!input(clk)) {};
while (input(clk)) {};for (i=0; i<13; i++){
k=0;
for (j=0; j<4; j++){
while (!input(clk)) {};
while (input(clk)) {};
es para obtener el valor de un calibre con protocolo digimess. Es la única manera que encontré de obtener su información. No sé que otra forma puedo hacerlo.Respecto al read_adc lo almaceno en dos variables int8. Tengo que ver si hay alguna variable de 10 bits, ¿ ó hay una variable especial para guardar el dato? ¿ó se podrá hacer de otra forma?
es para obtener el valor de un calibre con protocolo digimess. Es la única manera que encontré de obtener su información. No sé que otra forma puedo hacerlo.
Segun lo que leí de las especificaciones de mitutoyo puedo decir que cada CLK son 200 useg. Si mi cálculo es correcto 13 i x 4 j = 52 CLK = 10400 useg = 10.4 miliseg. Creo..... jeje....
void config_adcon2(void) {
#asm
movlw 0b10111110
iorwf 0xFC0,1
#endasm
}#include<18f2550.h>
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
#define led1 PIN_B2 //está encendido el pic
#define led2 PIN_B3 //esta listo para comunicar
#define led3 PIN_B4 //titila cuando está comunicando
#define salida1 PIN_B5 //avanza el cilindro
#define salida2 PIN_B6 //retrocede el cilindro
#define req PIN_C0 //pin solicita señal a la regla
#define dat PIN_C1 //pin recibe dato de la regla
#define clk PIN_C2 //pin recibe reloj de la regla
#define pin_on output_high
#define pin_off output_low
//variables para obtener el valor de la regla
int8 datoObtenido[14];
int8 i=0;
int8 j=0;
int8 k=0;
//variables plara obtener el valor de los sensores
int16 valor_ADC0=0;
int16 valor_ADC1=0;
void lecturaanalogica1 (void) {
//lectura de canal 0
set_adc_channel(0); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_ADC0 = read_adc(); // Guarda el valor en una variable
//fin de lectura de canal 0
}
void lecturaanalogica2 (void) {
//lectura de canal 1
set_adc_channel(1); // Seleccionamos el canal 0 y comenzamos a leer.
delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.
valor_ADC1 = read_adc(); // Guarda el valor en una variable
//fin de lectura de canal 0
}
void lecturaregladigital(void) {
i=0;
j=0;
k=0;
pin_on(req);
for (i=0; i<13; i++){
for (j=0; j<4; j++){
while (!input(clk)) {};
while (input(clk)) {};
if (input(dat)==0) bit_clear(k,j);
if (input(dat)==1) bit_set(k,j);
}
datoObtenido[i] = k;
}
//fin de lectura de la regla digital
}
void main(void) {
unsigned char datoIN; // Dato que llega por la USART
// definiciones del pic:
set_tris_b(0x00);
delay_cycles(5);
pin_off(led1);
pin_off(led2);
pin_off(led3);
pin_off(salida1);
pin_off(salida2);
setup_adc_ports(AN0_TO_AN1); // Configura canales usados por el ADC.
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: relog\64.
// inicio de puerto usb:
usb_cdc_init(); // Configura el puerto
usb_init(); // Inicializamos el stack USB.
usb_task();
while (!usb_cdc_connected()) {}; // espera a detectar una transmisión de la PC (Set_Line_Coding).
do{
usb_task();
if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host.
if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
//pin_off(led1);
//pin_off(led2);
//pin_off(led3);
datoIN=usb_cdc_getc(); // Lee lo que llego al buffer
//datoIN debe como un byte, cada bit representa las siguientes funciones
//bit 7 = Solicita lectura analógica 2
//bit 6 = Solicita lectura analogica 1
//bit 5 = Solicita lectura de regla
//bit 4 = Enciente salida 2
//bit 3 = Enciende salida 1
//bit 2 = Enciende led 3
//bit 1 = Enciende led 2
//bit 0 = Enciende led 1
if (!bit_test(datoIN,0)){
pin_off(led1);
}
if (bit_test(datoIN,0)){
pin_on(led1);
}
if (!bit_test(datoIN,1)){
pin_off(led2);
}
if (bit_test(datoIN,1)){
pin_on(led2);
}
if (!bit_test(datoIN,2)){
pin_off(led3);
}
if (bit_test(datoIN,2)){
pin_on(led3);
}
if (!bit_test(datoIN,3)){
pin_off(salida1);
}
if (bit_test(datoIN,3)){
pin_on(salida1);
}
if (!bit_test(datoIN,4)){
pin_off(salida2);
}
if (bit_test(datoIN,4)){
pin_on(salida2);
}
if (bit_test(datoIN,5)==1){
lecturaregladigital();
usb_cdc_putc(datoObtenido[]);
}
if (bit_test(datoIN,6)==1){
lecturaanalogica1();
usb_cdc_putc(valor_ADC0); //no se que va a pasar con esto
}
if (bit_test(datoIN,7)==1){
lecturaanalogica2();
usb_cdc_putc(valor_ADC1);
}
}
}
}while (TRUE);
}