TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aripod en 08 de Junio de 2007, 17:04:34

Título: Manejo de bits con CCS
Publicado por: aripod en 08 de Junio de 2007, 17:04:34
Estoy aprendienod CCS (acostumbrado a CC5x) y me gustaria saber como hago por ejemplo para manejar el pin X del puerto Y bajo el nombre led1 por ejemplo?

Gracias x la ayuda!

EDIT: Modifike el tema para no crear uno nuevo, por eso hay respuestas que no tiene nada que ver..
Título: Re: Libreria lcd2.h, dudas
Publicado por: arquito en 08 de Junio de 2007, 19:16:31
Hola aripod;

yo tambien he usado esta libreria y aunque mis conocimientos en C son mas bien escasos, lo que yo entendi(ya que tuve tambien que cambiar el conexionado), es que le das al puerto A del pic el valor de 5 y al puerto B el valor de 6, con el #byte lcd_a y con el #bit xxxxxxxxx=5.x configuras cada bit del puerto, es decir, en esta libreria conectas
el E(enable) del lcd a 5.2(RA2), rw del LCD a 5.1(RA1) y RS del LCD a 5.0(RA0).... creo que es asi, de todas formas que me corrija alguien si estoy equivocado; del resto de cuestiones que planteas ni idea, espero te puedan ayudar.... un saludo y suerte.
Título: Re: Libreria lcd2.h, dudas
Publicado por: aripod en 08 de Junio de 2007, 21:18:28
Problema solucionado.....anduvo asi:

Código: [Seleccionar]
#include <16F84A.h>         //pic a utilizar   
#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz

#byte port_a=5
#bit  boton=5.0

#byte port_b=6
#bit  led=6.0

void main(void)
{
set_tris_a(0xF);
set_tris_b(0x00);
while(1)
{
if(boton==1)
led=1;
else
led=0;
}
}
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 10 de Junio de 2007, 14:12:28
Quise poner todo en el puerto B, o sea el pin B0 el boton y la salida (que la simulo con un led) en el B1:

Código: [Seleccionar]
#include <16F84A.h>         //pic a utilizar   
#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz

#byte port_b=6
#bit  boton=6.0
#bit  led=6.1

void main(void)
{
set_tris_b(0b10000000);

while(1)
{
if(boton==1)
led=1;
else
led=0;
}
}

Pero no anda...Que es lo que esta mal??
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 10 de Junio de 2007, 16:37:08
Debes de utilizar las instrucciones input() para leer un valor del puerto y output_bit() para poner una salida en un determinado estado. Mira la ayuda de CCS para estas dos funciones y estará resuelto tu problema.

Un saludo



Título: Re: Manejo de bits con CCS
Publicado por: aripod en 10 de Junio de 2007, 16:49:01
Mi idea no es usar funciones, sino variables...asi manejo las patas que necesite del pic con un nombre......como lo solia hacer con el otro compilador......
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 10 de Junio de 2007, 17:22:20
Desgraciadamente (creo no equivocarme), en este compilador hay que hacerlo así.

Un saludo.
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 10 de Junio de 2007, 20:13:20
Que hay con......
Código: [Seleccionar]
#byte port_a=5
#bit  boton=5.0



Ademas de eso, ahora tengo algo MUY insolito....

declaro: int bandera=1;
y me dice cuando compilo me dice en esa linea: A numeric expression must appear here  y en las demas lineas donde uso bandera: Undefined identifier   bandera.

Que es eso?????? Como que no esta definida?
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 11 de Junio de 2007, 02:12:22
Quise poner todo en el puerto B, o sea el pin B0 el boton y la salida (que la simulo con un led) en el B1:

Código: [Seleccionar]
#include <16F84A.h>         //pic a utilizar   
#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz

#byte port_b=6
#bit  boton=6.0
#bit  led=6.1

void main(void)
{
set_tris_b(0b10000000);

while(1)
{
if(boton==1)
led=1;
else
led=0;
}
}

Pero no anda...Que es lo que esta mal??
Has puesto el TRIS al revés, declarando como entrada el bit PORTB.7  en lugar del PORTB.0 que necesitas
Cámbialo por esto.
set_tris_b(0b00000001);

Debes de utilizar las instrucciones input() para leer un valor del puerto y output_bit() para poner una salida en un determinado estado. Mira la ayuda de CCS para estas dos funciones y estará resuelto tu problema.

Un saludo
No es imprescindible Jesús; la sintaxis de arquito también es válida (y a mí particularmente me gusta más).
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 11 de Junio de 2007, 04:19:28
Citar
Cita de: jfh900 en 10 Junio 2007, 21:37:08
Debes de utilizar las instrucciones input() para leer un valor del puerto y output_bit() para poner una salida en un determinado estado. Mira la ayuda de CCS para estas dos funciones y estará resuelto tu problema.

