Hola gente, me acaba de surgir un hecho muy raroooo programando mi PIC 18F452, haber si lograis explicaroslo porque a mi me esta volviendo loco.
Lo que quiero hacer es usar 6 pines del puerto D del pic como salidas, para controlar cosillas.
Los 2 bits mas bajos son para seleccionar uno de los 4 canales posibles de un MUX, y los 4 restantes son se�ales corrientes. Al puerto D tengo conectados respectivamente 6 led para ver como cambian su estado.
Lo que hago es lo siguiente: si por ejemplo selecciono el canal 0 (sel0=0,sel1=0) pongo a uno una se�al determinada: si selecciono otro canal, pues obtengo otra.
el codigo de este simple ejemplo os lo pongo a continuacion:
///////////////////////////////////////////////////////
#include <18f452.h>
#device adc=10
#use delay(clock=8000000)
#fuses NOWDT,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, NOPUT, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#use fast_io(D)
#byte puertod=0xf83
#bit sel0 = puertod.0 //se�al menos signif del mux
#bit sel1 = puertod.1 //se�al mas signif
#bit cs = puertod.2
#bit cd = puertod.3
#bit rd = puertod.4
#bit wr = puertod.5
void sel (unsigned int canal) //funcion de seleccion de canal del mux
{
switch (canal) //canal puede ser de 0 a 3
{
case 0:
sel0=0;
sel1=0;
break;
case 1:
sel0=1;
sel1=0;
break;
case 2:
sel0=0;
sel1=1;
break;
case 3:
sel0=1;
sel1=1;
break;
}
}
void main ()
{
set_tris_d(0x00); //todo el puerto sera salida
#asm
clrf puertod //limpio el puerto
#endasm
delay_us(20);
delay_ms(2000);
while(1)
{
cs=1; //es como si fuese una se�al de Enable
delay_ms(2000);
sel(0);
cd=1;
delay_ms(2000);
sel(1);
rd=1;
delay_ms(2000);
sel(2);
wr=1;
delay_ms(2000);
sel(3);
wr=0;
delay_ms(2000);
puertod=0xff; //compruebo que todos se encienden bien
delay_ms(1000);
#asm
clrf puertod //apago todo el puerto
#endasm
delay_ms(1000);
}
}
Bien, ahora viene lo inexplicable: en el smulador del mplab, el mplab sim, el puertod hace bien las cosas y se actualiza correctamente.
Pero llega la hora de programarlo, lo programo con el PIC Start plus y lo monto en la placa, y no hace lo que quiero.
Por ejemplo, la se�al cs, que ha de estar siempre a uno hasta que llego al final del while, cambia a cero cuando llego a la instruccion sel(2) inexplicablemtne, cuando no tenia que hacerlo. No se por que su correspondiente led hace eso.
Otro caso, por ejemplo paso a la seleccion sel(2), y en vez de activarse el led de sel1 y desactivarse el de sel0, resulta que ambos se desactivan!! Porque no luce el led de sel1?? Sin embargo, cuando llego a la penultima instruccion y activo todos los led con puertod=0xff, todos lucen!!!
No se, no me lo explico.
COSA MUY SORPRENDENTE: Si cambio las se�ales de control sel0 y sel1 y en vez de ponerla en el puerto d las pongo en otro puerto, por ejmplo:
//las pongo en el puerto C
#byte puertoc=0xf82
#bit sel0 = puertoc.4
#bit sel1 = puertoc.5
Pues ahora todo va de maravilla!
Si me podeis hechar una mano os la agradezco enormemente, esto no se porque ocurre.
Un saludo a todos, gracias.