Hola gente, de nuevo me surge una duda a la hora de programar mi 18F452.
La cuestión es la siguiente;
voy a hacer un bus de datos bidireccional de 8 bits con el puerto B del PIC,para poder comunicarme con un contador LS7166 que me indicará una lectura de unos encoders.
Bien,para inicializar el contador debo mandarle unos datos por el puerto B (es decir, actuaría como puerto de salida), además mandar los 4 bits menos significativos del puerto D, para poder escribir en el contador palabras de inicialización.
Pero en un determinado momento, debo leer el valor del contador, y para ello ahora los 8 bits del puerto B actuarán como entradas, y cargaré su valor en una varible cualquiera.
La pregunta es cómo debo definir este puerto de entrada-salida. No se si tengo que escribir set_tirs_b cada vez que quiera cambiarlo de un modo a otro, o hay otras opciones posibles.
Por si os sirve de ayuda, os pongo el cogido.
Un saludo a todos.
*******
#include <18F452.h>
#use delay(clock=8000000)
#fuses NOWDT,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, NOPUT, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#byte puertob = 0xF81
#byte puertod = 0xF83
#use fast_io(B)
#use fast_io(D)
//#bit cs = puertod.0 //salidas del puerto d
//#bit cd = puertod.1
//#bit rd = puertod.2
//#bit wr = puertod.3
#define MASTER_RESET 0x20 /* 00100000 palabras de control del 7166 */
#define INPUT_SETUP 0x68 /* 01101000 */
#define CUAD_NO 0xC0 /* 11000000 */
#define CUAD_X1 0xC1 /* 11000001 */
#define CUAD_X2 0xC2 /* 11000010 */
#define CUAD_X4 0xC3 /* 11000011 */
#define ADDR_RESET 0x01 /* 00000001 */
#define LATCH_CONT 0x02 /* 00000010 */
#define RESET_CONT 0x04 /* 00000100 */
#define PRESET_CONT 0x08 /* 00001000 */
#define BINAR_CONT 0x80 /* 10000000 */
void init (void) //funcion que inicializa el contador
{
set_tris_b(0x00); //pueto b como salida. escribo en el bus
puertod=0x06;//00000110 permito la escritura
puertob=MASTER_RESET; //PORTB=0x20
delay_us(200);
puertod=0x06;
puertob=INPUT_SETUP;
delay_us(200);
puertod=0x06;
puertob=CUAD_X4;
delay_us(200);
puertod=0x06;
puertob=RESET_CONT;
delay_us(200);
}
void latch (void) //latcheo:paso del registro CNT al OL para poder leer
{
puertod=0x06;
puertob=LATCH_CONT;
delay_us(200);
}
void main()
{
puertob = 0x00;
set_tris_d(0x00); //el puertod es siempre salida no hay problemas
puertod=0x0F; //00001111 inicializ
delay_us(200);
init();
latch();
while (1){
puertod=0x06;
puertob=ADDR_RESET;
delay_us(300);
set_tris_b(0xFF); //ahora puerto b es como entrada.
printf("encoder=%i
",input_b()); //leo el valor del contador
set_tris_b(0x00); // puerto b ahora como salida
puertod=0x06;
puertob(RESET_CONT);
delay_us(300);
}
}