Problema con entradas y salidas del PIC

Hola, agradeceré mucho la ayuda que puedan darme, no tengo mucha experiencia con esto de la programación de los PIC´s, la única forma en que se me ocurre programarlos es ir definiendo etapa por etapa lo que quiero que haga cada pin, actualmente estoy haciendo un sistema de semáforos con sensores mediante un PIC 18F2550, necesito definir dos pines para sensores y uno para un botón de interrupción, todo el programa es masomenos así:

(pequeña fracción del código)

void main(void){
int i;

set_tris_a(0b00000110);
set_tris_b(0b00000001);
set_tris_c(0b00000000);

while(1){

//Horizontal Derecho********
//9
output_a(0b00001110);
output_b(0b01001101);
output_c(0b11000100);
delay_ms( 600 );
//8
output_a(0b00000110);
output_b(0b01001101);
output_c(0b11000100);
delay_ms( 600 );

(pequeña fracción del código)

con lo primero según yo configuro los puertos A1, A2, y B0 de entrada y todos los de mas de salida, el problema es que al simular el circuito con ese código, me suelta 5V en esos pines, y pues cuando le meto datos me da corto circuito y no lee los datos de entrada...
no se que hacer

y si por ejemplo pongo este código:

(pequeña fracción del código)

void main(void){
int i;
set_tris_a(0b00000110);
set_tris_b(0b00000001);
set_tris_c(0b00000000);

while(1){

//Horizontal Derecho********
//9
output_a(0b00001000);
output_b(0b01001100);
output_c(0b11000100);
delay_ms( 600 );

(pequeña fracción del código)

es decir, si cambio los unos por ceros en esos pines, pues lo que hace es mandarme voltaje negativo y cuando le meto datos, si por ejemplo le doy un voltaje positivo da un corto (obviamente por juntar positivo y negativo) y lo sigue sin leer... :cry:

no se que ponerle en los lugares de esos bites para que simplemente no me mande nada y lea lo que se le pone

ya intente por ejemplo ponerlo en hexadecimal así:

set_tris_a(0x60);
set_tris_b(0xFF);
set_tris_c(0x00);

solo quiero configurar los pines A1, A2, y B0 de entrada y los demás de salida

El resultado es el mismo, otra manera de hacerlo que se me ocurre (y no lo he probado) es ir definiendo pin por pin lo que hay que hacer, de la siguiente forma:

output_high(pin_c3);
output_low(pin_a3);

y así sucesivamente.....

pero de esta manera el código quedaría exageradisímamente largo y complicado.....

Simplemente quiero que el PIC no me suelte nada en esos pines y que lea los datos que se le introducen, ¿Cual es el error que tengo?, ¿de que otra manera lo puedo hacer?

Por favor, espero que alguien pueda ayudarme a resolver este problema, se los agradeceré muchisimo.
 
cada vez ke haces un output_x(0xxxxxxxx)
pues como que tendras que volver a hacer un set tris de ese puerto pues todo se te habra automaticamente configurado como salida
 
Si configuras los pines A1,A2 y B0 como entrada luego no les puedes dar un valor como haces con:
output_a(0b00001000);
output_b(0b01001100);
output_c(0b11000100);

Ahí le estas diciendo que A1,A2 y B0 son cero, cuando no puedes elegirlo tu ya que son entradas no salidas.
Tendrás que usar output_high y output_low SOLO con los pines que son de salida.

Un saludo
 
Hola, muchas gracias por sus respuestas, intente hacer set tris después de cada output como sugirió Limako, pero no funciono, al fin tuve que configurar B0 B1 y B2 como entradas, definir los puertos A y C como salidas escribiendo:

output_a(0b00001000);
output_c(0b11000100);

Y manejar los pines del puerto B con output_high y output_low....

El código al final quedo largo, pero lo importante es que funciono :)

Gracias por sus respuestas ;)
 
hola, yo uso mikroC (no se si se pueda en CCS que creo es el que usas)y es mas facil que configures los registros directamente , p e

TRISB = 0bxxxxxxxx;
PORTB = 0bxxxxxxxx;
ya que asi el valor del SFR de los puertos E/S se mantienen como si lo hicieras en asm. saludos y solo es un pequeno tip.
 
Hola juankboy, lo que sucede con tu código (sería bueno ver el encabezado), es que efectivamente cuando usas las instrucciones:

Código:
set_tris_a(0b00000110);
set_tris_b(0b00000001);
set_tris_c(0b00000000);

estás configurando los bits de cada puerto como entradas o salidas. Pero cuando usas las instrucciones:

Código:
output_a(0b00001110);
output_b(0b01001101);
output_c(0b11000100);

nuevamente vuelves a configurar los bits de cada puerto como salidas. Esto aplica para el compilador CCS ya que creo que no estás utilizando las directivas:

Código:
#USE FAST_IO (a)
#USE FAST_IO (b)
#USE FAST_IO (c)

que en CCS y en conjunto con la instrucción set_tris_X() hacen que efectivamente cada bit del puerto sea de entrada o de salida. Ver y estudiar en el manual las directivas:

Código:
#USE FAST_IO (port)
#USE FIXED_IO (port_outputs=pin, pin?)
#USE STANDARD_IO (port)

Por defecto el compilador CCS C utiliza la directiva #USE STANDARD_IO (port), por lo que otra forma de hacerlo sería que, si en vez de usar la instrucción output_x() utilizas las istrucciones output_high() y output_low() directo a los bits que te interesan de cada puerto, no vas a tener problemas.

Saludos!
 
Atrás
Arriba