Autor Tema: Deteccion interrupciones en RB4:7  (Leído 4206 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Deteccion interrupciones en RB4:7
« 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 ....
« Última modificación: 07 de Enero de 2009, 14:37:37 por pajaro128 »

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Deteccion interrupciones en RB4:7
« Respuesta #1 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?...
« Última modificación: 07 de Enero de 2009, 01:06:13 por cerebro »
LAS MALVINAS SON ARGENTINAS!

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: Deteccion interrupciones en RB4:7
« Respuesta #2 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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Deteccion interrupciones en RB4:7
« Respuesta #3 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 y que funcionó perfectamente. Dale un repaso por si te sirve de algo.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: Deteccion interrupciones en RB4:7
« Respuesta #4 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


Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Deteccion interrupciones en RB4:7
« Respuesta #5 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
  1. #INT_RB
  2. void RB_isr(void){
  3.     output_low(PIN_C0);              //paro la cinta tramsportadora    
  4.     vhaypica1=1;                        //pongo en 1 la variable
  5. }

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"
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Deteccion interrupciones en RB4:7
« Respuesta #6 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Deteccion interrupciones en RB4:7
« Respuesta #7 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
.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Deteccion interrupciones en RB4:7
« Respuesta #8 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Deteccion interrupciones en RB4:7
« Respuesta #9 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í:

....................    output_b(input_b());
2C54:  MOVFF  F81,F8A

eso salió en mi list

saludos
.

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: Deteccion interrupciones en RB4:7
« Respuesta #10 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  ;


//INTERRUPCION RB0---------------------

#INT_EXT
void isr(void) {
         delay_ms(20);                                     //antirrebote 
       
         if(input(PIN_A3)==1) output_low(PIN_C0);          //paro la cinta
         if(input(PIN_A3)==1)vhaypica1=1;
         if(input(PIN_A3)==1) cant_pica++;
         }
  //  #INT_EXT
//void
//{
//if (!bit_test(PIN_A2)) {
  // output_bit( PIN_A2, 0);
   //Ddelay_ms(1000);
   //direccion=1;   
/// }
// }
                     
//------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

   
    ext_int_edge(L_TO_H);
    disable_interrupts(INT_EXT);
    disable_interrupts(GLOBAL);
   
//-----Inicializo el LCD y muestro el saludo inicial----------

   corrigo_salida();
   lcd_init();
   lcd_saludo_inicial();     
   inicio_proceso();
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);     
   busca_pica1();
   lleno_agua();     
   calor_agua();   
   lavando_pica1(); 
   buscapica2:
   busca_pica2();
   lavando_pica2();
   goto buscapica2;
}
 
//------------------------------------------------------------------------------
//FUNCIONES
//------------------------------------------------------------------------------
//----IMPRIME SALUDO INICIAL.-------------

void lcd_saludo_inicial(void) {
         
      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     
}

//----PONGO EN CERO PINES--------------

void corrigo_salida(void)
    {     
      output_low(PIN_C0);   
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
      output_low(PIN_B3);       
    }       

//-------BUSCA PICA1--------------------

void busca_pica1(void) {
long i ;
     
     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


Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: Deteccion interrupciones en RB4:7
« Respuesta #11 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}

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Deteccion interrupciones en RB4:7
« Respuesta #12 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).
.

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: Deteccion interrupciones en RB4:7
« Respuesta #13 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 ????

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Deteccion interrupciones en RB4:7
« Respuesta #14 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.