¿por que ciertos programas en ccs pic funcionan en 16f877a y no en 18f452?

hola a todos, debido a las varias malas experiencias que he tenido al momento de pasar un programa perfectamente funcional en pic16f877a a pic18f452 he decidido crear este post, primero que todo para saber si soy el unico que ha tenido esta clase de inconvenientes y si a alguien mas le ha pasado pues, compartir experiencias y/o posibles soluciones.

a modo de ejemplo cuando intento hacer una interrupcion externa en pic18f452 este no reconoce la interrupcion y cuando la reconoce se queda enclavado, si pruebo con 16f877a todo funciona perfectamente....

bueno espero que alguien ya le haya pasado algo parecido y que pueda ayudarme, ademas porque estoy haciendo un trabajo que tengo que entregar mañana lunes y se me acaba de quemar el unico pic16f877a que tengo y hoy no puedo conseguir otro, la unica esperanza es hacer funcionar el programa en el pic18f452 que me queda.....


muchas gracias
 
este es uno de los programas que al pasar a 18f452 no funciona, con la configuracion de los fuses correcta

Código:
#include <16f877a.h>
#device ADC=10
#fuses XT,NOWDT,NOPUT,NOLVP,NOWRT,NOPROTECT
#use delay(clock=4000000)
#include <lcd.c>

#use fast_io(B)
#byte portb = 6
#bit  rb7 = 6.7
#bit  rb0 = 6.0
#bit  intf = 0x0b.1

int count=0;
int x=0;
int1 i=0;
int16 adc,set;
float temp,tmax,tmin,tref,tprom;

#int_TIMER0
void TIMER0_isr()
{set_timer0(3400);
 set_adc_channel(0);
 delay_us(40);
 adc = read_adc();

 if(adc>20 && adc<144)
 {count++;
 temp =temp + (500.00*adc/1024.0);

if(count==6)
  {tprom =temp/6.00;
   temp=0;count=0;}
 }

}

#int_EXT
void EXT_isr()
{i=rb0;
while(!i)
{i=rb0;
 x++;
if(x==3){
x=0;
tref = tref+0.25;
if(tref>40)
  {tref=35;}}
lcd_gotoxy(1,1);
lcd_putc("Tref =  ");
lcd_gotoxy(1,2);
printf(lcd_putc," %4.2f%cC ",tref,223);
delay_ms(300);}
x=0;
delay_ms(400);
}


void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
set_timer0(3400);
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(ALL_ANALOG);
SET_ADC_CHANNEL(0);
delay_us(40);

enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);

lcd_init();
output_b(0);
lcd_putc("\f");

tref=37.5;
temp=0;
while(true)
{
tmax=tref+0.3;
tmin=tref-0.3;


if(tprom>tref)
  {output_low(PIN_C3);output_low(PIN_C2);}
if(tprom<=tmin)
  {output_high(PIN_C3);output_high(PIN_C2);}
if(tprom>=tmax)
  {output_low(PIN_C3);output_low(PIN_C2);}

lcd_gotoxy(1,1);
lcd_putc("Temp =  ");
lcd_gotoxy(1,2);
printf(lcd_putc," %4.2f%cC ",tprom,223);



delay_ms(300);
}
}


PD: no se porque esta vez no se fusionaron los mensajes
 
bueno ya solucione el problema gracias a Noturno que me ayudo en el foro todopic, y por si acaso a alguien tambien le habia sucedido lo mismo pues el error (por lo menos en mi caso) era pensar que el puerto B del 18f452 estaba en la misma direccion que en el 16f877 (0x06) y pues revisando el datasheet me di cuenta que esta es en la direccion 0xf81....saludos
 
Tene en cuenta que los pics 16F y 18F son distintos, no trabajan de la misma forma.
Primero que los registros estan ubicados en posiciones muy distintas que los 16F, y segundo, las interrupciones trabajan de otra forma, porque al contrario que en los 16F, estas tienen prioridad. Igualmente se puede anular esta funcionalidad y trabajar en un modo de compatibilidad con 16F.

Por lo que veo en tu programa, creo que usas el compilador de ccs. Fijate que trae funciones para manipular los puertos de IO, y no es necesario definir los puertos manualmente. Yo la verdad que no uso este compilador, por lo que no estoy seguro de esto, pero lo use una vez y en la documentacion aparecian estas funciones.

Te recomiendo que leas las hojas de datos de los pics... Muchas veces te dan la solucion al problema.
 
Atrás
Arriba