Programacion en C Con Hi Tech

43
Video Tutorial Programar en PIC-C Compiler No. 1 - Encender y Apagar LEDS http://www.youtube.com/watch?v=87jwQ7LOguc Video Tutorial Programar en PIC-C Compiler No. 2 - Control de Encendido de LEDS http://www.youtube.com/watch?v=xWTcfiKoEIE Video Tutorial Programar en PIC-C Compiler No. 3 - Mostrar Mensaje Mediante Virtual Terminal http://www.youtube.com/watch?v=C04NG3toNsM Video Tutorial Programar en PIC-C Compiler No. 4 – Calculadora http://www.youtube.com/watch?v=Nl_dJEzH6QA Video Tutorial Programar en PIC-C Compiler No. 5 - Modulo LCD http://www.youtube.com/watch?v=E8zKV5BBMoA Video Tutorial Programar en PIC-C Compiler No. 6 - Control de Encendido de un Bombillo http://www.youtube.com/watch?v=OIHwvUAZnFg Video tutorial como programar en pic C Compiler simulado en proteus y quemado en PicKit2 http://www.youtube.com/watch?v=jFSq0-eQD54 Tutorial PIC en C, Puertos Digitales, Código (CCS) 2/3 http://www.youtube.com/watch?v=FB_fLt-kBq0 Tutorial PIC en C Timer, Introducción (CCS) 1/3 http://www.youtube.com/watch?v=H0RIbRF7uAc Tutorial PIC en C, Timer, Código (CCS) 2/3 http://www.youtube.com/watch?v=4Wriu7VByF8 Tutorial PIC en C, Timer, Funcionamiento (CCS) 3/3 tutorial programación en mplab PIC16f877A (asembler) http://www.youtube.com/watch?v=gXoaAgSJePA Tutorial_CCS compiler_Nº1_Blink leds http://www.youtube.com/watch?v=qoo_q-g7Ta8

Transcript of Programacion en C Con Hi Tech

Video Tutorial Programar en PIC-C Compiler No. 1 - Encender y Apagar LEDS

http://www.youtube.com/watch?v=87jwQ7LOguc

Video Tutorial Programar en PIC-C Compiler No. 2 - Control de Encendido de LEDS

http://www.youtube.com/watch?v=xWTcfiKoEIE

Video Tutorial Programar en PIC-C Compiler No. 3 - Mostrar Mensaje Mediante Virtual

Terminal

http://www.youtube.com/watch?v=C04NG3toNsM

Video Tutorial Programar en PIC-C Compiler No. 4 – Calculadora

http://www.youtube.com/watch?v=Nl_dJEzH6QA

Video Tutorial Programar en PIC-C Compiler No. 5 - Modulo LCD

http://www.youtube.com/watch?v=E8zKV5BBMoA

Video Tutorial Programar en PIC-C Compiler No. 6 - Control de Encendido de un Bombillo

http://www.youtube.com/watch?v=OIHwvUAZnFg

Video tutorial como programar en pic C Compiler simulado en proteus y quemado en PicKit2

http://www.youtube.com/watch?v=jFSq0-eQD54

Tutorial PIC en C, Puertos Digitales, Código (CCS) 2/3

http://www.youtube.com/watch?v=FB_fLt-kBq0

Tutorial PIC en C Timer, Introducción (CCS) 1/3

http://www.youtube.com/watch?v=H0RIbRF7uAc

Tutorial PIC en C, Timer, Código (CCS) 2/3

http://www.youtube.com/watch?v=4Wriu7VByF8

Tutorial PIC en C, Timer, Funcionamiento (CCS) 3/3

tutorial programación en mplab PIC16f877A (asembler)

http://www.youtube.com/watch?v=gXoaAgSJePA

Tutorial_CCS compiler_Nº1_Blink leds

http://www.youtube.com/watch?v=qoo_q-g7Ta8

PROGRAMAS HECHOS EN MPLAB

http://www.forosdeelectronica.com/f24/programas-hechos-mplab-20784/

Ejemplo 1

Este es un simple parpadeo de un led...

Nota: Los programas fueron hechos por mí no es un copy/paste de otros sitios)

Código:

///////////////////////////////////////////////////////////////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #byte TRISB=0x86 #byte PORTB=0x06 void main(void){ TRISB=0x00; PORTB=0x00; do{ output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000); }while(TRUE); }

Puse abajo un practica hecha en proteus 7.4 para que puedas bajarlo y compilador en mplab.

Ejemplo 2

Este es un simple contador de 0 a 9; donde solo se utiliza un display de cátodo común en el puerto b del

pic

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTADOR 0 A 9 //DATE:23/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) //INICIO DEL PROGRAMA/////////////// void main(void){ //VARIBALES/////////////////////////// int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000, 0b10011001,0b10010010,0b10000011,0b11111000, 0b10000000,0b00011000}; int contador; //CONFIGURACION E/S/////////////// set_tris_b(0x00); do{ for(contador=0;contador<=9;++contador){

output_b(mostrar[contador]); delay_ms(1000);

} }while(TRUE); }

Ejemplo 3

Este programa hace un scroll de un led ...en el puerto b del pic... de un solo lado va estar corriendo el

led...mientras no sea pulsado el push botton que esta en el pin0 del pic.. del puerto a y si es pulsado

el led el scroll se dirigirá al lado contrario al que estaba

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;FUNCIONES DEL CCS C COMPLIER //DATE:27/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) retorna(int c); void main(void){ int a; set_tris_b(0x00); set_tris_a(0x21); a=1; do{ output_b(a); if(a==128) a=1; else a=a<<1; delay_ms(100); if(input(PIN_A0)) a=retorna(a); }while(TRUE); } retorna(int c){ do{ if(c==1) c=128; else c=c>>1; output_b(c); delay_ms(100); }while(input(PIN_A0)); return(c); }

Ejemplo 4

Este programa es un simple decodificador de 0 a 7, donde se usa tres pulsadores en el puerto a...se le

introduce un numero binario de 000 a 111 para que en el display de ánodo común aparezca el 0 a 7,...

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;DECODIFICADOR //DATE:23/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) //INICIO DEL PROGRAMA//////////////////// void main(void){ int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000, 0b10011001,0b10010010,0b10000011,0b11111000}; int numero; set_tris_b(0x00); set_tris_a(0xff); setup_comparator(NC_NC_NC_NC); do{ numero=input_a(); output_b(mostrar[numero]); output_b(mostrar[numero]); }while(TRUE); }

Ejemplo 5

Simple programa que controla un lcd....

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTADOR 0 A 9 //DATE:23/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #define use_portb_lcd TRUE #include<LCD.C> int x[]={"hola"}; int y[]={"JORGE"}; int i; void main(){ lcd_init(); for(i=0;i<=3;i++){ lcd_putc(x[i]); delay_ms(1000); } lcd_putc("\n"); lcd_putc("# es; "); for(i=0;i<=4;i++){ lcd_putc(y[i]);

delay_ms(1000); } lcd_putc("\f otra vez?"); }

Ejemplo 6

Este programa hace una comunicación serial con la campo y el pic... si quieres verlo que funcione entra a

