Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro128 en 06 de Enero de 2009, 23:56:06
Título: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 06 de Enero de 2009, 23:56:06
Hola...estoy haciendo mis primeros pasos con el CCS ..y quiero usar las interrupciones por ..rb4_rb7....da la casualidad ,,que en mi proyecto que es precisamente una lavadora de piezas ...hice mi programa .con un 16F877A y con un LCD 16x2 ....(que gracias a las librerias del CCS ,es facil de usar,,y por suerte lo hice bien)...mi problema son las interrupciones ..tengo cuatro sensores conectados a RB4;RB5;RB6;RB7.....los sensores son estos..
(1)DETECTA PIEZA 1 (2)NIVEL DE AGUA COMPLETO (3)TEMPERATURA AGUA (4)DETECTA PIEZA 2
interrupciones por INT_RB.... hay alguna libreria para usar estas interrupciones ???? no tengo idea de como encarar la rutina de interrupcion ..probe algunas ,que me funcionaron ( a medias)...la maquina funciona asi .... .. se inicia ,corre una banda tramsportadora y aqui tengo el primer sensor (1)DETECTA PIEZA 1 ...si no hay piezas ...va a una rutina que ya hice y anda ok ,en la cual por el LCD te dice ."NO HAY MAS PIEZAS ......PROCEZO TERMINADO........hasta aqui todo OK ....
Si detecto piezas ..se detiene la cinta ..carga agua en un recipiente ..y aqui tenemos el segundo sensor (2)NIVEL DE AGUA COMPLETO ...... deja de cargar agua y se conectan unas resistencias calefactoras, cuando la temperatura es la ideonea,, el tercer sensor (3) TEMPERATURA DE AGUA .... desconecta las resistencias y de hay en mas empieza el proceso de lavado.....con agua a presion,cepillos ,etc (4)DETECTA PIEZA 2 ..no se justifica que lo explique )....Y POR ULTIMO SI DESPUES DE UN TIEMPO NO DETECTO PIEZAS ..SE VA A LA RUTINA DE "PROCESO TERMINADO" ....desde ya muchas gracias y acepto cualquier ayuda ....
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: cerebro en 07 de Enero de 2009, 00:54:37
hola pajaro128 no existen librerias para las interrupciones (o por lo menos que yo conozca) y es logico debido a que cada uC tiene distintas interrupciones y no se puede generalizar para hacer una unica libreria, es mas cuando seleccionamos el micro en el ccs ya tenemos el codigo para gestionarlas y solo hay que llamarlas (en ccs lo que si existen son funciones para manejar las interrupciones). En tu problema me parece muy prudente que realices una jerarquia para las interrupciones (anidar las interrupciones), con esto quiero decir , si pasa tal cosa no puede pasar tal otra y pasa una cosa no debe seguir pasando la misma cosa (establescer importancia en los sucesos y sus llamadas). Codigo para llamar una interrupcion y como manejarlas hay en abundancia en el foro y ejemplos también. De tal manera te sugeriría que empieces a desarrollar tu código de la forma que mejor te paresca y si tienes algún problema, aquí estaremos para ayudar. Saludos :mrgreen:
edit1: perdon gente no me di cuenta que este post esta mal ubicado, si haci lo desean borro este comentario... pajaro128 tu pregunta debe ir en los subforos de lenguaje en c o en iniciacion es muy importante mantener el orden, pegate una vuelta por http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1
edit2: releyendo todo, ahora no me queda claro si quieres trabajarlo en ASM o en CCS?...
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 07 de Enero de 2009, 15:05:55
hola cerebro ...estoy programando en ccs(intentandolo .jajajaj)el micro es el 16f877a,y la verdad que las interrupciones q hice no anduvieron ...describi como es la maquina como para que ...me indiquen q instrucciones usar ...por ejemplo ...mi rutina de interrupcion era tan mala q una ves q entre en ella no sali y termine haciendo todo en la rutina de interrupcion ...( y por lo q lei la rutina de interrupcion tiene q ser lo mas corta posible)....pero no sabia como salir ...no sabia como leer en la rutina de interrupcion ,cual pin produzco la interrupcion y despues para salir de la rutina de interrupcion me tendria q llevar alguna variable (q produzco el pin q provoco la interrupcion)...al programa principal para seguir con la rutina principal ...vi ejemplos q todavia no logro asimilarlos..... si alguien del foro q tiene experiencia en ccs ...me podria decir q intrucciones me comvendria usar .y de que manera.... estudiaria esas instrucciones para sacar el mayor provecho de ellas ...pero por ahora no tengo nocion de como me conviene encarar tal rutina de interrupcion ... no pretendo q me hagan dicha rutina si no de que manera la tengo q hacer ....gracias P:D...perdon si me equivoque de foro ,,mi pregunta la puse aqui por estaban tratando las interrupciones en rb..q era lo q yo precisaba ......confirmame si deseas q lo cambie de lugar ""oooo""" y si prefieren que cree un tema nuevo ...... salu2
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: RedPic en 09 de Enero de 2009, 21:36:27
El único ejemplo que he hecho en toda mi vida utilizando la RB4:7 es la que utilicé en Midiendo un pulso. 3ª Parte. Tiempo en Alto con INTRB (http://www.todopic.com.ar/foros/index.php?topic=14528.0) y que funcionó perfectamente. Dale un repaso por si te sirve de algo.
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 13 de Enero de 2009, 15:49:24
hola ,,encare mi proyecto como pude y gracias a DIOS ...vengo mejorando peroooooooooo..aqui me trabe otra vez... tengo un pequeño problema ...con una interrupcion en RB4 ....
int isr() { output_low(PIN_C0); //paro la cinta tramsportadora vhaypica1=1; // pongo en 1 la variable return vhaypica1; //y retorna la variable global al programa, con el nuevo } //valor al Programa principal
despues le quite el return y quedo asi ::
void isr() { //modifique el int por void output_low(PIN_C0); //paro la cinta tramsportadora vhaypica1=1; // pongo en 1 la variable }
y tampoco anda sigue en el bucle.... estoy trabajando con pic16f877a y simulando todo en proteus ....cuando entra en la interrupcion q es sencilla ,,el valor de la variable queda actualizada ,pero se queda en un bucle infinito dentro de la interrupcion ,no sale de alli,,,MI PREGUNTA ES ...ES UN PROBLEMA DE PROGRAMACION O SIMPLEMENTE EL PROTEUS FALLA..desde ya muchas gracias ...salu2
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Marttyn en 13 de Enero de 2009, 17:44:08
No veo el resto del codigo, asi que no se si este sera el problema, pero me parece que estas escribiendo mal las interrupciones, yo lo haria asi:
Código: C
#INT_RB
void RB_isr(void){
output_low(PIN_C0);//paro la cinta tramsportadora
vhaypica1=1;//pongo en 1 la variable
}
Y por supuesto habilitar dicha interrupcion al comenzar el programa con "enable_interrupts(INT_RB);"
Salu2
PS: si quieres agregar codigo C con su formato puedes hacerlo con el desplegable que dice "GeSHi" y seleccionar "C"
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: jfh900 en 13 de Enero de 2009, 23:02:47
No se si se puede considerar un Bug del CCS, pero es preciso leer o escribir en el puerto "B" para que se actualicen los lanch y no se vuelva a producir la interrupción. Esto está en los datasheet de Microchip, pero hay que hacer a mano en CCS. Añade esta línea y todo solucionado:
#asm movf PORTB,0 #endasm
Un saludo
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Cryn en 13 de Enero de 2009, 23:10:06
o en el mismo lenguaje C yo usé (wena la rima no? :D):
output_b(input_b());
me parece que también viene bien
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: jfh900 en 13 de Enero de 2009, 23:12:29
Claro que sirve Cryn, pero menos instrucciones que el método que yo pongo no creo que las consigas.
Un saludo
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Cryn en 13 de Enero de 2009, 23:24:15
si mal no recuerdo lo que propuse también consume una línea de código, ela aquí:
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 03 de Febrero de 2009, 12:49:20
hola ..por cuestiones personales no pude contestar antes ...estudiando un poco el tema considere q seria mejor hacer una INT_EXT (por RB0)...ya q me da miedo q RB5,RB6,RB7,me entre ruido ....(no quiere entrar en la interrupcion)..todo esto simulado en PROTEUS ... les pego todo el codigo para q sea mas claro todo ...
//------Directivas para el compilador-------- #include <16f877a.h> //PIC utilizado #fuses XT,NOWDT,NOPROTECT,NOLVP //Configuramos los fuses #use delay (clock=4000000) //Oscilador a 4Mhz #use fast_io(A) //Optimizamos E/S del PORTA //#use standard_io(B)
#use fast_io(B) //Optimizamos E/S del PORTB #use fast_io(C) //Optimizamos E/S del PORTC #use fast_io(D) //Optimizamos E/S del PORTD #use fast_io(E) //Optimizamos E/S del PORTE #INCLUDE "lcd.c" //Incluyo LCD.C
//------Prototipos de funciones-----
void corrigo_salida(void); void lcd_saludo_inicial(void); void inicio_proceso(void); void busca_pica1(void); void nohay_pica1(void); int lleno_agua(void); int calor_agua(void); int lavando_pica1(void); void busca_pica2(void); int lavando_pica2(void);
//VARIABLES GLOBALES
int vhaypica1 ; //ESTAS VARIABLES VOY HACER Q SI HAY UN 0 ES POR Q NO SE CARGO EL int vhayagua ; //AGUA(CARGO EL AGUA Y PONGO UN 1 EN LA VARIABLE)Y ASI CADA VES Q PASA int vhaycalor ; //UNA PICA SI LA VARIABLE ESTA EN 1 NO CARGA PASA AL LAVADO(O SIMPLEMENTE int paso_pica1 ; //LO USO CON EL SENSOR 1 DE PICA Y VA A PASAR UNA SOLA VES Y DESPUES ME long cant_pica ;
//------Programa principal---------- void main(void) { //------Puertos y pines-------------
#byte PORTA=0x05 #byte PORTB=0x06 #byte PORTC=0x07 #byte PORTD=0x08 #byte PORTE=0x09 set_tris_A(0xFF); //PUERTO A como entrada. set_tris_B(0xFF); //PUERTO B como entrada. set_tris_C(0x90); //PUERTO C 0,1,2,3 como salida y 4,5,6,7 como entrada set_tris_D(0x108); //PUERTO D como salida set_tris_E(0xFF); //PUERTO E 3 como entrada y 0,1,2,4,5,6,7 como salida
lcd_gotoxy(4,1); Lcd_putc ("LAVAMATIC"); //Escribo en la primera fila lcd_gotoxy(3,2); //columna 4, fila 2 Lcd_putc( "VERSION 1.00"); //Escribo en la segunda fila delay_ms(2000); //Espero tres segundos } //-----INICIO PROCESO------------------
void inicio_proceso(void) {
Lcd_putc( "\f"); //Limpio pantalla salta: lcd_gotoxy(3,1); Lcd_putc ("PRESIONE EL"); //Escribo en la primera fila lcd_gotoxy(2,2); //columna 2, fila 2 Lcd_putc( "BOTON *INICIO*"); //Escribo en la segunda fila
if(!input(PIN_A0)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0 {goto salta; } Lcd_putc( "\f"); //Limpio pantalla }
Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(5,1); Lcd_putc ("BUSCANDO"); //o en la primera fila lcd_gotoxy(2,2); //columna 4, fila 2 Lcd_putc( "PICADORA 1"); //Escribo en la segunda fila enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); output_high(PIN_C0); //mueve cinta tramsportadora delay_ms(2500); //Espero tres segundos
for (i==0 ; i<1600 ; i++) //con el valor de i regulo el tiempo { //en que busco la pica delay_ms(50); IF(vhaypica1==1) //si hay vhaypica1=1 ,i=2536 y salgo { //del bucle for i=1600; } } IF(vhaypica1==0) nohay_pica1(); }
//-------BUSCA PICA2-------------------- void busca_pica2(void) { long i ;
Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(5,1); Lcd_putc ("BUSCANDO"); //o en la primera fila lcd_gotoxy(3,2); //columna 4, fila 2 cant_pica++; printf(lcd_putc, "PICADORA %lu",cant_pica); //Escribo en la segunda fila cant_pica--; enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); output_high(PIN_C0); //mueve cinta tramsportadora delay_ms(2500); //Espero tres segundos
for (i==0 ; i<80 ; i++) //con el valor de i regulo el tiempo { //en que busco la pica delay_ms(80); IF(vhaypica1==1) //si hay vhaypica1=1 ,i=2536 y salgo { //del bucle for i=80; } } IF(vhaypica1==0) nohay_pica1(); } //--------LLENO DE AGUA------------------
int lleno_agua(void) {
Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(4,1); Lcd_putc ("LLENANDO "); //Escribo en la primera fila lcd_gotoxy(4,2); //columna 4, fila 2 Lcd_putc( "DE AGUA"); //Escribo en la segunda fila delay_ms(1000); //Espero tres segundos salta2: output_high(PIN_C1); //conecto bomba agua
if(!input(PIN_A1)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0 {goto salta2; } output_low(PIN_C1); //apago bomba agua vhayagua =1 ; return vhayagua; }
//----------CALIENTO AGUA-------------------- int calor_agua(void) {
Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(3,1); Lcd_putc ("CALENTANDO "); //Escribo en la primera fila lcd_gotoxy(4,2); //columna 4, fila 2 Lcd_putc( "EL AGUA"); //Escribo en la segunda fila delay_ms(1000); //Espero tres segundos salta3: output_high(PIN_C2); //enciendo resistencias
if(!input(PIN_A2)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0 {goto salta3; } output_low(PIN_C2); //apago resistencias vhaycalor=1; return vhaycalor; }
//----------LAVANDO PICADORA 1----------------- int lavando_pica1(void){ long cant_pica1 ;
cant_pica1 = cant_pica ; disable_interrupts(GLOBAL); //deshabilito las interrupciones disable_interrupts(INT_EXT); //deshabilito las interrupciones Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(3,1); Lcd_putc ("LAVANDO "); //Escribo en la primera fila lcd_gotoxy(3,2); //columna 4, fila 2 printf(lcd_putc, "PICADORA %lu",cant_pica1); //Escribo en la segunda fila delay_ms(100); output_high(PIN_C3); //conecta leva, cepi y agua presion delay_ms(6000); //Espero seis segundos output_low(PIN_C3); //apago leva y cepillo vhaypica1=0; return paso_pica1; }
//----------LAVANDO PICADORA 2----------------- int lavando_pica2(void){ long cant_pica1 ;
cant_pica1 = cant_pica ; disable_interrupts(GLOBAL); //deshabilito las interrupciones disable_interrupts(INT_EXT); //deshabilito las interrupciones Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(3,1); Lcd_putc ("LAVANDO "); //Escribo en la primera fila lcd_gotoxy(4,2); //columna 4, fila 2 printf(lcd_putc, "PICADORA %lu",cant_pica1); //Escribo en la segunda fila delay_ms(100); output_high(PIN_C3); //conecta leva, cepi y agua presion delay_ms(6000); //Espero seis segundos output_low(PIN_C3); //apago leva y cepillo vhaypica1=0; return vhaypica1; }
//------NO HAY PICA1------------------- void nohay_pica1(void) { long cant_pica1 ;
cant_pica1 = cant_pica ; disable_interrupts(GLOBAL); //deshabilito las interrupciones disable_interrupts(INT_EXT); // disable_interrupts(INT_RTCC); output_low(PIN_C0); //apago la cinta repito: Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(3,1); Lcd_putc ("NO HAY JUEGO"); // la primera fila lcd_gotoxy(3,2); //columna 4, fila 2 Lcd_putc( "DE PICADORA"); //bo en la segunda fila delay_ms(1000); //Espero 10 segundos Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(5,1); Lcd_putc ("PROCESO"); //o en la primera fila lcd_gotoxy(4,2); //columna 4, fila 2 Lcd_putc( "TERMINADO"); //Escribo en la segunda fila delay_ms(1000); //Espero 10 segundos Lcd_putc( "\f"); //Limpio pantalla lcd_gotoxy(1,1); Lcd_putc ("TOTAL PICADORAS"); //Escribo en la primera fila lcd_gotoxy(2,2); //columna 4, fila 2 printf(lcd_putc, "LAVADAS %lu",cant_pica1); //Escribo en la segunda fila delay_ms(2000); goto repito; //repitoel mensaje
} otra duda q tengo es cual es la diferencia entre usar #use fast_io(B y #use standard_io(B) ...son dos librerias distintas q cumplen la misma funcion ??? PD:disculpen si los he mariado con mi codigo..soy nuevo en el tema ...acepto todo tipo de sugerencias ..para mejorar el codigo ..gracias
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 03 de Febrero de 2009, 13:01:14
tambien probe agregar la linea ... #asm movf PORTB,0 #endasm .... dentro de la interrupcion ... pero al compilador no le gusta ...me da el siguiente error ....Expression must evaluate to a constant PORTB.... sera el proteus ????o alguna falla del compilador ???.... :? :8}
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Cryn en 03 de Febrero de 2009, 14:07:17
puedes usar la instrucción que te deje, funciona igual que #asm movf portb,0 #endasm:
output_b(input_b());
Para el #asm asegurate que tienes definido el PORTB como byte con su direccion correspondiente, talvez por eso da error
sobre el fast_io: EL fast_io sirve para optimizar el código, porque cuando no está presente (o se ecribe standart_io) no es necesario que hagamos definición de TRIS, ya que el compilador lo hará automáticamente cada vez que maneje los puerto, esto quiere decir que habrá código redundante muchas veces. En cambio si colocamos fast_io le estamos diciendo al compilador que colocaremos los tris para ese puerto, y el compilador no colocará por ningún lado tris cuando se maneje el puerto. Lo que coloque de los TRIS lo colocará internamente en el .hex
No veo la necesidad de cambiar de interrupción por RB a int_ext solo por el ruido, ya que a ambas les puede afectar, para eso debes validar si realmente ha sido un pulso o fue ruido, eso se hace volviendo a preguntar después de un pequeño retardo si se ha mantenido el pulso, si no se mantuvo, es que fue algo rápido (fue ruido).
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 04 de Febrero de 2009, 23:14:44
gracias ,,por contestar tan rapido....el codigo en ASM ..no lo acepta el compilador
el codigo lo puse tal cual esta aqui
#asm movf PORTB,0 #endasm output_b(input_b());
por las dudas le agrege : al final y nada y despues le agrege ; al final y tampoco... no lo quiere ... :?
con respecto al fast_io....a ver si entendi bien ......significa q si lo declaro con el fas_io ya no se cambia mas ..lo q declare como entrada va hacer entrada para todo el programa ????
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Marttyn en 05 de Febrero de 2009, 05:18:38
como te dijo cryn, es posible que no te funcione el ASM porque no declaras lo que es "PORTB". deberias poner al principio del codigo lo siguiente para que el compilador entienda lo que es el portb:
#define PORTB 0x06
el fast_io hace que queden definidos los pines como entrada o salida cuando haces un set_tris_x(). a partir de ahi, el pin sera solo de entrada o solo de salida. a menos que hagas otro set_tris_x(). en cambio, con standard_io los tris los agrega el compilador siempre que cambies el estado de un pin. esto genera mas instrucciones de salida, pero a veces es mas practico. igualmente, la mayoria de las veces tus pines seran SOLO de entrada o de salida, pocas veces los usaras para las dos cosas
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: pajaro128 en 05 de Febrero de 2009, 09:46:55
el codigo esta pegado un par de mensajes arriba ,si no me equivoco esta bien declarado..... el #byte PORTB=0x06(revisenlo por las dudas)...esta en las primeras lineas del MAIN ...y en las lineas siguientes esta el set_tris_B(0xFF); //PUERTO B como entrada. honestamente no entiendo por q no entra la INT_EXT...y con respecto a las lineas en ASM ,que no las quiere aceptar ,no sera la version del compilador ???? :? :?
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Marttyn en 05 de Febrero de 2009, 10:08:13
el byte lo estas declarando dentro del main, y tu necesitas que tenga un caracter global, y no solo dentro del main. prueba declararlo despues del include(lcd). ademas, creo que para esto debe ser una constante (por eso el #define), y no un #byte. salu2
Título: Re: Deteccion interrupciones en RB4:7
Publicado por: Cryn en 05 de Febrero de 2009, 16:10:05
hola, tiene que ser un #byte pero si debe estar arriba en la cabecera debajo del include lcd viene bien
ni siquiera busqué en el main porque ahí yo nunca pongo ni defines ni bytes ni nada, jajaja solo instrucciones y variables