Un saludo

No es imprescindible Jesús; la sintaxis de arquito también es válida (y a mí particularmente me gusta más).

Es cierto Manolo, me fuí a cuando el compilador no permitia declarar los #bit y solo era posible hacerlo mediante las funciones.

Por cierto si lo queremos poner bonito podemos agregar:

Código: C
  1. #include <16F84A.h>         //pic a utilizar  
  2. #fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
  3. #use delay (clock=4000000)         //Fosc=4Mhz
  4.  
  5. #byte port_b=6
  6. #bit  boton=6.0
  7. #bit  led=6.1
  8. #define enciende 1
  9. #define apaga 0
  10.  
  11. void main(void)
  12. {
  13. set_tris_b(0b10000000);
  14.  
  15. while(1)
  16.         {
  17.         if(boton==1)
  18.                 led=enciende;
  19.         else
  20.                 led=apaga;
  21.         }
  22. }

Un saludo
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 11 de Junio de 2007, 08:54:19
Sigo luchando con esto de los bits....pareceria ser que cuando lo pongo en el mismo puerto a la entrada y salida no anda.....y cuando agrego un int NO compila, me dice que esa variable no fue decalrada


Segun lei en un post que hizo Nocturno se puede hacer:

Código: [Seleccionar]
#bit  led         = PORTB.RB2
#bit led_tris    = TRISB.RB2

y despues usarlo como:

Código: [Seleccionar]
led_tris=1;
led=1;
led=0;

Entonces hago esto:

Código: [Seleccionar]
#include <16F84A.h>         //pic a utilizar   
#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz

#bit led = PORTB.RB1
#bit led_tris = TRISB.RB1

void main(void)
{

led_tris=0;

led=1;
delay_ms(2000);
led=0;

}