youtube...y busquen "godness006" ahí están algunos proyectos que he hecho

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;TERMINAL VIRTUAL //DATE:24/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7) void main(void){ int VALOR; set_tris_b(0x80); do{ for(VALOR=0;VALOR<=10;VALOR++){ printf("EL VALOR ES: %u\r",VALOR); delay_ms(1000); } }while(TRUE);

}

Archivos Adjuntos

hercules_3_2_1_950.7z (417,1 KB (Kilobytes), 827 visitas)

Ejemplo 7

Este programa lo que hace...por medio de la computadora vas a ingresar a un numero del teclado de la

computadora, al display.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;DECODIFICADOR_RS232 //DATE:03/MAYO/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7) void config(void){ set_tris_a(0x20); set_tris_b(0x80); setup_comparator(NC_NC_NC_NC); } void main(void){

int mostrar[]={0b10000000,0b11011001,0b01000100,0b01010000,0b00011001, 0b00010010,0b00000011,0b11011000,0b00000000,0b00011000}; int x; config(); output_a(0b10000000); do{ x=getc(); switch(x){ case 48: output_a(mostrar[0]); break; case 49: output_a(mostrar[1]); break; case 50: output_a(mostrar[2]); break; case 51: output_a(mostrar[3]); break; case 52: output_a(mostrar[4]); break; case 53: output_a(mostrar[5]); break; case 54: output_a(mostrar[6]); break; case 55: output_a(mostrar[7]); break; case 56: output_a(mostrar[8]); break; case 57: output_a(mostrar[9]); break; } }while(TRUE); }

Ejemplo 8

Código:

//------------------------------------ //TITULO: SENSOR DE TEMPERATURA Y ENVIADO A LA PC //AUTOR: JORGE ARTURO RODRIGUEZ HERNANDEZ //FECHA: 12\JUNIO\'09 //------------------------------------ #include <12f675.h> #fuses XT,NOWDT,NOCPD,NOPROTECT,MCLR,NOPUT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A1) void config(void){ set_tris_a(0x3b); setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); } void main(void){ int x,y; config(); do{ x=read_adc(); delay_ms(500); y=2*x; printf("LA TEMP= %u",y); printf("°C\r\n"); }while(TRUE); }

Archivos Adjuntos

temperatura_589.7z (7,5 KB (Kilobytes), 719 visitas)

Ejemplo 9

Simple circuito con un pic16f887, que se trata de un teclado análogo, escribimos la contraseña o la

podemos cambiar.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTRASENA //DATE:18/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f887.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT #use delay(clock=8000000) #include<LCD.C> int LEER_TECLADO; int TECLADO[]={"0123456789#*"}; int UNO,DOS,TRES,CUATRO; int UNO_P,DOS_P,TRES_P,CUATRO_P; int GOA,i; void config(void){ write_eeprom(0x04,1); write_eeprom(0x05,2); write_eeprom(0x06,3); write_eeprom(0x07,4); set_tris_a(0x01); set_tris_c(0x00); setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); output_low(PIN_C0); lcd_putc("\fCOMPILED ON\n"); lcd_putc(__DATE__); delay_ms(2000); } ADC(int VALOR_ADC){ NO_PULSADO: delay_ms(10); VALOR_ADC=read_adc(); if(VALOR_ADC>140){ goto NO_PULSADO; } else if(VALOR_ADC<24){ VALOR_ADC=1; } else if(VALOR_ADC<43){ VALOR_ADC=2; } else if(VALOR_ADC<60){ VALOR_ADC=3; } else if(VALOR_ADC<74){ VALOR_ADC=4; } else if(VALOR_ADC<88){ VALOR_ADC=5; } else if(VALOR_ADC<98){ VALOR_ADC=6; } else if(VALOR_ADC<108){

VALOR_ADC=7; } else if(VALOR_ADC<114){ VALOR_ADC=8; } else if(VALOR_ADC<122){ VALOR_ADC=9; } else if(VALOR_ADC<128){ VALOR_ADC=0; } else if(VALOR_ADC<137){ VALOR_ADC=10; } else if(VALOR_ADC<140){ VALOR_ADC=11; } return(VALOR_ADC); } void ESCRIBIR_PASSWORD(void){ for(i=0;i<=3;i++){ delay_ms(500); LEER_TECLADO=ADC(LEER_TECLADO); write_eeprom(i,LEER_TECLADO); lcd_putc(TECLADO[LEER_TECLADO]); } delay_ms(500); } void CAMBIAR(void){ lcd_putc("\fESCRIBE AHORA\n"); ESCRIBIR_PASSWORD(); UNO=read_eeprom(0x00); DOS=read_eeprom(0x01); TRES=read_eeprom(0x02); CUATRO=read_eeprom(0x03); write_eeprom(0x04,UNO); write_eeprom(0x05,DOS); write_eeprom(0x06,TRES); write_eeprom(0x07,CUATRO); lcd_putc("\fCAMBIADO"); delay_ms(1000); } void CHEKAR(void){ UNO=read_eeprom(0x00); DOS=read_eeprom(0x01); TRES=read_eeprom(0x02); CUATRO=read_eeprom(0x03); UNO_P=read_eeprom(0x04); DOS_P=read_eeprom(0x05); TRES_P=read_eeprom(0x06); CUATRO_P=read_eeprom(0x07); } void main(void){ lcd_init(); config(); AGAIN:

do{ lcd_putc("\fCHANGE->(*)\n"); lcd_putc("ENTER-->(#)"); GOA=ADC(GOA); switch (GOA){ case 10: lcd_putc("\fPASSWORD:\n"); ESCRIBIR_PASSWORD(); goto CHEK; case 11: lcd_putc("\fESCRIBE EL\n"); lcd_putc("PASSWORD 1ERO"); delay_ms(800); lcd_putc("\fTYPE NOW\n"); ESCRIBIR_PASSWORD(); CHEKAR(); if(UNO==UNO_P && DOS==DOS_P && TRES==TRES_P && CUATRO==CUATRO_P){ lcd_putc("\fCORRECTO"); delay_ms(1000); CAMBIAR(); } else lcd_putc("\fINCORRECTO"); delay_ms(1000); break; } }while(TRUE); CHEK: CHEKAR(); if(UNO==UNO_P && DOS==DOS_P && TRES==TRES_P && CUATRO==CUATRO_P){ lcd_putc("\fCORRECTO"); output_high(PIN_C0); } else lcd_putc("\fINCORRECTO"); delay_ms(3000); output_low(PIN_C0); goto AGAIN; }

Archivos Adjuntos

contrasena_614.7z (19,1 KB (Kilobytes), 504 visitas)

Ejemplo 10

Este circuito lo que haces es por medio de la computadora tenemos un programa llamado hércules que

hace la comunicación serial con el pic, bueno por medio de este programa introducimos un password en

este caso es "hola", si es así prendera un led indicando que se activó algo, y si ponemos otra palabra que

no sea "hola" prendera otro led indicando que esta mal el password.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;PASSWORD //DATE:25/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include <STRING.H>

#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7) void main(void){ char password[6]; char numero[]="hola"; set_tris_b(0x80); setup_comparator(NC_NC_NC_NC); printf("ESCRIBA EL PASSWORD PORFAVOR: \r"); while(TRUE){ printf("PASSWORD: %S\n ",gets(password)); if (!strcmp(password,numero)){ printf("BIEN \r"); output_high(PIN_B0); output_low(PIN_B1); } else{ printf("MAL \r"); output_low(PIN_B0); output_high(PIN_B1); } } }

