Autor Tema: Migración Pic16f1503 a Pic12f675  (Leído 1542 veces)

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

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 12
Migración Pic16f1503 a Pic12f675
« en: 02 de Diciembre de 2021, 18:13:37 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #1 en: 02 de Diciembre de 2021, 18:27:10 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Cuando dices no me detecta en alto, te refieres a que no te detecta el cambio de 0 a 1 lógico la interrupción?

¿Qué pin es?

¿No necesitarás una resistencia de pull -up en el terminal con problemas?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #2 en: 02 de Diciembre de 2021, 18:35:24 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Creo que te falta configurar a GP2 como entrada digital, por defecto debe estar como analógico.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #3 en: 02 de Diciembre de 2021, 18:42:02 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Creo que te falta configurar a GP2 como entrada digital, por defecto debe estar como analógico.

Los registros involucrados son el CMCON y ANSEL. Con setup_adc_ports modificas ANSEL, pero no estoy seguro si también modificas CMCON con la misma instrucción.

¿Puedes simular y debuggar para ver que valores tienen esos registros?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 12
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #4 en: 03 de Diciembre de 2021, 09:08:52 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Cuando dices no me detecta en alto, te refieres a que no te detecta el cambio de 0 a 1 lógico la interrupción?

¿Qué pin es?

¿No necesitarás una resistencia de pull -up en el terminal con problemas?

Hola Dominus, gracias por tu respuesta, tendría que detectar el cambio de estado en los pines A2 y A3, o al menos en alguno de ellos, lo estoy simulando en Proteus con sus respectivas resistencias pull-up...

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #5 en: 03 de Diciembre de 2021, 09:11:53 »
Muy buenas tardes gente, le comento, tenía corriendo el código que coloco debajo en un 16f1503, el cual funciona perfecto.
La idea era migrar al 12f675 por su tamaño reducido, pero en este caso no me esta tomando las interrupciones o no se, no soy muy experto en la materia, la cuestión es que no identifica cuando un pin esta en alto...
Este es el código del 1503.
Código: [Seleccionar]
#include <16F1503.h>
#use delay(internal=16MHz)
#use FIXED_IO( C_outputs=PIN_C4,PIN_C3,PIN_C2,PIN_C1 )
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO

#Byte PORTA = 0x00C
#Byte PORTC = 0x00E

#Byte TRISA = 0x08C
#Byte TRISC = 0x08E

int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;

#INT_RA

void ext_isr(void){

   disable_interrupts(INT_RA);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33; 
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A1)==1) && (input(pin_A2)==0)){  // Por A1 y A2 ingresa un encoder que emite aproximadamente 200 impulsos por segundo.
         
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_C3);
            output_high(PIN_C4);
            delay_us(tiempo);
            output_high(PIN_C3);
            output_low(PIN_C4);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
 }

void main()
{
   delay_ms(4000);
   
   TRISA=0b111111;
   TRISC=0b000000;
 
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));
 
   clear_interrupt(INT_RA);
   enable_interrupts(INT_RA);
   enable_interrupts(GLOBAL);
   
   while(true) {
   output_bit(pin_c3,(input(pin_a2)));
   output_bit(pin_c4,(input(pin_a1)));

   enable_interrupts(INT_RA);

   }
}

Ahora bien, quise migrar este código al 12f675 y me parece que se complica por el ADC...

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10
#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A4 )
#fuses NOMCLR

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4 
#define GP5 PIN_A5


int16 sensor=0;
int16 porcentaje=0;
int16 tiempo=1000;


#INT_EXT
void EXT_isr(void)
{

   disable_interrupts(INT_EXT);
   
      delay_us(tiempo);

      if(input(pin_A0)==0){
         porcentaje=33;   
      } 
      else{
         if(input(pin_A5)==0){
            porcentaje=20;
         }
         else{
            porcentaje=0;
            sensor=0;
         }
      } 
 
      if((input(pin_A2)==1) && (input(pin_A3)==0)){
           
         sensor++ ;
   
         if (sensor == porcentaje){
           
            output_low(PIN_A4);
            output_high(PIN_A1);
            delay_us(tiempo);
            output_high(PIN_A4);
            output_low(PIN_A1);
            delay_us(tiempo);
             
            sensor = 0;
         }
      }
}

 
void main()
{
   delay_ms(1000);
   setup_adc_ports(NO_ANALOGS);
   
   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));
 
   clear_interrupt(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   output_bit(pin_A4,(input(pin_A2)));
   output_bit(pin_A1,(input(pin_A3)));

   enable_interrupts(INT_EXT);

   }

}

Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...

Desde ya muchas gracias por la opiniones...

Cuando dices no me detecta en alto, te refieres a que no te detecta el cambio de 0 a 1 lógico la interrupción?

¿Qué pin es?

¿No necesitarás una resistencia de pull -up en el terminal con problemas?

Hola Dominus, gracias por tu respuesta, tendría que detectar el cambio de estado en los pines A2 y A3, o al menos en alguno de ellos, lo estoy simulando en Proteus con sus respectivas resistencias pull-up...