Y me dice esto:
Código: [Seleccionar]
Clean: Deleting intermediary and output files.
Clean: Deleted file "Codigo.$$$".
Clean Warning: File "C:\Proyectos\Prueba de Bits\Codigo.o" doesn't exist.
Clean: Deleted file "Codigo.ERR".
Clean: Done.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "Codigo.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 51 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 6(2,5): A numeric expression must appear here
*** Error 48 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 6(15,23): Expecting a (
*** Error 48 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 6(17,22): Expecting a (
*** Error 48 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 8(1,4): Expecting a (
*** Error 12 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 11(1,9): Undefined identifier   led_tris
*** Error 12 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 13(1,4): Undefined identifier   led
*** Error 12 "C:\Proyectos\Prueba de Bits\Codigo.c" Line 15(1,4): Undefined identifier   led
      7 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Mon Jun 11 15:10:31 2007
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 13 de Junio de 2007, 12:17:32
Nadie sabe que es lo que estoy haciendo mal??
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 13 de Junio de 2007, 14:58:40
A ver, adjunta tu fichero .C e intentaré compilarlo.
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 13 de Junio de 2007, 15:50:39
Hola aripod te faltan declarar las directivas que estas empleando, mira tú programa modificado y compilado:

(http://img254.imageshack.us/img254/7079/mainbt3.jpg)

Un saludo
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 13 de Junio de 2007, 22:31:03
Este es el codigo....
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 14 de Junio de 2007, 00:12:03
Ya has visto lo que te faltaba en el código que ha pegado Jesús.

Aquí te dejo otra forma de hacerlo que también ha compilado perfectamente:
Código: C
  1. #include <16F84A.h>         //pic a utilizar
  2. #fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
  3. #use delay (clock=4000000)         //Fosc=4Mhz
  4.  
  5. #byte PORTB=6
  6. #byte TRISB=0x86
  7. #bit led=PORTB.1
  8. #bit led_tris=TRISB.1
  9.  
  10.  
  11. void main(void)
  12. {
  13.  
  14. set_tris_b(0);
  15.  
  16. led=1;
  17. delay_ms(2000);
  18. led=0;
  19.  
  20. }

(Jesús, el PORTB está en la 0x06 ;-) )
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 14 de Junio de 2007, 10:14:18
Nocturno, muchisimas gracias!
Porque haces:
#byte PORTB=6
#byte TRISB=0x86

Por que le asignas 6 al PORTB? De que depende el numero?
Y el TRISB?
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 14 de Junio de 2007, 11:26:22
Esos números son las direcciones de memoria de los registros PORTB y TRISB. Se supone que CCS ya las conoce si utilizas output_b() pero no en el formato que tú estás usando.
Esas direcciones de memoria son consultables en la datasheet.
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 14 de Junio de 2007, 12:07:02
Esas direcciones de memoria dependen entonces de cada pic?
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 14 de Junio de 2007, 12:27:27
Sí, aunque concretamente PORTB coincide en la misma dirección para casi todos.
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 14 de Junio de 2007, 13:20:29
Mi migracion al CCS ha sido excitosa. Codifique el programa y no hubo ni un error en la compilacio, el problema fue cuando lo emule en el proteus, no veo ni un uno ni un cero en las patas del pic. Adjunto el .HEX y el .DNS del proteus
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 16 de Junio de 2007, 20:42:36
¿¿¿???
Título: Re: Manejo de bits con CCS
Publicado por: Giovanny en 17 de Junio de 2007, 12:36:48
hola aripod, analize tu simulacion y el .c
con respecto a la simulacion me di cuenta que quieres simular un teclado con esos pulsadores, y hay te digo un par de cosas, el simulador tiene teclados de 3X4 o 4X4 entre sus componentes, no le colocaste pull_up_resistors, ni las definiste por soft (no se si ese pic tenga en el portB). Debes colocar un alto en el MCLR... si no, no trabaja.

Con respecto al soft, me di cuenta que el manejo de puertos no es adecuado..
te recomiendo mirar la ayuda del CCS.   


(entradas)

if(b3==1 && b4==0)
puedes escribirlo
if(input(PIN_B3)  && !input_PIN_B4)

(salidas)
A=0;   //puedes hacerlo de varias formas   //output_low(A);    //putput_low(PIN_A0); //output_bit(A,0);
X=x0;    ////output_bit(X,x0);      ////output_bit(PIN_A2,x0);


Revisa el soft, analiza la simulacion y encontrarás que debes cambiar y mejorar.
luego postea tus dudas.


PD, que version tienes del ccs y del proteus..... tengo una demo del proteus 7.1 , me ha gustado mucho!
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 17 de Junio de 2007, 14:04:40
Como hago para poner en output_bit(PIN_A2,x0); por ejemplo en vez de PIN_A2 ponerle el nombre A2 que le asigne arriba, que casualmente es A2 pero que podria haber sido otra cosa???

El tema del teclado, utilizo con pulsadores ya que al teclado lo voy a armar yo con pulsadores porke van en distintos lugares, entonces es mas facil si lo armo yo.
El tema de las resistencias no me queda muy claro, van en los pines que son entradas o los que son salidas? Para que estan?
Otra vez, muchas gracias.
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 19 de Junio de 2007, 14:29:53
Cuando uso la funcion output_bit(X,x0); sean cuales sean los parametros de la funcion siempre me da el siguiente error:

Código: [Seleccionar]
Expression must evaluate to a constant
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 19 de Junio de 2007, 14:51:41
output_bit(Pin,valor) solo se puede utilizar con los puertos (pines) y no se puede utilizar con variables. Con variables tienes que utilizar bit_set(), bit_clear() y bit_test().

Un saludo.
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 19 de Junio de 2007, 15:08:44
Perfecto, mas claro imposible. Tendre que resistirme a usar las variables je.
Como es el tema de las resistencias entonces? Si pongo en 1 un pin y tengo que ver si ese 1 llega a otro pin, va derecho o con alguna resistencia por ahi?
Título: Re: Manejo de bits con CCS
Publicado por: jfh900 en 19 de Junio de 2007, 16:45:49
Cuando utilizas un pin como salida, necesitas que este polarizado mediante una resistencia. Esta resistencia puede ser interna y se activan mediante programa o en caso de que no la tenga interna se puede poner externa. Si no se polariza el pin de salida (por cualquiera de estos dos procedimientos), el pin de salida solo podra dar un "0" o un estado de alta impedancia, que es un estado indefinido.

La unión de un pin de entrada con uno de salida (como en los teclados multiplexados) se realiza de forma directa, no hace falta poner ninguna resistencia de unión.

Un saludo 
Título: Re: Manejo de bits con CCS
Publicado por: Giovanny en 20 de Junio de 2007, 03:38:17

(salidas)
A=0;   //puedes hacerlo de varias formas   //output_low(A);    //putput_low(PIN_A0); //output_bit(A,0);
X=x0;    ////output_bit(X,x0);      ////output_bit(PIN_A2,x0);


saludos a todos , gracias por las correcciones
output_bit(X,x0);     // esto es válido si ya has asignado  X a un pin especial y además x0 es una variable tipo int1
espero no estar equivocado en esta afirmacion jeje.. cada día aprendemos un poco más..
hasta pronto
Título: Re: Manejo de bits con CCS
Publicado por: aripod en 21 de Junio de 2007, 20:30:49
Programa y problemas resueltos. Ya probe todo (armado) y anda sin problemas, tanto el teclado (sin resistencias como me dijeron) y las salidas.....
Muchisimas gracias a todos los que me ayudaron!!
Título: Re: Manejo de bits con CCS
Publicado por: Nocturno en 22 de Junio de 2007, 01:22:43
Enhorabuena