Bueno tengo un programa llamado configure virtual serial port es bueno para simular puertos seriales

y ya podrás conectarlo con proteus con el compim que se encuentra en las librerías.

Ejemplo 11

Estos dos programas uno es el transmisor y el otro el receptor, lo puse a 1200 baudios porque me

funciono correctamente le aumentaba los baudios y no lo captaba muy bien el receptor. El transmisor es

TWS434 y el recepyor es el RWS434 los dos trabajan a 434 MHz.

Cuando el switch que se encuentra en el PIN_A0 sea presionado aviará por el PIN_B4 una 'S' 10 veces

con un retardo cada uno de 10 ms mientras el receptor esperara hasta que capte la 'S' y prendera un led

en el PIN_B1

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;TX_RF //DATE:21/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=1200,xmit=PIN_B4) void main(void){ int i; set_tris_b(0x00); setup_comparator(NC_NC_NC_NC); do{ if(input(PIN_A0)){ for(i=0;i<=10;i++){ printf("S"); delay_ms(10); }

delay_ms(500); } }while(TRUE); }

Ejemplo 12

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;RX_RF //DATE:21/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include <STRING.H> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=1200,rcv=PIN_B0) void main(void){ char x; set_tris_b(0x01); setup_comparator(NC_NC_NC_NC); do{ output_low(PIN_B1); do{ x=getch(); }while(x!='S'); output_high(PIN_B1); delay_ms(2000); }while(TRUE); }

Ejemplo 13

Hola amigos tengo un problema con el pic16f628a mi caso al utilizar el RB4 como forma de parpadeo no

da ningún resultado el los otros RBX si, no utilizo comunicación, y los simulo en proteus 7.4 y código CCS

C. Bueno les dejo 2 códigos y ningunos me han funcionado.. Espero sus ayudas....

Código:

#include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #byte TRISB=0x86 #byte PORTB=0x06 void main(void){ TRISB=0x00; PORTB=0x00; do{ output_high(PIN_B4); delay_ms(1000); output_low(PIN_B4); delay_ms(1000); }while(TRUE); }

Código:

#include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #byte port_b=6 void main() { int contador; set_tris_b(0); //// declaramos el puerto B como salidas port_b=0; while (true) { //// bucle infinito contador=200; //// retraso, 200 ciclos de 1000 microsegundos, o sea, 2 milisengundos while(--contador!=0) delay_us(1000); port_b=0xff; //// activa todos los pins del puerto B contador=200; while(--contador!=0) //// retraso, 200 ciclos de 1000 microsegundos, o sea, 2 milisengundos delay_us(1000); port_b=0x00;}; //// apaga todos los pins del puerto B

}

Ejemplo 14

Control de un servo y comunicación con la pc, este circuito lo que hace es esperar una señal de la

computadora, para poder girar 45 grados, 90 grados, 135 grados o 180 grados, al girar a cualquier

grados elegido esperara un cierto tiempo en esa posición al termino de 3 segundos! regresara a su

posición original o sea a 0 grados.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;SERVO SIMPLE //DATE:23/ABRIL/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #include <STRING.H> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=20000000) #use rs232(baud=2400,xmit=PIN_A1,rcv=PIN_A0) void config(void); void main(void){ long i,a; char POSICION; config();

INICIO: output_b(0x00); printf("POSICIONANDO EL MOTOR\r\n"); for(i=a;i>=500;i=i-10){ output_high(PIN_B0); delay_us(i); output_low(PIN_B0); delay_ms(10); } printf("\f"); printf("POSICION --> 0 GRADOS\r\n");

printf("ESCRIBA LA POSICION QUE QUIERE:\r\n"); printf("45 GRADOS -->(Q)\r\n"); printf("90 GRADOS -->(W)\r\n"); printf("135 GRADOS -->(E)\r\n"); printf("180 GRADOS -->(R)\r\n"); do{ POSICION=getch(); }while(POSICION!='Q' && POSICION!='W' && POSICION!='E' && POSICION!='R'); if (POSICION=='Q'){ a=1000; } else if (POSICION=='W'){ a=1500; } else if (POSICION=='E'){ a=2000; } else if (POSICION=='R'){ a=2500; } output_high(PIN_B0); delay_us(a); output_low(PIN_B0); delay_ms(5000); goto INICIO; } void config(void){ set_tris_a(0x21); set_tris_b(0x00); setup_comparator(NC_NC_NC_NC); }

Archivos Adjuntos

servo_121.7z (13,6 KB (Kilobytes), 345 visitas)

************************************************************************

http://www.forosdeelectronica.com/f24/compilador-hi-tech-pic18f26j50-problema-37399/

Ejemplo 15

Tal parece que no todo iba bien se me genero un pequeño problema; cuando compilo este pequeño

código que hice:

Código:

#include <htc.h> #include "delay.h" __CONFIG(WDTE=0); __CONFIG((FOSC0 && FOSC1)=01); __CONFIG(PWRTE=1); __CONFIG(CP=1); __CONFIG(MCLR_OFF); __CONFIG(XT=4000000); void main(void) { TRISB=0; TRISA=1; while(1)

{ if(PORTA==1) { PORTB=18; __delay_ms(5000); PORTB=0; __delay_ms(5000); } else PORTB=128; }

Me aparece un error como si el compilador esta mal instalado, cosa que no pasa cuando no trabajo con

retardos; hay algo que tenga mal configurado?? Gracias por su ayuda!!

Respuesta: Opiniones y ayuda (HI-TECH C)

Hola, te faltan abrir las llaves del else y cerrar las del main. Prueba acomodándolo y cuentanos.

A otra cosa prueba no protegiendo el código.

Respuesta: Opiniones y ayuda (HI-TECH C)

Gracias Vegetal Digital

Ya lo probé de nuevo... las llaves del else no lo pongo ya que el else solo esta manejando una línea de

código, y aun poniéndoselas tampoco... también cambie el modo de código protegido y tampoco... ¿algo

más para solucionar este problema del retardo?

Respuesta: Opiniones y ayuda (HI-TECH C)

Hola iDan soy nuevo en este foro pero se manejar ese compilador: El compilador de HI-TECH para PIC

es un puro ANSI C, supongo que instalaste el Hi-Tide junto con uno de los compiladores para PIC

http://www.htsoft.com/downloads/demos.php

Sobre los manuales; cuando instalas los compiladores para PIC también se agregan unos archivos en

PDF, te diriges a la carpeta adecuada, buscas "Quickstart guide", "User Manual" para te guíes; pero ten

en cuanta que el manual para los PIC16 y PIC18 tienen ciertas diferencias así que al momento de

programar usa el adecuado. Otros manuales como el C18 de microchip también sirve ya que es ANSI C

pero otro como el compilador PICC de CCS no te servirá de mucho ya que el C que usa no es el estándar

ANSI, por ende no es compatible con el Hi-tech.

En el Hi-Tide todo es en base a proyectos así que necesariamente al crear un programa debes hacerlo

desde "File" -> "New" -> "Project" de lo contrario no te va a compilar nada, el proyecto que creas debe

