TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ggp0 en 28 de Mayo de 2009, 13:22:02
-
Hola a todos,
Antes de nada espero que la pregunta no os parezca una perogrullada muy grande, pero la verdad es que hace tiempo que no toco los pics y ademas me he cambiado al CCS por lo que ando un poco flojo...
El tema es que cuando intento configurar un puerto como entrada set_tris_b(0xFF); no funciona y si lo cambio a set_tris_b(0x00); funciona bien como entrada y como salida, por lo que me deja un poco extrañado y sin saber por que sucede esto???
Os muestro un pequeño programita de ejemplo donde sucede lo que comento.
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=1000000)
#use fast_io(b)
#use fast_io(c)
void main(void)
{
set_tris_b(0xFF); // Configuro el puerto B como entradas, si lo pongo así no funciona, si lo cambio a (0x00) funciona OK.
set_tris_c(0x00); // Configuro el puerto C como salidas
output_c(0xFF); // Pruebo a poner el puerto C a 1.
output_c(0x00); // Reseteo el puerto C.
while (1) { // Bucle de prueba
if (input(PIN_B0)==1) {
output_bit(pin_c0, 1);
}
}
}
Espero que alguien pueda aclararme el porque sucede esto.
Saludos a todos.
-
Compilando tu ejemplo, veo que lo hace correctamente :(
.................... set_tris_b(0xFF); // Configuro el puerto B como entradas, si lo pongo así no funciona, si lo cambio a (0x00) funciona OK.
000D: MOVLW FF
000E: MOVWF 06
.................... set_tris_c(0x00); // Configuro el puerto C como salidas
000F: MOVLW 00
0010: MOVWF 07
....................
No veo el problema!
-
y si pruebas mejor con input_state(pin_b0)
-
A mi también me compila bien, pero a la hora de simularlo no hace lo que debería.
Para compilar lo hago desde MpLab llamando al CCS y supongo que esta todo correcto porque compila bien. Para simular utilizo el simulador que trae por defecto el MpLab.
No se a que se debe pero la verdad es que la entrada con un tris como si fuese una salida funciona, lo cual aún me desconcierta más porque de ese modo si que no debería funcionar.
???
-
y si usas solamente:
if(input(pin_b0)){
...
}
haz armado el circuito? o solo a nivel simulación?
-
Compilando tu ejemplo, veo que lo hace correctamente :(
.................... set_tris_b(0xFF); // Configuro el puerto B como entradas, si lo pongo así no funciona, si lo cambio a (0x00) funciona OK.
000D: MOVLW FF
000E: MOVWF 06
.................... set_tris_c(0x00); // Configuro el puerto C como salidas
000F: MOVLW 00
0010: MOVWF 07
....................
No veo el problema!
¿Y el cambio de banco?¿No está o no lo has incluido?
-
y si usas solamente:
if(input(pin_b0)){
...
}
Es exactamente lo mismo.
¿Y el cambio de banco?¿No está o no lo has incluido?
No lo incluí, pero esta! :wink:
-
Si, he probado a poner unicamente... if(input(pin_b0)){... pero el resultado es el mismo. El circuito no lo he montado tan solo estoy haciendo pruebas con el simulador del MpLab.
Respecto a lo del cambio de banco, diría que no hace falta hacerlo, entiendo que de eso ya se encarga la función set_tris_x(), pienso que esto no es como en ensamblador, al menos yo no he leido nada al respecto.
Voy a ver si el compilador de CCS trae alguna herramienta que me permita simular al igual que MpLab, porque me da que el problema va a ir por la unión de MpLab con el compilador de CCS, en cuanto tenga algo claro os voy comentando.
-
Por ahí conviene usar los pines RB1 y RB2 para hacer las pruebas, porque no tienen asociado ningun modulo a diferencia del resto y no está configurando ninguno(modulo) al iniciar el programa.
-
Probado en Proteus y funciona correctamente! Así que el problema viene de la simulación de MPlab.
-
Suky, si lo pruebas con MpLab te ocurre lo que a mi?, en caso negativo la solución está clara, actualizar MpLab.
-
Nunca simule código C en Mplab :?
-
Si estas asignando bien la entrada con el MPLAB?
-
He estado buscando la forma de simular con CCS pero creo que no se puede, este te remite al simulador de MpLab, asi que me parece que tengo un problema porque nunca he trabajado con Proteus y visto lo visto en el MpLab Sim hay algo que no le estoy haciendo bien y no me funciona como debería.
Si alguien se le ocurre algo mas para probar??
-
me late que debes reinstalar el mplab o actualizar de versión
el ccs no tiene opción de hacer simulaciones, para ello existe el proteus, pic simulator IDE, etc.
-
Hola.
Para asignar las entradas desde el MPLAB se hace desde el stimulus:
(http://img12.imageshack.us/img12/7498/watcha.png)
Para debugear desde el MPLAB debes usar el MPLAB SIM
-
Las últimas cosas que he probado son las siguientes:
He actualizado el MpLab a su última versión v8.3 y se comporta de la misma manera que la versión que tenía instalada.
Normalmente cuando he querido probar a introducir un valor por un puerto lo he hecho desde la ventana watch, seleccionaba el registro deseado (PORTB) e introducía el valor que quería en el mismo, si estaba configurado como entrada el valor se podía introducir y si era una salida no te dejaba meter nada. En esta ocasión todo ha sido igual pero para poder introducir los datos lo tenía que configurar como salida¿?.
Normalmente no uso el stimulus de MpLab puesto que es más facil con el watch, pero siguiendo las indicaciones de MLO__ he empleado el stimulus para salir de dudas y aqui si funciona como debe.
Esto me despeja una duda pero me genera otra, ¿Por qué hasta ahora no he tenido ese problema y siempre ha ido todo bien?, me da la impresión que watch no trabaja sobre el pin del puerto sino que lo hace sobre su registro ¿puede que las entradas físicas unicamente se deban actuar desde stimulus?
Saludos
-
Hola.
El watch es solo para ver los registros, el stimulus es justamente para generara los estimulos sobre los pines. Que bueno que te halla servido y funcionado
Saludos
-
Muchas gracias a todos.
A pesar del tiempo, sigo sorprendiendome muy gratamente con esto de los foros.
-
Hola espero me puedan ayudar con este pequeño proyecto, la idea es que cuando detecte los bits del 7 segmentos como entrada del puerto b, a la salida de puerto c y puerto d (esto con el pic16f877a), para el caso 0 sea el rc0=1 para el caso 1 sea en rc1= 1 asi hasta llegar al numero C que seria para el numero 12, adjunto la programacion que estoy ejecutando, pues logro corroborar que si funciona desde numero 5 hasta el C o 12 pero la parte del 1 al 4 no me logra responder o que me falta en esta programacion de antemano muchas gracias.
# include <16F877A.H>
# use delay(clock=4000000)
# fuses XT,NOWDT
# byte puerto_b=7 //Dirección del puerto b
# byte puerto_C=8 //Dirección del puerto c
# byte puerto_d=8 //Dirección del puerto d
void main() {
set_tris_C(0x00); //Configuro la puerta c como salida y RA0, RA1, RA2, RA3 y RA4 como
set_tris_d(0x00); //Configuro la puerta d como salida y RA0, RA1, RA2, RA3 y RA4 como
set_tris_b(0x1F); //entradas aunque por defecto ya están configuradas como entradas
puerto_b=0; //inicializo todos los bits de la puerta B a cero
puerto_c=0; //inicializo todos los bits de la puerta B a cero
puerto_d=0; //inicializo todos los bits de la puerta B a cero
while(true) //bucle infinito
{
if (input(PIN_b0)==false && input(PIN_b1)==false&& input(PIN_b2)==false&& input(PIN_b3)==false&& input(PIN_b4)==false&& input(PIN_b5)==false&& input(PIN_b6)==false)
{
puerto_c=0b00000000; //configura los bits de la puerta B caso 0 ain valor nulo
puerto_d=0b00000000; //configura los bits de la puerta B caso 0 ain valor nulo
}
if (input(PIN_b0)==false && input(PIN_b1)==true&& input (PIN_b2)==true&& input(PIN_b3)==false&& input(PIN_b4)==false&& input(PIN_b5)==false&& input(PIN_b6)==false)
{
puerto_c=0b00000001; //para el caso 1
}
if (input(PIN_b0)==true && input(PIN_b1)==true&& input (PIN_b2)==false&& input(PIN_b3)==true&& input(PIN_b4)==true&& input(PIN_b5)==false&& input(PIN_b6)==true)
{
puerto_C=0b00000010; //para el caso 2
puerto_d=0b00000000; //para el caso 1
}
if (input(PIN_b0)==true && input(PIN_b1)==true&& input(PIN_b2)==true&& input(PIN_b3)==true&& input(PIN_b4)==false&& input(PIN_b5)==false&& input(PIN_b6)==true)
{
puerto_C=0b00000100; //para el caso 3
}
if (input(PIN_b0)==false && input(PIN_b1)==true&& input(PIN_b2)==true&& input(PIN_b3)==false&& input(PIN_b4)==false&& input(PIN_b5)==true&& input(PIN_b6)==true)
{
puerto_C=0b00001000; //para el caso 4
puerto_d=0b00000000; //para el caso 1
}
if (input(PIN_b0)==true && input(PIN_b1)==false && input(PIN_b2)==true && input(PIN_b3)==true && input(PIN_b4)==false && input(PIN_b5)==true && input(PIN_b6)==true)
{
puerto_d=0b00000001; //para el caso 5
}
if (input(PIN_b0)==true && input(PIN_b1)==false && input(PIN_b2)==true && input(PIN_b3)==true && input(PIN_b4)==true && input(PIN_b5)==true && input(PIN_b6)==true)
{
puerto_d=0b00000010; //para el caso 6
}
if (input(PIN_b0)==true && input(PIN_b1)==true && input(PIN_b2)==true && input(PIN_b3)==false && input(PIN_b4)==false && input(PIN_b5)==false && input(PIN_b6)==false)
{
puerto_d=0b00000100; //para el caso 7
}
if (input(PIN_b0)==true && input(PIN_b1)==true && input(PIN_b2)==true && input(PIN_b3)==true && input(PIN_b4)==true && input(PIN_b5)==true && input(PIN_b6)==true)
{
puerto_d=0b00001000; //para el caso 8
}
if (input(PIN_b0)==true && input(PIN_b1)==true && input(PIN_b2)==true && input(PIN_b3)==true && input(PIN_b4)==false && input(PIN_b5)==true && input(PIN_b6)==true)
{
puerto_d=0b00010000; //para el caso 9
}
if (input(PIN_b0)==true && input(PIN_b1)==true && input(PIN_b2)==true && input(PIN_b3)==true && input(PIN_b4)==true && input(PIN_b5)==true && input(PIN_b6)==false)
{
puerto_d=0b00100000; //para el caso 0
}
if (input(PIN_b0)==true && input(PIN_b1)==true && input(PIN_b2)==true && input(PIN_b3)==false && input(PIN_b4)==true && input(PIN_b5)==true && input(PIN_b6)==true)
{
puerto_d=0b01000000; //para el caso A
}
if (input(PIN_b0)==true && input(PIN_b1)==false && input(PIN_b2)==false && input(PIN_b3)==true && input(PIN_b4)==true && input(PIN_b5)==true && input(PIN_b6)==false)
{
puerto_d=0b10000000; //para el caso C
}
}
}
-
Disculpa, pero no entendi para nada tu explicacion.
si podes explicarte mejor que es lo que debe realizar el programa podria ayudarte
-
Buenas,
¿Por qué no en vez de comparar con tantas igualdades haces comparaciones con operadores lógicos?.
Ej (lo pongo en C standard, no sé como es en CCS):
if
(input(PIN_b0)==true && input(PIN_b1)==true&& input (PIN_b2)==false&& input(PIN_b3)==true&& input(PIN_b4)==true&& input(PIN_b5)==false&& input(PIN_b6)==true)
{
puerto_C=0b00000010; //para el caso 2
puerto_d=0b00000000; //para el caso 1
}
Es lo mismo que:
if( (puerto_B&0xFF) == 0b001011011){
puerto_C=0b00000010; //para el caso 2
puerto_d=0b00000000; //para el caso 1
}
Además si las comparaciones siguen una lógica podrás cambiar 0b001011011 por una variable que se modifique en un bucle for y si no la siguen las puedes meter en un array y recorrer el array con el bucle.
En resumen: con muchas menos líneas de código deberías se capaz de hacer lo mismo y se leerá mucho mejor lo que intentas hacer...
Otro consejo: pon paréntesis cuando programes. "==" tiene mayor preferencia que "&&", pero a no ser que te sepas la tabla entera de memoria terminarás equivocandote más pronto que tarde ya que hay cientos de situaciones posibles...
http://maxus.fis.usal.es/fichas_c.web/03xx_pags/0303.html
Saludos!
-
# byte puerto_b=7 //Dirección del puerto b
# byte puerto_C=8 //Dirección del puerto c
# byte puerto_d=8 //Dirección del puerto d
Tal vez tienes mal definidas las direcciones de los puertos para el 877.
(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_006_zps29vgisxs.jpg)
-
y tampoco necesita definirlas... que utilice output_x() para manejar los puertos