Autor Tema: Problema migración 16F877 a 16F887  (Leído 5403 veces)

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

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Problema migración 16F877 a 16F887
« en: 22 de Febrero de 2011, 17:48:52 »
Bueno, aqui estoy otra vez dando el coñacillo!

Resulta que acabo de descubrir que se ha dejado de fabricar el 16F877 y ya esta a la venta el 16F887 (o algo asi...) y se supone que son compatibles y demas...

Pues tengo entre manos un proyectito, que empece a hacer hace un tiempo, como buena mente puedo jeje,  y lo empecé con el 16f877, ya que este pic estaba de oferta donde lo compré. El pic murió, y ahora no lo encuentro, asi que tengo en camino unos 16F887, pero al migrar el programa en c, no me marcha bien :( (solo he cambiado el pic en el proteus; con el 146f877 me marchaba y con el 16f887 no)

He cambiado la libreria y los fuses, pero al simularlo, no me entra en INT_RB. Alguien que maneje el 16f887 me puede hechar una mano?

Gracias por adelantado

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema migración 16F877 a 16F887
« Respuesta #1 en: 22 de Febrero de 2011, 18:14:29 »
Hola, ten en cuenta que el puerto B no es exactamente igual en el 877 que en el 887. Este último, la interrupción por cambio de estado en los pines RB4:Rb7 se pueden activar independientemente. Además de que RB4 y RB5 son también entradas analógicas. Debes observar el datasheet y configurar correctamente los registros.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Problema migración 16F877 a 16F887
« Respuesta #2 en: 22 de Febrero de 2011, 20:06:57 »
Hola, ten en cuenta que el puerto B no es exactamente igual en el 877 que en el 887. Este último, la interrupción por cambio de estado en los pines RB4:Rb7 se pueden activar independientemente. Además de que RB4 y RB5 son también entradas analógicas. Debes observar el datasheet y configurar correctamente los registros.

solo un apunte, se puede habilitar  las interrupciones de cambio de flanco en todo el puerto desde el RB0 al RB7...  y para hacerselo mas facil.... el registro para asignar la interrupcion por cambio de pines del portb del 16f88X es el IOCB.... un saludo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Problema migración 16F877 a 16F887
« Respuesta #3 en: 03 de Marzo de 2011, 16:04:53 »
Buah, estoy perdidisimo....

Soy incapaz de hacer funcionar el programa del 877 en el 887.

Me he puesto a intentar hacer funcionar la int_rb desde 0, y he hecho un programita deprisa y corriendo, pero no me va... a ver si me podeis hechar una mano:
Código: [Seleccionar]
#include <16F887.h>
#device adc=8

#FUSES WDT                      //Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

#define LCD_ENABLE_PIN  PIN_D1                                   
#define LCD_RS_PIN      PIN_D2                                   
#define LCD_RW_PIN      PIN_D3
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                   
#define LCD_DATA7       PIN_D7
#include <lcd.c>

#byte PORTB=0x06

#int_RB
void  RB_isr(void)
{
      delay_ms(15);
   disable_interrupts(INT_RB);
   printf(lcd_putc"\f Interrupcion");
   enable_interrupts(INT_RB);
   #asm movf PORTB,0 #endasm
   clear_interrupt(INT_RB);
}



void main()
{

   set_tris_a(0),
   output_high(pin_a0);
   delay_ms(500);
   output_low(pin_a0);
   
   lcd_init();
   
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(INT_RB);
   #asm movf PORTB,0 #endasm  // con estas 2 lineas, se borra
   clear_interrupt(INT_RB);   // RBIF al inicio del programa
   enable_interrupts(GLOBAL);
   while(1)
   {
     
   }

}

He estado hechando un vistazo a la libreria del 16f887, y he visto que si que se pueden usar las interrupicones rb de cada patilla por separado (RB0, RB1...) pero tambien aparece igual que en el resto de pic, como RB, que es la que quiero usar, pero no me funciona.... :(

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema migración 16F877 a 16F887
« Respuesta #4 en: 03 de Marzo de 2011, 18:37:58 »
Debes también activar la interrupción de cada pin por separado, por ejemplo si usas Rb4,Rb5 y Rb6 debes agregar
...
enable_interrupts(INT_RB4);
enable_interrupts(INT_RB5);
enable_interrupts(INT_RB6);
...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema migración 16F877 a 16F887
« Respuesta #5 en: 03 de Marzo de 2011, 19:00:10 »
Hola Cortijero, tal vez si nos cuentas que es lo que quieres exactamente que haga tu programa al detectar una interrupción por cambio de estado en RB, podamos ayudarte un poco más.  Si la idea es hacer un programita simple como prender y apagar uno o dos LEDs con esta interrupción, te recomiendo inicialmente estudiar el ejemplo del CCS: EX_PBUTT.C

Saludos!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problema migración 16F877 a 16F887
« Respuesta #6 en: 04 de Marzo de 2011, 03:05:58 »
Debes también activar la interrupción de cada pin por separado, por ejemplo si usas Rb4,Rb5 y Rb6 debes agregar
...
enable_interrupts(INT_RB4);
enable_interrupts(INT_RB5);
enable_interrupts(INT_RB6);
...

Hazlo y te funcionará.

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Problema migración 16F877 a 16F887
« Respuesta #7 en: 04 de Marzo de 2011, 06:19:11 »
Entoces, para este pic (y cualquier otro en el cual se puedan habilitar las interrupciones por cambio de estado en el puerto RB, primero hay que habilitar la interrupcion digamos RB general, y dispues todas las RB's particulares??

Es decir...

enable_interrupts(int_RB);
enable_interrupts(int_Rx);

voy a porvar a ver que tal!

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Problema migración 16F877 a 16F887
« Respuesta #8 en: 04 de Marzo de 2011, 06:28:36 »
Ohh, perfecto! ahora funciona perfectamente! muchas gracias!

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Problema migración 16F877 a 16F887
« Respuesta #9 en: 04 de Marzo de 2011, 06:34:19 »
Bueno, por si alguien se ve en el mismo problema que yo, aqui un pequeño y basico codigo para entrar en la interrupción:
Código: [Seleccionar]
#include <16F887.h>
#device adc=8

#FUSES WDT                      //Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

#define LCD_ENABLE_PIN  PIN_D1                                   
#define LCD_RS_PIN      PIN_D2                                   
#define LCD_RW_PIN      PIN_D3
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                   
#define LCD_DATA7       PIN_D7
#include <lcd.c>

#byte PORTB=0x06

#int_RB
void  RB_isr(void)
{
      delay_ms(15);
   disable_interrupts(INT_RB);
   printf(lcd_putc"\f Interrupcion");
   delay_ms(5000);
   enable_interrupts(INT_RB);
   #asm movf PORTB,0 #endasm
   clear_interrupt(INT_RB);
}



void main()
{

   set_tris_a(0),
   output_high(pin_a0);
   delay_ms(500);
   output_low(pin_a0);
   
   lcd_init();
   
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(INT_RB);
   enable_interrupts(INT_RB4);
   enable_interrupts(int_rb5);
   enable_interrupts(int_rb6);
   enable_interrupts(int_rb7);
   #asm movf PORTB,0 #endasm  // con estas 2 lineas, se borra
   clear_interrupt(INT_RB);   // RBIF al inicio del programa
   enable_interrupts(GLOBAL);
   while(1)
   {
      printf(lcd_putc"\f");
   }

}





 

anything