ser en base al Hi-Tech. En "Project" desactiva la opción "Build Automatically".

Luego para mayor facilidad de la configuración de los fuses, pines de I/O o módulos del PIC te

recomiendo usar el C-Wiz, lo encuentras en "Tools" -> "C-Wiz Editor".

__CONFIG(XT & WDTDIS & PWRTDIS & BOREN & LVPDIS & WRTEN & DEBUGDIS & DUNPROT &

UNPROTECT);

Ten en cuenta que el C-Wiz ayuda mucho pero en cosa de tiempos como los "delay" no sirve de nada

poner XT=4000000, ya que aparte de generar error el compilador no le interesa la velocidad del cristal

que vas a usar a menos que la librería que estés usando requiera de ese valor para calcular una

constante de tiempo como usan las librerías de los "delay" y para eso la declaración seria #define

_XTAL_FREQ 4000000 antes del #include "delay,h". Pero te aviso que el delay como librería no lo tiene el

hitech (revisar manual), entonces para eso hay que crear una librería y luego llamarla desde el programa

o le puedes dar uso a los ejemplos de esta web que también trae las librerías para los delay

http://www.microchipc.com/sourcecode/#delay16x

Por último para poder usar todas las librerías que dispone el hi-tech se debe incluir el Patch o ruta de

las librerías al proyecto para que pueden ser llamadas desde la línea de código con mayor facilidad ya

que un simple "#include" a sus librerías te va a dar dolores de cabeza; para eso te vas a "Project" ->

"Properties", luego en el árbol buscas "C/C++ Build" -> Seleccionas "Settings", es ahí en "Include Patch"

donde agregas la ruta de la librería(s). Con eso ya puedes usar el #include a las librerías respectivas.

Respuesta: Opiniones y ayuda (HI-TECH C)

Hola Carlos Alexis. Te agradezco mucho por tu respuesta

Con ella he aprendido a manejar un poco mejor el compilador ya que ni a palos me acostumbro, tengo

un pequeño problema ya que e bajado la librería de la pagina que me indicaste pero esta no la reconoce

y muestra un error al compilar, al utilizar la que esta en los ejemplos me funciona PERO solo con

microsegundos Us y no con milisegundos Ms; e realizado un pequeño programa:

Código:

#define _XTAL_FREQ 4000000 #include "init.h" // included by C-Wiz #include "delay.h" #include <htc.h> void main(void) { init(); // Function call inserted by C-Wiz TRISA=0; TRISB=0; while(1) { PORTA=0; PORTB=1; DelayUs(500000); PORTA=1; PORTB=0; DelayUs(500000); } }

Con lo que tu me has indicado y me funciona bien, pero al momento de ponerle un retardo mayor este no

lo reconoce y lo hace mas pequeño, y al hacer el programa solo para que la pata 1 del Puerto A se

apague y se encienda con retardo no lo hace bien y hace los retardos muy cortos... espero que me

puedas ayudar en este problemón que se me a armado al aprender sobre este compilador; otra cosa: yo

cuando programo en MikroC para manejar individualmente las patas del PIC pongo por

ejemplo: PORTB.F2=1; para que la pata 2 del Puerto B se encienda, ahora como hago eso en el

HI-TECH C para manejar individualmente las patas sin poner o escribir en todo el puerto

(PORTB=0b0000001)??

Gracias por tu ayuda y tu tiempo.

Hola iDan:

Te recuerdo que la mayor parte esta en los manuales que están en la carpeta del Hi-tech y del

compilador PIC correspondiente. Para el manejo de bit's debes de ver el archivo que corresponde al PIC

que está usando, que lo encuentras en "C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include"

para los PIC16F, te puse un ejemplo adjunto donde explico la manera.

Pero básicamente seria así: RB0 = 1; // A "1" el pin 0 del PORTB, tal y como dice en el archivo,

para eso debes revisarlo ya que ahí están todas las declaraciones. Igual revisa el ejemplo adjunto y me

avisas que tal te fue.

PD: En el ejemplo estoy usando la misma librería que bajé de la página, solamente le he cambiado el

nombre.

Archivos Adjuntos

HiTechDelay1.rar (987,4 KB (Kilobytes), 237 visitas)

HiTechDelay2.rar (1,08 MB (Megabytes), 93 visitas)

Tengo el mismo problema lo peor es q yo si soy novato el código que estoy usando es pequeñísimo y de

aprendizaje lo peor es que al profe le sale pero en mi compu no funciona. Cuando agrego el delay sin el

delay todo normal probaje con las librerías gracias

#include <htc.h>

#define _XTAL_FREQ 4000000

void main(void)

{

TRISB=0X00;// 1 representa Entrada y 0 representa salida

for(;;;)

{

PORTB^=1;

__delay_ms(1000);

}

}

*****************************************************************************

CONTINÚA DEL EJEMPLO 14…

Hola de nuevo estuve revisando mis códigos mi problema fue QUE dentro de los recursos de archivo *h

había

#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)

Fue la confusión y no por el programa y bueno otra duda fue ¿para k sirve? ¿Este código FUSES LVP en k

forma me sirve .....

Lo que yo sepa...por ahí entra la información para programar el pic.....pero pss yo tengo un programador

de pic's en usb y pss no necesito usar eso de LVP.

Este programa es muy simple lo hice en c#, es un control de 8 led's, en pocas palabras manipulas 1 byte

(8bit) y lo mandas al pic...

Archivos Adjuntos

control_8_led_756.7z (4,6 KB (Kilobytes), 269 visitas)

control_8_led_159.7z (11,8 KB (Kilobytes), 171 visitas)

control_de_8_led_333.7z (16,7 KB (Kilobytes), 193 visitas)

LVP: Low Voltage Programming

Sirve para programar el micro con bajo voltaje

[Me edito]

Para poner el pic en modo de programación en bajo voltaje se usa PGM, normalmente RB3, CREO que

se ponen 5 voltios. Por eso no es tan utilizado(si mientras corre el programa este pin se pone en el

estado correcto, entrara en modo programación)

Fuente: "Programming method used by ICD, compared to Low Voltage Programming, use of RB3"

Saludos

Este programa es hecho en C# y controla un servo, aquí les dejo el programa hecho en mplab para poder

recibir los datos del programa y así mismo controlar el servo.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTROL DE SERVO //DATE:26/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include<math.h> #fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=20000000) #use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1) void config(void){ set_tris_a(0x22); set_tris_b(0x00); setup_comparator(NC_NC_NC_NC); } void main(void){ int x; float y; long z; config(); output_b(0x00); do{ x=getch(); y=(x*6.666e-6)+0.9e-3; z=y*1000000; output_high(PIN_B0); delay_us(z); output_low(PIN_B0); delay_us(20000-z); }while(TRUE); }

Archivos Adjuntos

control_de_servo_104.7z (27,9 KB (Kilobytes), 284 visitas)

george.manson.69

En un par de semanas subiré la construcción de un robot controlado por la compu, y controlado vía

RF...paso a paso para los que les interese puedan hacer uno...COMING SOON

Bueno como había dicho antes vamos a empezar con el proyecto prometido, el robot controlado por la

lap, y via RF, bueno para empezar ahí les dejo la imagen como deber de ir el proyecto. Primero el

