Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: yole en 07 de Julio de 2004, 13:05:00
Título: ayuda con entradas para pic 16F877
Publicado por: yole en 07 de Julio de 2004, 13:05:00
hola soy nuevo en esto de pics soy ingeniero mecanico y me meti a un curso de microprocesadores y me gusto mucho el uso del pic, he estado viendo diferentes cosas que postean en este foro y tengo que felicitarlos he aprendido mucho de ustedes, asi como de cada uno de los que postean sus dudas, y esto me lleva a mi a una duda que tengo.
quiero utilizar dos puertos como entrada, dependiendo del valor que tenga en el puerto sera la salida que es para controlar un motor, lo intente hacer el programa en C y me salio sin problemas al compilar en el ccs, pero al momento de hacerlo fisicamente con el pic no funciona y no hace nada, entonces me di a la tarea de checar paso a paso cada cosa del pic (la tarjeta que uso la desarrollaron en el curso usamos un pic 16F877), lo primero que hice fue checar las salidas de cada puerto asi como el PWM y si funcionan fisicamente.
despues al checar las entradas para que accienen alguna salida, no hace nada, es mas hace lo que quiere cuando le doy una entrada, no se que este pasando o en que estoy mal al programar, tengo que decirles que he aprendido a programar basandome en un manual que esta en este foro sobre CCS asi que talvez este mal en algo les pongo el programa sencillo que tengo y agradeceria que me ayudaran en que esta mal.
setup_adc( ADC_OFF ); setup_adc_ports( NO_ANALOGS ); set_tris_a(0xff); a como entrada set_tris_e(0x00); e como salida set_tris_b(0x01); b0 como entrada set_tris_d(0x00); d como salida set_tris_c(0x00); c como salida delay_ms(2000); setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ
Título: RE: ayuda con entradas para pic 16F877
Publicado por: narcosystem en 07 de Julio de 2004, 14:13:00
hola yole, prueba a poner en lugar de if(pin_B0==1), a poner
if(input(PIN_B0))
ademas antes de usar set_tris tienes que poner como vas a gestionar la entrada salida(estandar, fast ,fija) usando la directiva en este caso
#use fast_IO(a) //Nos permite configurar a nosotros los registros #use fast_IO(b) //TRIS de seleccion de entrada salida de los pines #use fast_IO(c) #use fast_IO(d) #use fast_IO(e)
espero haberte sido de ayuda
Título: RE: ayuda con entradas para pic 16F877
Publicado por: Modulay en 07 de Julio de 2004, 14:27:00
Como anota narcosystem,la comprobación que haces para ver el estado del pin RB0 no está bien.Lo que haces es comprobar si PIN_B0 tiene el valor 1 o no,siendo este PIN_B0 una constante,cuyo valor es 48 y que está definida en el fichero 16F877.h. Aún siendo así te debería entrar por la otra rama del if en todos los casos. Puedes probar a omitir la línea para reservar ROM,podrías estar pisando alguna línea de programa. Un saludo
Título: RE: ayuda con entradas para pic 16F877
Publicado por: Ginho_rj en 07 de Julio de 2004, 20:00:00
tente organizar mais seu codigo e coloque comentarios:
#byte porta = 0x05 #byte portb = 0x06 #byte portc = 0x07 #byte portd = 0x08 #byte porte = 0x09
#ORG 0X1F00,0X1FFF
void loader() {
}
void main() {
int dato;
setup_adc( ADC_OFF );
setup_adc_ports( NO_ANALOGS );
set_tris_a(0xff); //a como entrada set_tris_b(0x01); //b0 como entrada set_tris_c(0x00); //c como salida set_tris_d(0x00); //d como salida set_tris_e(0x00); //e como salida
// inicializa os ports // inicializa os ports porta=0x00; // limpa porta portb=0x00; // limpa portb portc=0x00; // limpa portc portd=0x00; // limpa portd porte=0x00; // limpa porte
//delay_ms(2000); //setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ
while ( TRUE ){
if (pin_b0)
{
portd=15; }
else {
portd=240;
}
} }
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 08 de Julio de 2004, 00:33:00
El error está en el if (PIN_B0 == 1), la solución que te dá narcosystem es la correcta y con ella te debiera de funcionar. Sin los fast también tiene que ir, si los pones ahorras código de programación en el caso de usar en tu programa funciones input o output.
Un saludo
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 08 de Julio de 2004, 00:45:00
muchas gracias, no crei que me contestaran tan rapido, gracias y una disculpa por no poder entrar antes ya que no servia el servidor de la universidad, estaba viendo lo que me ponen,
si yo no puse nunca el #use fast_io(x) por que en cuanto a las salidas si daban lo que queria?, es decir si queria variar el pwm si hacia el cambio en los pulsos asi como el estado del pin que queria ya fuera UNO o CERO.
ademas estaba viendo en otra parte del foro que si no pongo direccion de memoria a las variables que quiero usar el compilador me marca error de RAM, sucede lo mismo con los puertos ?, tengo que marcar la direccion que tienen dentro del banco de registros del PIC ? ejemplo:
entonces asi como defini cada una de las variables de mi programa tengo que definir los puertos, y porque tengo que definir primero el tipo de variable que voy a usar y despues definir el lugar que ocupa en el banco de registros ?
hasta mañana checo temprano el programa en una protoboard y veo que sucede si funciona, gracias y una vez que vea que funcionan las entradas subo el programa que hago para controlar dos motores empleando la entrada de dos CADs que vienen de un sonar y una torreta, de hecho se preguntaran porque no uso el CAD del PIC pero me parecio mejor usar para ahorrar tiempo maquina que la señal no fuera analogica sino que fuera digital desde un principio
gracias y saludos, en verdad nunca crei que el mundo de los micros fuera necesario, con esto me olvido de los PLCs y arriba el PIC
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 08 de Julio de 2004, 01:12:00
No, no es necesario asignar a las variables ni a los puertos direcciones de memoria con #byte xS = 0X20 , las asigna automáticamente el compilador, eso sí donde le dá la gana.
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 08 de Julio de 2004, 01:19:00
ok, gracias creia que era necesario todo eso, bueno, muchas gracias y al rato en unas horas pruebo todo lo que me ayudaron para hacer funcionar mi robot movil, gracias
saludos
Título: RE: ayuda con entradas para pic 16F877
Publicado por: Ginho_rj en 11 de Julio de 2004, 07:43:00
#byte porta = 0x05 #byte portb = 0x06 #byte portc = 0x07 #byte portd = 0x08 #byte porte = 0x09
#bit botao=portb.0
#ORG 0X1F00,0X1FFF
void loader() {
}
void main() {
int dato;
setup_adc( ADC_OFF );
setup_adc_ports( NO_ANALOGS );
set_tris_a(0xff); //a como entrada set_tris_b(0x01); //b0 como entrada set_tris_c(0x00); //c como salida set_tris_d(0x00); //d como salida set_tris_e(0x00); //e como salida
// inicializa os ports // inicializa os ports porta=0x00; // limpa porta portb=0x00; // limpa portb portc=0x00; // limpa portc portd=0x00; // limpa portd porte=0x00; // limpa porte
//delay_ms(2000); //setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ
while ( TRUE ){
if (botao)
{
portd=15; }
else {
portd=240;
}
} }
e quanto as variaveis não precisa declarar seu endereços,e vc precisa realmente de tantas?pra que serve elas???
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 11 de Julio de 2004, 13:28:00
No entiendo, podrías explicar tus preguntas de otra forma ?
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 17 de Julio de 2004, 03:37:00
hola que tal bueno creo que ya termine el programa del robot movil que estaba queriendo hacer, les dire de que se trata, es un robot que se mueve en un medio evitando obstaculos y controlando su velocidad para eso estoy empleando un control difuso en lugar de un PID, tengo un sonar para que me de la posicion y la direccion la obtengo de un potenciometro conectado a un juego de engranes que al generar una trayectoria me da por un convertidor analogico digital un valor, trate de hacer una especie de radar y aparte se comunica con el ambiente por medio de un radio de 4 canales, en base a esto creo que acabe el programa, pero me gustaria que lo vieran y me dijeran si tengo algo equivocado, de seguro veran que hay formas de simplificar el programa pero esto es porque no soy tan ducho en C pero me las arreglo, saludos y espero criticas y comentarios, gracias en verdad me ayuda mucho este foro.
no se si poner el programa como mensaje ya que es un poco largo, asi que mejor lo subi como archivo, subi el texto, saludos
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 17 de Julio de 2004, 03:40:00
que creen no subio el archivo asi que les pongo el programa aqui: saludos
output_bit(PIN_C0,1); //sentido de los motores output_bit(PIN_C3,1); //sentido de los motores
SET_PWM1_DUTY(PWM1); SET_PWM2_DUTY(PWM2); }
/*subrutinas para el control difuso*/
main( ){
set_tris_a(0x15); //bits a0 al a3 como in y a4,a5 como out /*a0 indica que hay detección de infrarrojo a1 indica que debe hacer un giro parcial a2 indica que se perdió la señal de IR y hacer paro total a4 indica inicio de búsqueda (Systems ON)*/ set_tris_c(0x00); //puerto C como salida para motores y reinicio del cad y pic aux set_tris_b(0xff); //puerto b como entrada para sonar set_tris_d(0xff); //puerto d como entrada para torreta delay_ms(2000); setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ setup_CCP1(CCP_PWM); setup_CCP2(CCP_PWM); //configuro ccp1 y ccp2 como pwm
output_bit(PIN_C4,1); //Reinicio del CAD de sonar output_bit(PIN_C5,1); //Inicio PIC auxiliar delay_ms(1000); output_bit(PIN_C4,0); output_bit(PIN_C5,0); //fin de envío de señales
output_bit(PIN_A4,1); //saco por canal 1 de TX para checar comunicacion
while (TRUE){ while (PIN_A0==0){
if (PIN_A1==1){ giro1(); } } /*Reviso si ya detectó IR, si no lo hizo reviso si quiere que de giro parcial, si ya detectó IR sale de ese ciclo e ingreso al ciclo de control, en el cual realizo la subrutina de persecusión siempre y cuando no exista señal de interrupción que indica perdida de la señal de infrarrojo y hago paro de motores*/
/*comunicacion por radiofrecuencia*/
while (PIN_A2==0){ /*mientras el otro carro no me mande por el canal 3 que no tiene*/
Persecusion(); } /*IR que haga todo el control, cuando no tenga señal de IR deja de hacer*/ stop(); /*el while y llama a stop y giro1 y regresa a inicio para*/ //ver si ya tiene de nuevo señal de IR }
}
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 17 de Julio de 2004, 05:30:00
¿Te funciona físicamente? veo que sigues poniendo estructuras como if (PIN_A1==1) ó while (PIN_A2==0).
No puedo comprender el programa, ya que no conozco la lógica difusa, aunque me gustaría.
Título: RE: ayuda con entradas para pic 16F877
Publicado por: Modulay en 17 de Julio de 2004, 05:48:00
Yole esas condiciones de control son incorrectas ya te lo dijimos más arriba.Si quieres comprobar si el pin RA1 está a uno,una manera de hacerlo es así:
Codigo: if(input(PIN_A1)) { código... }
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 20 de Julio de 2004, 02:58:00
perdon por no contestar antes pero tuve problemas con mi computadora y no tengo el programa a la mano, de hecho el programa que subi no me fije y tiene los errores que ustedes me han corregido, el otro programa tengo que ir al laboratorio por el antes de que se vayan de vacaciones, y me gustaria pedirle a alguien de favor que si me lo puede compilar y mandarme los diferentes archivos que se dan ya que no tengo compu durante estos dias y me gustaria probarlo fisicamente para ver en cuanto a los sensores si estan bien o que posibles errores puedan tener ya que todos los he hecho con mis conocimientos limitados en comparacion con un electronico, saludos y en unas horas subo el programa corregido
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 20 de Julio de 2004, 03:05:00
Yo te lo compilo.
¿Podrías explicarme lo de la lógica difusa en tu programa? Que conste que no tengo ni idea!
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 20 de Julio de 2004, 19:18:00
claro pocher, el programa corregido te lo mando por privado y la explicacion la pongo en el foro, si hay alguien que sepa mas de control difuso nos ayude o me corriga en el concepto que puedo manejar, te lo mando a tu cuenta como privado, saludos y gracias
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 21 de Julio de 2004, 12:41:00
Te lo he estado compilando y me tiraba este error:
Persecusion Seg 00004-007FF, 0491 left, need 1578 Seg 00800-00FFF, 0800 left, need 1578 Seg 01000-017FF, 0800 left, need 1578 Seg 01800-01EFF, 0700 left, need 1578 Seg 01F00-01FFF, 00FF left, need 1578 Seg 00000-00003, 0000 left, need 1578
main
Error[71] C:WINDOWSESCRIT~1YOLEYOLE.C 611 : Out of ROM, A segment or the program is too large
Lo intenté solucionar con #separate pero tampoco, a ver si alguién sabe como solucionarlo.
De todas formas, je, je, le puse un pic 18f452 y sin errores.
Me preguntabas algo sobre el pwm, no recuerdo que era, voy a ver si me lo miro.
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 21 de Julio de 2004, 13:00:00
La pregunta no era sobre el pwm, si no sobre los FUSES.
Sí es HS ya que usas una frecuencia mayor que 4MHz, pero deshabilita todos los demás fuses que no utilices, ya que creo recordar que si no se deshabilitaba el de LVP por software se activa al grabar ... no estoy seguro, pero tú por si acaso cargate todos los fuses.
Título: RE: ayuda con entradas para pic 16F877
Publicado por: pocher en 21 de Julio de 2004, 23:56:00
El programa al compilar para un PIC18 me dá que ocupa 6,5K, que cabrían en el 877 (el .hex tiene un tamaño de 36,1k).
Espérate unos días a ver si alguién nos dice como solucionarlo para que le entre al 877.
Si tienes gráficos y explicaciones de como has diseñado el programa usando lógica borrosa envíamelo por privado en un(os) archivo(s).
Un saludo
Título: RE: ayuda con entradas para pic 16F877
Publicado por: Nocturno en 22 de Julio de 2004, 05:07:00
También me gustaría ver esa explicación sobre la lógica difusa. He estado leyendo algo por ahí y me parece muy interesante.
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 03 de Agosto de 2004, 03:12:00
bueno pocher acabo de checar toda la electronica, tanto de la comunicacion como del sonar y torreta, todos los arregle de tal forma que estoy empleando la tarjeta de pacala (gracias pacala) asi que ya estoy listo para descargar el programa y ver que pasa
saludos
Título: RE: ayuda con entradas para pic 16F877
Publicado por: yole en 15 de Septiembre de 2004, 02:11:00
bueno antes que nada un saludo, estuve desconectado del foro por diferentes razones, una de ellas es que al tratar de conectar los dos carros tuve problemas en la comunicacion bidireccional por RF, esto debido a que nunca tome en cuenta la velocidad del PIC para transmitir y dado que en México no tenemos a la mano en las tiendas de electronica los transmisores y receptores que he visto en Europa pueden comprar del tipo UHF pues mis radios que elabore no funcionaron (que lastima para un Ing Mecanico tratando de hacer cosas de un Ing en Telecomunicaciones o electronico), me gustaria saber si tienen informacion sobre los radios regenerativos, selectivos y heterodinos, ya que antes de usar uno de estos me gustaria estudiar un poco de que se tratan,
Pocher gracias por el programa ensamblado, lo simule y funciona en Matlab, fisicamente entrega valores cercanos a los obtenidos en el matlab y a una velocidad rapida (principal problema de los radios).
Gracias y espero alguien me ayude con esa info y asi pueda resolver el problema, la comunicacion entre el pic y el radio la hago mediante un codificador MC145026 y decodificador MC145027, podria conectar el pic directamente a uno de estos transmisores y receptores ya que la transmision es serial del puerto Tx y Rx del pic pero no se si funcione mejor esto.