Si puedes simular, pon un punto de ruptura antes que se ejecute While(true) y mira que valores tiene CMCON y ANSEL, de esa manera te sacarás de duda si está configurado correctamente GP2 como entrada digital. (ADC apagado y Comparador analógico apagado)
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 12
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #6 en: 03 de Diciembre de 2021, 09:14:07 »

[/quote]

Creo que te falta configurar a GP2 como entrada digital, por defecto debe estar como analógico.
[/quote]

Con #device ADC=10 no hago que todas las entradas y salidas sean digitales..??


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #7 en: 03 de Diciembre de 2021, 09:19:20 »


Creo que te falta configurar a GP2 como entrada digital, por defecto debe estar como analógico.
[/quote]

Con #device ADC=10 no hago que todas las entradas y salidas sean digitales..??
[/quote]

¿Con esa definición también apagas al comparador analógico?

No he trabajado con el PIC12, pero recuerdo que con los PIC16, los terminales que necesitaban ser digitales (entradas y salidas) tenías que apagar o deshabilitar el ADC y el comparador analógico, que son dos periféricos independientes.

Por eso digo que veas el contenido de esos dos registros. Al menos que estés seguro que esa definición y setup_adc_ports(NO_ANALOGS) realmente deshabiliten el comparador


« Última modificación: 03 de Diciembre de 2021, 09:21:50 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #8 en: 03 de Diciembre de 2021, 09:21:18 »
Por si acaso te sirve:

Código: C
  1. setup_comparator(NC_NC);  // Turn off comparators (apago los comparadores)

Lo encontré acá:


io settings in pic16f506

https://ccsinfo.com/forum/viewtopic.php?t=56260
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #9 en: 03 de Diciembre de 2021, 10:25:27 »
...
Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...
...

Yo copypego tu código, sin tocar nada lo compilo y lo ejecuto en Proteus -->  Ese if reconoce perfectamente a A2 y A3.

Por otro lado, si la frecuencia máxima de los pulsos del encoder es 200Hz, son  1.25ms entre flancos de fase A y B  --> No entiendo para qué metés retardos que suman 3ms dentro de la interrupción.

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 12
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #10 en: 03 de Diciembre de 2021, 10:57:10 »
...
Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...
...

Yo copypego tu código, sin tocar nada lo compilo y lo ejecuto en Proteus -->  Ese if reconoce perfectamente a A2 y A3.

Por otro lado, si la frecuencia máxima de los pulsos del encoder es 200Hz, son  1.25ms entre flancos de fase A y B  --> No entiendo para qué metés retardos que suman 3ms dentro de la interrupción.

Sabes que yo tampoco lo entiendo, al principio estaba sin retardos y en el simulador corría perfectamente, pero luego en la vida real no se detectaban algunas interrupciones, le puse el retardo y anduvo de 10, nunca entendí por que...

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #11 en: 03 de Diciembre de 2021, 11:19:37 »
...
Sabes que yo tampoco lo entiendo, al principio estaba sin retardos y en el simulador corría perfectamente, pero luego en la vida real no se detectaban algunas interrupciones, le puse el retardo y anduvo de 10, nunca entendí por que...
Si el flanco viene "ruidoso" con un retardo y posterior verificación (if((input(pin_A2)==1) && (input(pin_A3)==0)){) eliminás pulsos muy cortos (falsos).  Es un recurso fácil pero lejos de infalible, porque si la entrada viene ruidosa también va a fallar, aunque menos.

Un truco para ver si el origen del problema es soft o hard, es generar pulsos con el mismo PIC simulando el encoder e ingresarlos por GP2-GP3
« Última modificación: 03 de Diciembre de 2021, 11:22:13 por Eduardo2 »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Migración Pic16f1503 a Pic12f675
« Respuesta #12 en: 03 de Diciembre de 2021, 11:25:37 »
...
Por A2 y A3 ingresa un encoder que emite aproximadamente 200 impulsos por segundo, pero aca en el if "    if((input(pin_A2)==1) && (input(pin_A3)==0)){" no lo esta reconociendo...
...

Yo copypego tu código, sin tocar nada lo compilo y lo ejecuto en Proteus -->  Ese if reconoce perfectamente a A2 y A3.

Por otro lado, si la frecuencia máxima de los pulsos del encoder es 200Hz, son  1.25ms entre flancos de fase A y B  --> No entiendo para qué metés retardos que suman 3ms dentro de la interrupción.

Sabes que yo tampoco lo entiendo, al principio estaba sin retardos y en el simulador corría perfectamente, pero luego en la vida real no se detectaban algunas interrupciones, le puse el retardo y anduvo de 10, nunca entendí por que...

por eso es mejor debuggar con el hardware, ya que la simulación no puede predecir errores del mundo real, sin embargo en un pic con tan pocos terminales creo que sería difícil depurar todo lo que debe hacer.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32