transmisor.

Como vemos usamos un USB/SERIAL para hacer la comunicación, pero otros pueden usar otro pic,

que tenga para manejo de USB. Pero bueno yo no he familiarizado aun con esos, por ahora con el

adaptador, sigue el max 232, y luego el pic16f628a, y el transmisor rws434.

El programa aun no lo voy a subir porque hay que explicar por detalle la construcción del circuito, y

luego del software.

Receptor Rx

Bueno ya vimos el transmisor ahora sigue el receptor, el receptor costa de un rws434 y un pic16f628a,

un LCD Y un driver H 1 amp y luego los motores. lo que trato de hacer es que al recibir una señal de la

computadora, el LCD visualice lo que esta haciendo el robot, por ejemplo mando una señal que de una

vuelta a la derecha, y el LCD me diga que esta dando vuelta ala derecha así sucesivamente.

Bueno para ponerlo mucho mejor el circuito, pongámosle un password que al recibir la contraseña pueda

activarse el robot y a si puedas controlarlo. Por ahora aquí esta el diagrama como va hacer el circuito.

(Nota; este robot solo podrá recibir señal hasta los 60 mts y de ahí ya no hará nada)

En el mensaje de más arriba el transmisor es tws, no rws. Capaz que este un poco ansioso

pero...con que vas a hacer los programas de la computadora, con visual basic? linda "pinta"

nueva.

Saludos

Si lo voy hacer en visual basic.... ya lo tengo pero le estoy agregando más cosas como, mas

COM porque las laptop empiezan desde COM4 y de ahí para delante. Y pss puede pasar que

alguien quiera usar una computadora de escritorio y tenga COM1 y 2 y pss tengo que adaptar

el programa que use esos puertos...y otras cosas le estoy agregando...pero por ahora voy a

explicar la circuitería...ya tengo todo hecho pinta bien todo el robot y se mueve donde yo lo

digo.

Proyecto: explicación del cable de USB/SERIAL Hola...vamos a empezar por partes a explicar cada parte del robot, lo que hemos visto en el

transmisor usamos un cable de usb/serial ya que las laptop ya no usan este tipo de

comunicación puro usb, habrá unas laptops que tengan este tipo de seriales, pero son

antiguas. Pero bueno el que yo compre fue en steren es una tienda de electrónica, lo conecte

primero y luego instale el driver que venia con el paquete, y listo...hay que ver que siempre

hay que usar el mismo puerto usb donde fue instalado porque si lo ponemos en otro puerto

usb deberíamos otra vez instalar el driver para que ese puerto este listo para colocarse el

adaptador.

Estos adaptadores funcionan cambiando el voltaje y elevándolo, por ejemplo el puerto usb

sale 5 volts y ponemos el adaptador cambiaria de 5 a solo 9 volt ya que no tiene suficiente

capacidad para elevarlo a 13, y con esas circunstancias no podemos usar estos tipo de

adaptadores para programar pic's porque es muy poco voltaje entregado. Pero para poder

comunicarnos es suficiente.

Proyecto: explicación max232 El más conocido entre los electrónicos el max232 para poder cambiar señales rs232 a ttl.

Este tipo de circuito es muy económico y utiliza solo 4 capacitores y listo para usar.

Este circuito se conecte a cualquier computadora que tenga un puerto serial, los puertos

serial como hemos visto varias explicaciones entregan +,-13volts y por su puesto lo queremos

conectar a un pic no jalara, y tenemos un riesgo a que pueda descomponerse. y por esta

causa usamos el max232 para cambiar esos 13 volts a 5 volts.

Proyecto: explicación del tws434 este pequeño dispositivo tiene un alcance de hasta 100mts a 9 volts, por lo que yo he

probado, existen decodificadores que te permiten enviar bits, por dar una ejemplo tenemos

1011 y eso te lo envía a una cierta velocidad que cuenta el decodificador(ht12e), pero

podemos usar pic directamente en este caso, ya que el pic es multiuso, los baudios requeridos

para que funcione correctamente, en mi caso sería baud=1200, así tenemos la seguridad que

se enviara los datos correctamente ya que estoy usando una pila de 9 volts. (Menos voltaje

seria menos baudios y más voltaje más baudios.)

Aquí dejo como debe de ir conectado el transmisor al pic..."IN" es donde debe de ir el TX del

pic.

Conexión del trasmisor completo Bueno aquí está todo lo que había dicho anteriormente, es el circuito de transmisor, muy

sencillo, podemos usar un pic12f675 pero me surgió unos problemitas, al querer cambiar los

baudios y los pines transmisión, entonces tuve que usar un pic mas grande en este caso el

pic16f628a, en el puerto b podemos usar unos led para indicar el lado donde nuestro robot

esta dando vuelta para que sea mas chido el circuito jeje. Ustedes dirán porque no conecte

directamente el transmisor al max, sin usar el pic, bueno pues hbaia dicho antes para que el

robot se activara tendremos que usar un password, y el programa que va contener el pic, es lo

que va hacer es compara el password con lo que hemos escrito, y enviar la información 10

veces por el transmisor (twr434), así cada cosa que queramos que haga el robot se enviara 10

veces por el transmisor. Más adelante explicare con detalle lo que quiero decir.

Estrategia a seguir para el programa del pic Bueno ya por ultimo para terminar con el transmisor nos guiaremos con la estrategia seguir

para el programa que va a contener el pic.

Proyecto: explicación del receptor rws434 Bueno ya terminamos el transmisor solo faltaría publicar los programas que son los mero

mero, pero eso será al último. Por ahora ya explicamos las partes de trasmisor se ve sencillo y

lo es , ahora como vimos como va ser el receptor que contenía un rws434, pic, driver H,

motores, y un lcd....vamos a explicar la conexión de rws434 primero que nada.

Este receptor es de 434Mhz tiene un alcance al intemperie 120 metros o indoor a 60 metros

aprox. se puede conectar directamente al pic. Se alimenta de solo 5 volts y su conexión es

muy simple. Los baudios requeridos son 4800 pero en este proyectos lo pondré a 1200 bps.

Proyecto: explicación del driver H Bueno este puede usarse un L293 ya que es muy popular para invertir los giros de los

motores DC, pero yo usare un que conseguí por internet es idéntico al L293 pero solo

cambiaria el nombre el que yo use fue el SN754410NE. La conexión es simple como vemos en

el esquema de abajo.

Proyecto: explicación motoreductores Bueno use los motoreductores son muy buenos porque tienen un gran torque, use en este

proyecto dos motoreductores de 4kg*cm. me salieron muy bueno pero ustedes pueden

comprar otro tipo de motores para esto no hay problema.

Circuito completo del receptor Bueno todo lo anterior se resume a esto. Este circuito es el receptor, donde va ser colocado

donde va el chasis de carrito, la antena puede medir 30 cm o 15 cm, no importa.

Organigrama del receptor Bueno sigue de mostrar el algoritmo que va contener el programa del pic del receptor.

Pronto subiré lo que resta...los programas en C para los pic, y Control del robots hecho en

C#... solo paciencia les pido jeje

George:

hola leí algo de la transmisión y me pareció muy interesante gracias por compartir. Te consulto si lo has

