-- Control de apertura de pinzas montadas en servo motor HS322 para sostener objetos utilizando un sensor de fuerza FSR400.
#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#DEVICE adc=10 // CONFIGURACION DE LA ESCALA DEL ADC
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
VOID LONG_DELAY_US(LONG C); // FUNCIÓN DE DELAY EXACTO PARA EL MOTOR
INT BUTTON; // BOTON DE OPERACIÓN
INT16 T=0; // VQARIABLE DE TIEMPO
INT I, I2; // VARIABLES DE CICLOS
INT16 VAL; // VARIABLE DE LECTURA ACTUAL
VOID MAIN(){
// CONFIGURACIÓN DEL PUERTO A COMO ANALOGICO
SETUP_PORT_A(ALL_ANALOG); // TODO EL PUERTO A COMO ANALOGICO
SETUP_ADC(ADC_CLOCK_INTERNAL); // RELOG INTERNO DEL CONV. A/D
SET_ADC_CHANNEL(0); // SELECCIONA EL CANAL 0
FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA CONFIGURACION INICIAL
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(300); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR INICIAL
WHILE(1){
BUTTON=INPUT_B(); // BOTON DE STOP PUERTO E
IF(BUTTON==0X00){ // REVISA EL BOTÓN
ABRE: // SECCIÓN PARA ABRIR PINZAS
FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA BRIR LAS PINZAS
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(1050); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR OPEN
T=1050; // COLOCA LA VARIABLE T EN EL ULTIMO ANCHO DE PULSO
DELAY_MS(2000); // ESPERA DOS SEGUNDOS
} // CONDICION DE ABRIR PINZAS
ELSE IF(BUTTON==0X01 && T==1050){ // CONDICIÓN PARA CERRAR PINZAS
FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA CERRAR LAS PINZAS
VAL=READ_ADC(); // SE ASIGNA A VAR LA LECTURA DEL CANAL 0
T=T-30; // DISMUNUYE EL VALOR DE T
IF(VAL<=740){ // CONDICIÓN DEL SENSOR
T=T-10; // AJUSTA LA VARIABLE DEL ANCHO DE PULSO
FOR(I2=0;I2<200;I2++){ // CICLOS DE AJUSTE
BUTTON=INPUT_B(); // BOTON DE STOP PUERTO E
IF(BUTTON==0X00){ // REVISA EL BOTÓN
GOTO ABRE; // VE A LA SECCIÓN DE ABRIR PINZAS
} // CONDICIÓN DE ABRIR LAS PINZAS
FOR(I=0;I<10;I++){ // CICLOS DE AJUSTE
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(T); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
}}} // CICLOS DE AJUSTE
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(200); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR CLOSE
} // CONDICIÓN DE CERRA PINZAS
} // WHILE
} //MAIN
// FUNCION DE DELAY EN US
VOID LONG_DELAY_US(LONG C){
CHAR i; // VARIABLE DE CONDICION
i=(CHAR)(C>>8); // IGUALA I A C EN 8 BITS
WHILE(I >= 1) { // CONDICION DE TIEMPO MINIMO
I--; // LA VARIABLE VA DISMINUYENDO
DELAY_US(253); // DELAY DE 253 US
RESTART_WDT(); // RESETEA EL CONTADOR DEL WATCHDOG
} // WHILE
DELAY_US((CHAR)C);
} //FUNCION DELAY US
Buscar este blog
viernes, 13 de mayo de 2016
Control de apertura de pinzas con sensor de Fuerza
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Fución de contador con visualización en LCD
VOID DELAY(INT T); // ENCABEZADO DE LA FUNCIÓN
DELAY(10); // USO DELA FUNCIÓN PARA CONTAR 10 SEGUNDOS
// FUNCION DELAY EN S
VOID DELAY(INT T){ // T SON LOS SEGUNDOS QUE SE DESEA CONTAR
INT C=0;
FOR(C;C<(T+1);C++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",C);
LCD_PUTC("s ");
DELAY_MS(1000);
} // FOR
} // FUNCION DELAY
DELAY(10); // USO DELA FUNCIÓN PARA CONTAR 10 SEGUNDOS
// FUNCION DELAY EN S
VOID DELAY(INT T){ // T SON LOS SEGUNDOS QUE SE DESEA CONTAR
INT C=0;
FOR(C;C<(T+1);C++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",C);
LCD_PUTC("s ");
DELAY_MS(1000);
} // FOR
} // FUNCION DELAY
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Secuencia de Movimiento para un servo HS322 con visualización en LCD y pulsación de un laser
#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4 PIN_B4
#DEFINE LCD_DB5 PIN_B5
#DEFINE LCD_DB6 PIN_B6
#DEFINE LCD_DB7 PIN_B7
#DEFINE LCD_RS PIN_B2
#DEFINE LCD_E PIN_B3
#INCLUDE <lcd1.c>
INT N; // CONTADOR DEL CICLO DE 3
INT D; // CONTADOR DE REPETICIONES
INT L; // CONTADOR DEL LASER
INT I; // CONTADOR DE LOS PULSOS
INT ENC; // ENTRADA DEL ENCODER
VOID MAIN(){
LCD_INIT();
FOR(I=0;I<30;I++){
OUTPUT_C(0X00); // APAGA EL LASER
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN NEUTRO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_PUTC("\fSERVO NEUTRO");
} // FOR
WHILE(1){
FOR(N=1;N<4;N++){
OUTPUT_E(0X00); // APAGA EL LASER
LCD_PUTC("\fCICLO: "); // NUMERO DEL CICLO DE 3
PRINTF(LCD_PUTC,"%u",N);
DELAY_MS(1000);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
LCD_PUTC("\fSECUENCIA P1"); // INICIA LA SECUENCIA DE LA PRACTICA 1
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SERVO: 0");
LCD_PUTC(", ENC: 0");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:0, ");
LCD_PUTC("ED:0");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
FOR(D=1;D<11;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2250); // COLOCA EL SERVO EN 15°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:15, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2100); // COLOCA EL SERVO EN 30°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:30, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1950); // COLOCA EL SERVO EN 45°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:45, ");
LCD_PUTC("ED:22.5");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1800); // COLOCA EL SERVO EN 60°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:60, ");
LCD_PUTC("ED:45");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
} // FOR DE CILO DE 3
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(L=0;L<5;L++){
OUTPUT_E(0X01); // ENCIENDE EL LASER
LCD_GOTOXY(1,2);
LCD_PUTC("LASER PULSANDO"); // ESPLIEGA MENSAJE DE SALER PULANDO
DELAY_MS(500);
OUTPUT_E(0X00); // APAGA EL LASER
DELAY_MS(500);
} // FOR LASER
} // WHILE
} //MAIN
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4 PIN_B4
#DEFINE LCD_DB5 PIN_B5
#DEFINE LCD_DB6 PIN_B6
#DEFINE LCD_DB7 PIN_B7
#DEFINE LCD_RS PIN_B2
#DEFINE LCD_E PIN_B3
#INCLUDE <lcd1.c>
INT N; // CONTADOR DEL CICLO DE 3
INT D; // CONTADOR DE REPETICIONES
INT L; // CONTADOR DEL LASER
INT I; // CONTADOR DE LOS PULSOS
INT ENC; // ENTRADA DEL ENCODER
VOID MAIN(){
LCD_INIT();
FOR(I=0;I<30;I++){
OUTPUT_C(0X00); // APAGA EL LASER
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN NEUTRO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_PUTC("\fSERVO NEUTRO");
} // FOR
WHILE(1){
FOR(N=1;N<4;N++){
OUTPUT_E(0X00); // APAGA EL LASER
LCD_PUTC("\fCICLO: "); // NUMERO DEL CICLO DE 3
PRINTF(LCD_PUTC,"%u",N);
DELAY_MS(1000);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
LCD_PUTC("\fSECUENCIA P1"); // INICIA LA SECUENCIA DE LA PRACTICA 1
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SERVO: 0");
LCD_PUTC(", ENC: 0");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:0, ");
LCD_PUTC("ED:0");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
FOR(D=1;D<11;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2250); // COLOCA EL SERVO EN 15°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:15, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2100); // COLOCA EL SERVO EN 30°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:30, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1950); // COLOCA EL SERVO EN 45°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:45, ");
LCD_PUTC("ED:22.5");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1800); // COLOCA EL SERVO EN 60°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:60, ");
LCD_PUTC("ED:45");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
} // FOR DE CILO DE 3
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(L=0;L<5;L++){
OUTPUT_E(0X01); // ENCIENDE EL LASER
LCD_GOTOXY(1,2);
LCD_PUTC("LASER PULSANDO"); // ESPLIEGA MENSAJE DE SALER PULANDO
DELAY_MS(500);
OUTPUT_E(0X00); // APAGA EL LASER
DELAY_MS(500);
} // FOR LASER
} // WHILE
} //MAIN
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Control de LCD con PIC 16F877A
#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B2
#define LCD_E PIN_B3
#include <lcd1.c>
VOID MAIN(){
lcd_init();
FOR(;;){
lcd_putc("\f ICH HABE WASSER");
delay_ms(200);
} // FOR
} //MAIN
lnk para descargar la librería de la LDC, lcd1.c: http://microstronic.blogspot.mx/2015/04/modulos-lcd.html
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B2
#define LCD_E PIN_B3
#include <lcd1.c>
VOID MAIN(){
lcd_init();
FOR(;;){
lcd_putc("\f ICH HABE WASSER");
delay_ms(200);
} // FOR
} //MAIN
lnk para descargar la librería de la LDC, lcd1.c: http://microstronic.blogspot.mx/2015/04/modulos-lcd.html
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Lectura de un encoder rotativo acoplado a servo HS322
El tamaño de paso para este encoder en especifico es de 22.5 grados.
#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4 PIN_B4
#DEFINE LCD_DB5 PIN_B5
#DEFINE LCD_DB6 PIN_B6
#DEFINE LCD_DB7 PIN_B7
#DEFINE LCD_RS PIN_B2
#DEFINE LCD_E PIN_B3
#INCLUDE <lcd1.c>
INT D; // CONTADOR DE REPETICIONES
INT I; // CONTADOR DE LOS PULSOS
INT ENC;
VOID MAIN(){
LCD_INIT();
while(1){
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\f");
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
} // FOR
} // WHILE
} //MAIN
#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4 PIN_B4
#DEFINE LCD_DB5 PIN_B5
#DEFINE LCD_DB6 PIN_B6
#DEFINE LCD_DB7 PIN_B7
#DEFINE LCD_RS PIN_B2
#DEFINE LCD_E PIN_B3
#INCLUDE <lcd1.c>
INT D; // CONTADOR DE REPETICIONES
INT I; // CONTADOR DE LOS PULSOS
INT ENC;
VOID MAIN(){
LCD_INIT();
while(1){
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\f");
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
} // FOR
} // WHILE
} //MAIN
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Función para el control de un servomotor HS322
Para el uso de la función solo restaría hacer la declaración de la misma en los encabezados del código, seria de la siguiente forma:
VOID SERVO(INT16 U, INT16 D);
VOID LONG_DELAY_US(LONG C);
La variable U es el ángulo de apertura t la variable D es el tiempo del pulso en cero se puede usar 20000, pero depende de la velocidad que se desee para el servo.
// FUNCION DE CONTROL DE SERVO
VOID SERVO(INT16 U, INT16 D){
INT I; // REPETICIONES DE LOS PULSOS
INT16 T; // VQARIABLE DE TIEMPO
T=2400-(U*10); // CALCULA EL TIEMPO DEL PULSO
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(T);
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(D); // DELAY DE APAGADO
} // FOR
} // FUNCION SERVO
-- JUNTAR CON DELAY US
// FUNCION DE DELAY EN US
VOID LONG_DELAY_US(LONG C){
CHAR i; // VARIABLE DE CONDICION
i=(CHAR)(C>>8); // IGUALA I A C EN 8 BITS
WHILE(I >= 1) { // CONDICION DE TIEMPO MINIMO
I--; // LA VARIABLE VA DISMINUYENDO
DELAY_US(253); // DELAY DE 253 US
RESTART_WDT(); // RESETEA EL CONTADOR DEL WATCHDOG
} // WHILE
DELAY_US((CHAR)C);
} //FUNCION DELAY US
VOID SERVO(INT16 U, INT16 D);
VOID LONG_DELAY_US(LONG C);
La variable U es el ángulo de apertura t la variable D es el tiempo del pulso en cero se puede usar 20000, pero depende de la velocidad que se desee para el servo.
// FUNCION DE CONTROL DE SERVO
VOID SERVO(INT16 U, INT16 D){
INT I; // REPETICIONES DE LOS PULSOS
INT16 T; // VQARIABLE DE TIEMPO
T=2400-(U*10); // CALCULA EL TIEMPO DEL PULSO
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(T);
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(D); // DELAY DE APAGADO
} // FOR
} // FUNCION SERVO
-- JUNTAR CON DELAY US
// FUNCION DE DELAY EN US
VOID LONG_DELAY_US(LONG C){
CHAR i; // VARIABLE DE CONDICION
i=(CHAR)(C>>8); // IGUALA I A C EN 8 BITS
WHILE(I >= 1) { // CONDICION DE TIEMPO MINIMO
I--; // LA VARIABLE VA DISMINUYENDO
DELAY_US(253); // DELAY DE 253 US
RESTART_WDT(); // RESETEA EL CONTADOR DEL WATCHDOG
} // WHILE
DELAY_US((CHAR)C);
} //FUNCION DELAY US
Etiquetas:Progrmacion ,C++, Practicas programacion
C (CCS)
Suscribirse a:
Entradas (Atom)