Autor Tema: Mi puerto D esta ABDUCIDO  (Leído 1124 veces)

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

Desconectado Protheus5

  • PIC10
  • *
  • Mensajes: 37
Mi puerto D esta ABDUCIDO
« en: 20 de Mayo de 2005, 09:49:00 »
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.
locoloco


 

anything