probado realmente y si hay que tener cuidado con las adaptaciones de impedancias de las antenas o no.

en la realidad tienen tan buen alcance y funcionamiento como lo promocionan según tus experiencias

gracias y te saludo muy atentamente. Hugo

george.manson.69 Fecha de Ingreso: mayo-2009

Mensajes: 252 HUGO3010 dijo:

george:

hola leí algo de la transmisión y me pareció muy interesante gracias por

compartir. Te consulto si lo has probado realmente y si hay que tener cuidado con

las adaptaciones de impedancias de las antenas o no. En la realidad tienen tan

buen alcance y funcionamiento como lo promocionan según tus experiencias

gracias y te saludo muy atentamente. Hugo

Hola Hugo. Mira no tuve problemas para nada, al hacer los dos circuitos (transmisor y receptor) ando

ahorita de vacaciones y deje mis trabajos en la casa, y por eso no he subido los programas que falta para

terminar el proyecto. Solo tengo Internet aquí, pero funciona muy bien, voy a subir imágenes y un video de

su funcionamiento..."ver para creer".

Saludos!

Programa control de un robot (control of a robot) Bueno aquí esta lo prometido...jeje...este pequeño programa está en forma de control.

Se dará un archivo para word, donde viene explicado el programa. y se dará el programa.

Archivos Adjuntos

explicacion_del_programa_481.doc (66,0 KB (Kilobytes), 338 visitas)

control_de_robot_movil_351.rar (8,1 KB (Kilobytes), 332 visitas)

Programas del proyecto para el pic

Aquí le dejo como debe ser el programa para cada pic, tanto como el transmisor y receptor. Puede

que me salir del tema que tenia que era programas hechos en ccs c. pero si se fijan bien los

programas anteriores fuera referencia para hacer estos y para saber también que podemos hacer

con estos...y pues logramos hacer un robot simple.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ

//TITLE;TRANSMISOR //DATE:28/JUNIO/'09

///////////////////////////////////////

//CONFIGURACION///////////////////

#include<16F628A.h>

#include <STRING.H> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000)

#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)

void config(void){

set_tris_a(0x22); set_tris_b(0x00);

setup_comparator(NC_NC_NC_NC);

}

void accion(void){

int x,y; do{

x=getch();

#use rs232(baud=1200,xmit=PIN_A2) switch(x){

case'U': for(y=0;y<=15;y++){

printf("U");

delay_ms(5);

} output_b(0x01);

break;

case'L':

for(y=0;y<=15;y++){ printf("L");

delay_ms(5); }

output_b(0x02);

break; case'R':

for(y=0;y<=15;y++){

printf("R");

delay_ms(5); }

output_b(0x04);

break;

case'D': for(y=0;y<=15;y++){

printf("D"); delay_ms(5);

}

output_b(0x08); break;

case'O':

for(y=0;y<=15;y++){ printf("O"); delay_ms(5);

}

output_b(0x00);

break; }

#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)

}while(x!='O');

}

void main(void){ char password[]="YES";

char word[];

int z;

config(); output_b(0x00);

do{

#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)

gets(word);

if(strcmp(word,password)){

output_b(0x0f); #use rs232(baud=1200,xmit=PIN_A2)

for(z=0;z<=30;z++){

printf("A"); delay_ms(5);

} #use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)

accion();

}

else{ output_b(0x00);

}

}while(TRUE);

}

Código:

///////////////////////////////////////

//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;RECEPTOR

//DATE:28/JUNIO/'09

///////////////////////////////////////

//CONFIGURACION/////////////////// #include<16F628A.h>

#include <STRING.H> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT

#use delay(clock=4000000) #define use_portb_lcd TRUE

#include<LCD.C>

#use rs232(baud=1200,rcv=PIN_A4)

#define EN1_2 PIN_A6 #define EN3_4 PIN_A7

#define A_1 PIN_A0

#define A_2 PIN_A1

#define A_3 PIN_A2

#define A_4 PIN_A3 int SALIR,c;

void config(void){ set_tris_a(0x30);

setup_comparator(NC_NC_NC_NC);

output_low(EN1_2);

output_low(EN3_4); output_low(A_1);

output_low(A_2);

output_low(A_3);

output_low(A_4);

} void main(void){ config();

lcd_init();

MAIN:

lcd_putc("\fPASSWORD");

output_low(EN1_2);

output_low(EN3_4);

do{ c=getch();

switch (c){

case 'A': lcd_putc("\fCORRECTO");

delay_ms(1000); SALIR=1;

break;

}

}while(SALIR!=1); SALIR=0;

lcd_putc("\fESPERANDO\n");

lcd_putc("A SER CONTROLADO");

output_high(EN1_2); output_high(EN3_4);

output_low(A_1); output_low(A_3);

do{

c=getch(); switch (c){

case 'O':

goto MAIN;

break; case 'U':

lcd_putc("\fADELANTE");

output_high(A_1);

output_low(A_2); output_high(A_4);

output_low(A_3); break;

case 'D':

lcd_putc("\fRETROCEDER"); output_low(A_1);

output_high(A_2);

output_low(A_4); output_high(A_3); break;

case 'L':

lcd_putc("\fIZQUIERDA");

output_low(A_1); output_high(A_2);

output_high(A_4); output_low(A_3);

break;

case 'R': output_high(A_1);

output_low(A_2);

output_low(A_4); output_high(A_3); lcd_putc("\fDERECHA");

break;

}

}while(TRUE); }

Fotos del proyecto Aquí les dejo las imágenes del proyecto. (Carpeta de Hi tech)

Videos del proyecto

YouTube - VÃ*deo0007

YouTube - VÃ*deo0006

YouTube - VÃ*deo0008

YouTube - VÃ*deo0010

Simple matriz de led. Bueno para otra vez empezar con los programas aquí les dejo una matriz de led 8x8 simple.

Código:

//------------------------------------- //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;MATRIX //DATE:20/JULIO/'09 //------------------------------------- //CONFIGURACION/////////////////// #include<16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #define DATA PIN_A0 #define CLK PIN_A1 #define RESET PIN_A2 void config(void){ set_tris_b(0x00); set_tris_a(0x20); setup_comparator(NC_NC_NC_NC); } void SEND_DATA0(void){ output_low(DATA); delay_us(2); output_low(CLK); delay_us(2); output_high(CLK); } void SEND_DATA1(void){ output_high(DATA); delay_us(2); output_low(CLK); delay_us(2); output_high(CLK); } void main(void){ int H[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b01000010,0b01000010};//"H" int O[]={0b00111100,0b01000010,0b01000010,0b01000010,0b01000010,0b01000010,0b01000010,0b00111100};//"O" int L[]={0b01111110,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000};//"L"

int A[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b00100100,0b00011000};//"A" int i; long j; config(); output_bit(RESET,1); // "ON" output_bit(CLK,0); output_bit(DATA,0); while(TRUE){ for(j=0;j<=25;j++){ for(i=0;i<=7;i++){ output_b(H[i]); //H delay_ms(5); SEND_DATA1(); } SEND_DATA0(); } for(j=0;j<=25;j++){ for(i=0;i<=7;i++){ output_b(O[i]); //O delay_ms(5); SEND_DATA1(); } SEND_DATA0(); } for(j=0;j<=25;j++){ for(i=0;i<=7;i++){ output_b(L[i]); //L delay_ms(5); SEND_DATA1(); } SEND_DATA0(); } for(j=0;j<=25;j++){ for(i=0;i<=7;i++){ output_b(A[i]); //A delay_ms(5); SEND_DATA1(); } SEND_DATA0(); } for(j=0;j<=25;j++){ for(i=0;i<=7;i++){ output_b(0X00); //" " delay_ms(5); SEND_DATA1(); } SEND_DATA0(); } } }

Conteo Bueno aquí les dejo un programa que te pide el valor a cada display, para empezar un conteo

desde el número elegido. Aquí se pone en prueba las interrupciones en este caso el timer0.

Por ejemplo si queremos un conteo de 60 segundos hay que poner en los display un 6 y un 0 y

presionar S y listo.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTADOR_RS232 //DATE:06/MAYO/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A3) #define ENABLE_1 PIN_A1 #define ENABLE_2 PIN_A0 int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000, 0b10011001,0b10010010,0b10000011,0b11111000,0b00000000,0b00011000}; int x,i,KEY; int N1; int N2; //CONFIGURACION///////////// void config(void){ set_tris_a(0x28); set_tris_b(0x00); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT); set_timer0(0); } //INTERRUPCION POR TIMER0

#INT_TIMER0 void MUESTRA(){ output_low(ENABLE_1); output_high(ENABLE_2); output_b(mostrar[N2]); delay_ms(5); output_low(ENABLE_2); output_b(mostrar[N1]); output_high(ENABLE_1); } //ELECCION DEL NUMERO NUMERO(){ loop: x=getch(); switch(x){ case 48: KEY=0; break; case 49: KEY=1; break; case 50: KEY=2; break; case 51: KEY=3; break; case 52: KEY=4; break; case 53: KEY=5; break; case 54: KEY=6; break; case 55: KEY=7; break;

case 56: KEY=8; break; case 57: KEY=9; break; default: printf("NO ES UN NUMERO, INTENTE OTRA VEZ \r\n"); goto loop; } return(KEY); } //INICIO DEL PROGRAMA PRINCIPAL///////////////////// void main(void){ disable_interrupts(INT_TIMER0); disable_interrupts(GLOBAL); config(); do{ printf(">>ESCRIBA EL 1er VALOR; \r\n"); N1=NUMERO(); output_b(mostrar[N1]); output_high(ENABLE_1); output_low(ENABLE_2); delay_ms(1000); output_low(ENABLE_1); printf(">>ESCRIBA EL 2do VALOR; \r\n"); N2=NUMERO(); output_b(mostrar[N2]); output_low(ENABLE_1); output_high(ENABLE_2); delay_ms(1000); output_low(ENABLE_2); printf("PARA EMPEZAR PRESIONE (S) \r\n"); do{ x=getch(); }while(x!='S'); printf("START...\r\n"); do{ enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); for(i=1;i<=45;i++){ delay_ms(10); } if(N1==0){ N2--; N1=9; }else{ N1--; } }while(N1!=0 || N2!=0); disable_interrupts(INT_TIMER0); disable_interrupts(GLOBAL); output_low(ENABLE_1); output_low(ENABLE_2); printf("HA TERMINADO EL CONTEO; \r\n"); delay_ms(1000); }while(TRUE); }

Reloj con LCD y Teclado con LCD Bueno aquí les dejo dos practicas, un programa es para poner el reloj en el lcd, y otro programa es para probar el teclado 4x4. Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;LCD TIEMPO //DATE:22/JULIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F887.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #include<LCD.C> //DEFINICIONES #define HORA PIN_A0 #define MINUTO PIN_A1 //VARIABLES int OVERFLOW,MINUTE,HOUR,SECOND; //CONFIGURACION void config(void){ set_tris_a(0x03); set_tris_d(0x00); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT); //overflow cada 16.384mS set_timer0(0); } //INTERRUPCION #INT_TIMER0 void TIMER0(void){ OVERFLOW++; if(OVERFLOW>61){ OVERFLOW=0; SECOND++; if(SECOND==60){ SECOND=0; MINUTE++; if(MINUTE==60){ MINUTE=0; HOUR++; if(HOUR==24){ HOUR=0; } } } } } void TIEMPO(void){ int i; for(i=0;i<=200;i++){ delay_ms(1); }

} //INICIO DEL PROGRAMA void main(void){ config(); lcd_init(); SECOND=0; MINUTE=0; HOUR=0; lcd_putc(" R E L O J"); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); while(TRUE){ if(input(MINUTO)){ MINUTE++; if(MINUTE==60){ MINUTE=0; } TIEMPO(); } if(input(HORA)){ HOUR++; if(HOUR==24){ HOUR=0; } TIEMPO(); } lcd_gotoxy(6,2); printf(lcd_putc,"%u:%u:%u ",HOUR,MINUTE,SECOND); } }

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;KEYBOARD Y LCD //DATE:23/JULIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F887.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=8000000) #use fast_io(b) #include<kbd_lib.c> #include<LCD.C> void config(void){ set_tris_b(0xF0); port_b_pullups(0xF0); setup_adc(NO_ANALOGS); setup_comparator(NC_NC_NC_NC); disable_interrupts(GLOBAL); } void main(void){ char KEY=0; int N=1; config(); kbd_init(); lcd_init();

while(TRUE){ lcd_putc("NUMERO"); do{ KEY=kbd_getc(); if(KEY!=0){ lcd_gotoxy(N,2); lcd_putc(KEY); N++; } }while(N<=17); lcd_putc("\f"); N=1; } }

Hola soy nuevo en esto de programar C y aun no entiendo la distinción entre #DEFINE y #BIT los dos hacen

lo mismo? como hago por ejemplo si quiero una parte de la ram para guardar algún dato yo en asm ponía

por ejemplo

ejemplo_1 equ 0x24

De este modo ejemplo_1 esta en la 0x24 de la ram

y que hace exactamente la instrucción int?

int es una declaración de una variable puede ser así:

unsigned int8 d; //esta es una variable del tipo sin signo y de una extensión de 8 bits, va desde 0 hasta

255

unsigned int 16 d; // la variable d tiene una extensión de 2 bytes y como es sin signo va desde 0 hasta

65536

signed int8 v;// la variable v es de 1 byte y como tiene signo va desde -127 a 128 (puede ser desde -

128 a 127 pero ahora no me acuerdo)

#bit sirve para darle nombre a un determinado puerto por ejemplo

#BIT LED = PORTB.0

#BIT SENSOR = PORTC.3

Con define se puede hacer esto pero también se puede darle un "nombre" a un conjunto de instrucciones:

#define M_D_AVANZA OUTPUT_HIGH(PIN_B6); OUTPUT_LOW(PIN_B7); //parte de un programa

mio para mi primer robot microcontrolado que todavía está en construcción, lo que hace pone en alto b6 y

en bajo b7 para que el motor gire (M_D_AVANZA = motor derecho avanza)

Para guardar un dato es lo de mas arriba con las variables

Espero te sirva

saludos

Vegetal_Digital

Que hace exactamente tu robot porque yo tengo uno hecho con un 16f84 y ahora lo voy a mejorar con un

16f877 pero el mío tiene bumpers nomas ya que no encuentro en ninguna casa de electrónica nadie que

venda esos sensores SHARP o los IS471F y no se como esquive por infrarrojo vos pudiste solucionar esto?

(esta argentina no vende nada )

Vegetal Digital

Mi robot es igual al tuyo, le puse dos contactos en el frente, pero se me quemo la parte de potencia de los

motores que la hice con un l293, tengo que esperar hasta el viernes que llegue, y el lunes empiezan de

nuevo las clases así que voy a estar con poco tiempo. Los sensores que decís no sé qué son, si quieres

experimentar con infrarrojos he leído que el CNY70 anda bien. Para mi ese es un paso que daré mas

adelante.

Que le quieres mejorar que tienes que usar un 16f877? Yo estoy usando el 16f84 por una cuestión de

espacio.

Decremento de tiempo Este simple programa lo que hace al introducir el tiempo (MM:SS) empezara a decrementar hasta llegar a cero. Esto pone a prueba el timer0,y timer1.

Código:

/////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTROL DE 4 DISPLAY //DATE:31/JULIO/2009 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses HS,NOWDT,NOLVP,NOMCLR,NOPROTECT #use delay(clock=20000000) //definiciones del cada display 1 al 4 #define EN1 PIN_A0 #define EN2 PIN_A1 #define EN3 PIN_A2 #define EN4 PIN_A3 #define PUSH PIN_A4

#define PUSH2 PIN_A5 //variable que contiene la decodificacion para mostrar cada numero en el display //de 7 segmentos int mostrar[]={0b01000000,0b01111001,0b00100100,0b00110000,0b00011001, 0b00010010,0b00000011,0b01111000,0b00000000,0b00011000}; //definicion de variables a usar signed int MEN1=0,MEN2=0,SEN3=0,SEN4=0; int i; long j; int OVERFLOW; //funcion: que establece los puertos como I/O establece el timer0 con 6.5536mS void config(void){ set_tris_a(0x30); set_tris_b(0x80); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_BIT);//overflow 6.5536mS setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);//overflow 13.1072mS set_timer0(0); } #INT_TIMER0 void TIMER0(void){ OVERFLOW++; if(OVERFLOW>152){ OVERFLOW=0; SEN4--; if(SEN4<0){ SEN4=9; SEN3--; if(SEN3<0){ SEN3=5; MEN2--; if(MEN2<0){ MEN2=9; MEN1--; if(MEN1<0){ MEN1=0; } } } } } } #INT_TIMER1 void TIMER1(void){ output_bit(EN1,0); output_bit(EN2,0); output_bit(EN3,0); output_b(mostrar[SEN4]); output_bit(EN4,1); delay_ms(6); output_bit(EN1,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[SEN3]); output_bit(EN3,1);

delay_ms(6); output_bit(EN1,0); output_bit(EN3,0); output_bit(EN4,0); output_b(mostrar[MEN2]); output_bit(EN2,1); delay_ms(6); output_bit(EN3,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[MEN1]); output_bit(EN1,1); } //RUTINA DE TEMPORIZACION ANTIREBOTE void TIEMPO(void){ for(i=1;i<=100;i++){ delay_ms(1); } } //rutina de temporizacion de vizualizacion void TIEMPO1(void){ for(j=1;j<=1000;j++){ delay_us(1); } } void main(void){ config(); MAIN: disable_interrupts(INT_TIMER0); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); //EN ESTA RUTINA INTRODUCES EL TIMEPO do{ if(~input(PUSH)){ TIEMPO(); SEN4++; if(SEN4>=10){ SEN4=0; SEN3++; if(SEN3>=6){ SEN3=0; MEN2++; if(MEN2>=10){ MEN2=0; MEN1++; if(MEN1>=6){ MEN1=0; } } } } } }while(input(PUSH2)); disable_interrupts(INT_TIMER1); enable_interrupts(INT_TIMER0); //EN ESAT RUTINA EMPIEZA A DECREMENTAR EL TIEMPO PUESTO ANTERIORMENTE

do{ output_bit(EN1,0); output_bit(EN2,0); output_bit(EN3,0); output_b(mostrar[SEN4]); output_bit(EN4,1); TIEMPO1(); output_bit(EN1,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[SEN3]); output_bit(EN3,1); TIEMPO1(); output_bit(EN1,0); output_bit(EN3,0); output_bit(EN4,0); output_b(mostrar[MEN2]); output_bit(EN2,1); TIEMPO1(); output_bit(EN3,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[MEN1]); output_bit(EN1,1); TIEMPO1(); }while(MEN1!=0 || MEN2!=0 || SEN3!=0 || SEN4!=0); disable_interrupts(GLOBAL); delay_ms(1000); goto MAIN; }

Temperatura en Matlab http://www.forosdeelectronica.com/f24/programas-hechos-mplab-20784/index4.html

Este programa fue hecho en Matlab para adquirir la temperatura de un sensor usando un

pic12f675. Primero que nada mostramos el programa que contiene el pic12f675

Código:

#include <12f675.h> #fuses XT,NOWDT,NOCPD,NOPROTECT,MCLR,NOPUT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A1) unsigned int READ,TEMP; int ENTER; void config(void){ set_tris_a(0x3B); setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); } void main(void){ config(); do{ ENTER=getc(); if(ENTER=='E'){ READ=read_adc(); TEMP=2*READ; printf("%d",TEMP); } }while(TRUE); }

Ahora vemos que usamos virtual serial port

Duda básica HI-TECH C con PIC 16F877A --> __delay_ms(x)

Estimados, quisiera ver si alguien me pudiese responder una duda. Realicé un programa, para aprender a

utilizar el pic, que realiza un "blinkeo" de dos leds alternadamente (RB1 y RB2). Leyendo manuales resultó

con el siguiente código:

#include <htc.h> __CONFIG(HS);

#define _XTAL_FREQ 20000000

void _delay_ms(unsigned long n);

void main(void)

{

TRISB=0;

while(1)

{

RB1=1;

RB2=0;

__delay_ms(25);

__delay_ms(25);

__delay_ms(25);

__delay_ms(25);

RB1=0;

RB2=1;

__delay_ms(25);

__delay_ms(25);

__delay_ms(25);

__delay_ms(25);

}

}

Por qué utilicé tanto delay? Porque al compilar me arrojaba un

warning [1355] "inline delay argument too large"

que provocaba un desconocimiento de la función __delay_ms(x).

Mi duda es por qué me aparece este error. Descubrí que el programa me resulta al colocar valores menores

a 40 para el delay. Espero sus consejos y recomendaciones (muy novato)

Gracias!!

#2 sbjcm 23/08/2010 Respuesta: Duda básica HI-TECH C con PIC 16F877A --> __delay_ms(x)

Esas son las limitaciones que tiene esa función delay. Acepta solo delays pequeños.

Mejor créate una función como la que estabas esbozando. Algo así.

void delay_ms(unsigned int t)

{

while(t--)

__delay_ms(1);

}

Esta te acepta delays de hasta 65536ms.

#3 andreyu 31/08/2010 Respuesta: Duda básica HI-TECH C con PIC 16F877A --> __delay_ms(x)

Gracias! Me aclara mucho tu respuesta.

Saludos!!