# Programa en CCS para el pic 16F877A



## jorkera (Jun 4, 2007)

hola a todos,
bueno mi consulta es la siguiente:
necesito un programa en CCS que realice la suiguiente secuencia:


01010101
10101010

En forma repetitiva;
la partida comienza al presionar boton 1
y la detensión al presionar boton2

aqui tengo algo trabajado
quiero ver si realmente funciona.
de ante mano muchas gracias.



```
/* Tarea Led´s Intermitentes*/

#include	   "C:\Archivos de programa\PICC\Devices\16F874A.h"	/*PIC a Utilizar*/
#use delay   (clock=10.000000)	/* Defino el Reloj*/
#byte           puerto_b=06 /* Direccion del puerto B*/



void	main(void)
               {
	set_trib_b(0x00);
	puerto_b=0;

	#if (!input(PIN_B0=0));
		goto Aca;
	#end if 

	#if (!input(PIN_B1=0));
		SLEEP();
                #end if
		
Aca		output_c	(aa);
		Delay		(500);
		output_c	(55);
		Delay		(500);
		goto 		Aca;
                 }
```


----------



## alejandro_oo (Jun 7, 2007)

Hola jorkera, la respuesta a tu pregunta es no, ese codigo tal y como lo tienes no funciona, si es tu tarea como dice ahi, entonces ya debieron darte siquiera una mínima capacitación para usar el CCS ¿o eres autodidacta?, tampoco dices que versión del CCS tienes, bueno la verdad el código que llevas te daría mas errores que nada. Imagino que ni siquiera lo has intentado compilar verdad??

La idea es muy sencilla, pero hasta para eso debes tener bien clara tu lógica. 

Primero para especificar el dispositivo a usar, no es necesario poner toda la ruta, basta con poner así: 


```
#include <16F877A.h>
```

Luego, tu cristal realmente es de 10 Mhz, si es asi esta bien, aunque lo mas usual para principiar es 4 Mhz.

Para configurar las entradas o salidas del puerto pones  set_trib_b(0x00); cuando debe ser set_tris_b(0x00); ademas con eso estarias diciendo que todas han de ser salidas, algo ilogico pues mas abajo das a entender que es en el puerto B donde tienes los pulsadores, de modo que al menos RB0 y RB1 deberian estar como entradas.


```
set_tris_b(0b00000011);
```

Ahora si te fijas en el nudo de tu codigo (aunque saltaramos los errores) lo que sucederia es que checaria las entrads una sola vez y de ahi quedaria todo muerto, a parte de eso si acaso se detectara el estado, entraria en un bucle infinito y nunca mas volveria a preguntar si se ha dado otra pulsacion que indique una accion diferente ¿me explico?.

Yo lo haria por medio de interrupciones del puerto B y el parpadeo (los leds) en el puerto C con un timer, para no tener ocupado el PIC y poder hacer otras cosas.

Pero como al final esto no es mas que un ejemplo practico lo mejor es que sea lo mas sencillo posible no?, no se, crear una variable para guardar ahi el estado y luego vigilar las entradas y dependiendo de eso pues se habilita o no los pulsos en el puerto C y asi. Mira no es que te vaya a hacer la tarea pero tuve unos minutitos libres y para pasar el rato hice este ejemplo de como yo lo haria:


```
/*
El proposito de este codigo es curioso                          
Entradas de los botones RB0 Y RB1 (igual podria ser uno y no dos) 
Salidas Puerto C, para encender unos leds, mucha pieza ¿no crees? 
*/

#include <16F877A.h>                         /* PIC16F877A */
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */                                            
#use delay (clock=10000000)                  /* Ajuste retardos */
#use fast_io(b)                              /* Opcional */
#use standard_io(c)                          /* Opcional */

/* En esta variable de tipo boleano guardaremos el estado ¿te parece? */
boolean habilitar=false;

void main(void)
{
   disable_interrupts(GLOBAL);      /* Deshabilitamos todas las interrupciones (opcional) */                                    
   set_tris_b(0b00000011);          /* RB0 y RB1 como entradas (para los botones) */   
   
/* Chequeo infinito */
   do
   {
      /* Mientras habilitar sea verdadero */
      while(habilitar)
      {         
         /* Salidas intermitentes, empieza el circo */
         output_c(0b01010101);
         delay_ms(500);       /* Retardo de 500 ms */
         output_c(0b10101010);
         delay_ms(500);       /* Retardo de 500 ms */
      
         /* Sin duda esto saldria mas bonito usando interrupcion */
         if(input(PIN_B1))
         {
            habilitar=false;  /* Obviamente se deshabilita */
            output_c(0x00);   /* Se apaga el circo */
         }
      }
      
      /* Habilitamos en caso de que la entrada RB0 sea verdadera */     
      if(input(PIN_B0))
      {
         habilitar=true;
      }
   }
   while(true); /* Todo de nuevo */
}
```

Es algo muy simple, como decia tiene el inconveniente de que las pulsaciones solo se detectan en ciertos momentos (no interrumpen), asi que deberia tenerse pulsado el boton de contraorden al menos por un segundo.

Espero que te sirva el ejemplo y aprendas, no simple copia y pega, pero si asi lo haces ya es problema tuyo.

Saludos,


----------



## jorkera (Jun 11, 2007)

mira aqui he hecho algo pero me falta terminar.
lo que es seguro es que me estoy iniciando en esto
por lo cual necesito aprender bien esto.
de antemano muchas gracias y perdon por las 
molestias.
adios



```
#include <16f874A.H>
 # use delay (clock=4000000)
 int comodin = 0;

 
void main (void)
       {
     while (1)
           {
          if(input (pin_c0 == 0) ll (comodin == 1))
                  {
                    output_b (0x55);
                    delay_ms (500);
                    output_b (0xAA);
                    delay_ms (500);
                    comodin = 1;
                   }
          if (input (pin_c1 == 0))
                  {
                    output_b (0);
                    comodin = 0;
                   }
             }
```


----------



## alejandro_oo (Jun 12, 2007)

De que te estas iniciando te estas iniciando, pero te falta echarle muchas mas ganas, en tu ultimo código no cerraste el método principal } es recomendable que indentes tu código para que te des cuenta de estas cosas.

Luego tienes que ponerte de acuerdo que estado vas a checar en las entradas y en que puerto estarán, en el primer código haces creer que las entradas las quieres en el puerto B (aunque tenias mal el set_tris_x) y que las salidas estarán en el puerto C, pero en este ultimo código pasa justamente lo contrario.

Igualmente en tu primer código quieres preguntar si las entradas son diferentes de 0 (o sea verdaderas), pues antepones el operador de negación:


```
#if (!input(PIN_B0=0));
```

En este último código quieres preguntar si las entradas son iguales a 0, entonces no te entiendo ¿?


```
if (input (pin_c1 == 0))
```

Ahí mismo continuas cometiendo el mismo error de poner el operador de comparación dentro del mismo método input(), veras el método input() acepta como parámetro una constante o variable (aunque tarda mas) del pin que quieres leer, luego la comparación debes hacerla afuera así por ejemplo:


```
if(input(PIN_C1)==true){ }
```

Algo mas corto:


```
if(input(PIN_C1)){ }
```

Eso igual pregunta si tu entrada es verdadera (alta) a menos que quieras lo contrario y para ello si usarias el operador de negacion:


```
if(!input(PIN_C1)){ }
```

Debo admitir que veo mejoría en tu sintaxis, pero define por donde vas ¿de acuerdo?   

Saludos,


----------



## jorkera (Jul 25, 2007)

hola gracias por la excelente ayuda
de verdad me ha servido mucho
pero ahora necesito otra ayudita no ma
estoy haciendo un PCB con el pics 16F874A 
necesito cambiar la instruccion goto por otra
que haga lo mismo, estoy programando con el MPLAB
y compilando con el CCS, de ante mano gracias.[/code]




```
//tarea de tx//
//#Include <16f873a.h>
#Include  "C:\Archivos de programa\PICC\Devices\16f873a.h"
//#Include  "C:\Archivos de programa\Microchip\Third Party\PICC\Drivers\stdio.h"	 
# use Delay (clock=4000000)
# use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,timeout=100)
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP 
unsigned char Dato;

void main(void)			
				{

setup_adc(7);

		printf ("SECUENCIAS	\n\r");
		printf ("\n\r");
		printf (		"MENU			\n\r");
		printf ("\n\r");
		printf ("Elijir  secuencia 			\n\r");
		printf ("\n\r");
		printf ("	(1) Secuencia 1		\n\r");
		printf ("\n\r");
		printf ("	(2) Secuencia 2			\n\r");
		printf ("\n\r");
		printf ("	(3) Secuencia 3			\n\r");
		printf ("\n\r");
		printf ("	(4) Boton 1 Secuencia Pendulo			\n\r");
		printf ("\n\r");
		printf ("	(5) Boton 2 Reset						\n\r");
			
while(TRUE)
	{
	Dato=getc();

            if(input(PIN_A4)==0)
              	{		
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
 				 output_high(pin_B6);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
				 output_high(pin_B7);
				 	Delay_ms(50);
				 output_high(pin_B0);
				 output_high(pin_B1);
                 output_high(pin_B2);
				 output_high(pin_B3);
				 output_high(pin_B4);
				 output_high(pin_B5);
 				 output_high(pin_B6);
				 	Delay_ms(50);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B3);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B3);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
				 output_high(pin_B4);
				 output_high(pin_B3);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B3);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B3);
 				 output_high(pin_B1);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B3);
				 output_high(pin_B2);
				 output_high(pin_B0);
				 	Delay_ms(50);
				 output_high(pin_B7);
				 output_high(pin_B6);
                 output_high(pin_B5);
				 output_high(pin_B4);
				 output_high(pin_B3);
				 output_high(pin_B2);
 				 output_high(pin_B1);
				 	Delay_ms(50);				
                 output_b(0x00);
				 }	
			if(input(PIN_A5)==0)
				{
                 #asm
					goto 0;
				 #endasm	   
				}
			if(Dato==49)	
				{		
				 output_b(0x99);
				 Delay_ms(200);
				 output_b(0x66);
				 Delay_ms(200);
				 output_b(0x99);
				 Delay_ms(200);
				 output_b(0x66);
				 Delay_ms(200);
                 output_b(0x99);
				 Delay_ms(200);
				 output_b(0x66);
				 Delay_ms(200);
                 output_b(0x99);
				 Delay_ms(200);
				 output_b(0x66);
				 Delay_ms(200);
				
				}	
			if (Dato==50)
				{
                 output_high(PIN_B7);
                 output_high(PIN_B6);
				 Delay_ms(100);
				 output_low(PIN_B7);
				 output_low(PIN_B6);
			 	 Delay_ms(200);		
                 output_high(PIN_B5);
                 output_high(PIN_B4);
				 Delay_ms(100);	
                 output_low(PIN_B5);
				 output_low(PIN_B4);
				 Delay_ms(200);	
			  	 output_high(PIN_B3);
                 output_high(PIN_B2);
				 Delay_ms(100);
                 output_low(PIN_B3);
				 output_low(PIN_B2);
				 Delay_ms(200);
	 			 output_high(PIN_B1);
                 output_high(PIN_B0);
				 Delay_ms(100);
				 output_low(PIN_B1);
				 output_low(PIN_B0);
				 Delay_ms(200);
                 output_high(PIN_B7);
                 output_high(PIN_B6);
				 Delay_ms(100);
				 output_low(PIN_B7);
				 output_low(PIN_B6);
			 	 Delay_ms(200);		
                 output_high(PIN_B5);
                 output_high(PIN_B4);
				 Delay_ms(100);	
                 output_low(PIN_B5);
				 output_low(PIN_B4);
				 Delay_ms(200);	
			  	 output_high(PIN_B3);
                 output_high(PIN_B2);
				 Delay_ms(100);
                 output_low(PIN_B3);
				 output_low(PIN_B2);
				 Delay_ms(200);
	 			 output_high(PIN_B1);
                 output_high(PIN_B0);
				 Delay_ms(100);
				 output_low(PIN_B1);
				 output_low(PIN_B0);
				 Delay_ms(200);
				 output_b(0x00);		
				}
			if (Dato==51)	
				{		
				output_b(0x01);
 				Delay_ms(100);	
				output_b(0x02);	
				Delay_ms(100);
			    output_b(0x04);
 				Delay_ms(100);	
				output_b(0x08);	
				Delay_ms(100);
                output_b(0x04);
 				Delay_ms(100);	
				output_b(0x02);	
				Delay_ms(100);
                output_b(0x01);
 				Delay_ms(100);		
				output_b(0x02);	
				Delay_ms(100);
			    output_b(0x04);
 				Delay_ms(100);	
				output_b(0x08);	
				Delay_ms(100);
                output_b(0x04);
 				Delay_ms(100);	
				output_b(0x02);	
				Delay_ms(100);
                output_b(0x01);
 				Delay_ms(100);	
				}	
			}	
		}
```


----------



## alejandro_oo (Jul 28, 2007)

Hola,

Veo que el goto en asm lo usas para ir a la posición 0 (para reiniciar), tal vez podrías usar:


```
reset_cpu();
```

Eso responde a tu pregunta, luego (aunque no lo preguntas) te digo que no entiendo del todo tu código, una parte se entiende y otras no, pero bueno  . Hay cosas que podrias simplificar usando mas estructuras logicas para evitarte poner lo mismo varias veces.

Saludos,

PD: Sigo diciendote lo mismo; indenta tu codigo.


----------



## Maritto (Jul 28, 2007)

podrias reemplazar todos esos
output_low(PIN...)
por un
output_b(0b********) donde los ********, reprecentan a un numero del 0 al 255 EN BINARIO, que es mas agil que escribirlo bit por bit!
suertes!


----------



## jorkera (Jul 28, 2007)

gracias por la ayuda
cada dia se aprende mas
la información esta, uno es el que la procesa
thank


----------



## jorkera (Ago 1, 2007)

ahora si que necesito de su ayuda
tengo que hacer un trabajo: que sea una calculadora, suma,resta,multiplica,divide.
solo con 2 numeros,osea, de 0 a 9 
se los agradeceria de corazon
thank


----------



## alejandro_oo (Ago 2, 2007)

Jorkera, pero ¿Qué llevas de avance?, me refiero al código para la calculadora esa que quieres hacer, no se, probablemente alguien te de ese código sin mas ni mas, pero creo que lo interesante aquí es que tu mismo demuestres tus avances para darte la mano en las partes que se te vayan complicando.

Por lo que veo usaras la interfaz por RS232 para manejar tu calculadora o algo por el estilo ¿? No esta tan complicada la cosa, sí le pones ganas y nos cuentas mas.

Saludos,


----------



## jorkera (Ago 15, 2007)

bueno ahora estoy en un trabajo estadistico.
que de 10 numeros (entre 0 y 9) me sume, saque promedio,el numero mayor y numero menor.
tengo la suma y el promedio listo,pero me falta el numero mayor y menor ...
bueno si alguien se ofrece a ayudar. bakan.
les dejare el codigo que llevo!!!
una duda mas...los resultados de los numeros al hacer printf me salen en ASCII. seria mejjor si
saliera en decimal


----------



## sakurita2009 (May 9, 2009)

debo hacer un programa donde se utilizan 5 pulsador que haran las veces de alarma, y visualizar en un display de 7 segmentos el numero de alarma que se pulso, y el sexto pulsador es un reset y visualiza el o en el display me gustaria que me dijeran si el programa que tengo funcionaria bien para el caso, o si hay una forma mas facil de de hacerlo.

me ayudarian en el comentario de estas lineas es que no se como explicarlas

```
while( !input(pin_c0))  //
      {
         if((dato&0x00)==0)   //
```



```
//PROGRAMA QUE VISUALIZA EN UN DISPLAY EL NUMERO DE ALARMA QUE SE ACTIVO

#INCLUDE <16F877A.H>          // tipo de PIC
#USE DELAY (CLOCK=4000000)    // cristal de 4 MHz
#FUSES XT,NOWDT,NOLVP         // fusibles
#byte puerto_b=06             // direccion del puerto B
int dato;

VOID MAIN ()
{
   SET_TRIS_B(0X00);          // configura el puerto B como salidas
   SET_TRIS_C(0XFF);          // configura el puerto c como entradas 
   puerto_b=0;                // apaga el display
   WHILE(1)                   // ciclo indefinido
   {  

      while( !input(pin_c0))  //
      {
         if((dato&0x00)==0)   //
         {
            puerto_b=0x06;    // carga puerto B y visualiza el numero 1.
         }
      }
      while( !input(pin_c1))
      {
         if((dato&0x00)==0)
         {
            puerto_b=0x5B;         
         }
      }
      
      while( !input(pin_c2))
      {
         if((dato&0x00)==0)
         {
            puerto_b=0x4F;         
         }
      }      
       while( !input(pin_c3))
      {
         if((dato&0x00)==0)
         {
            puerto_b=0x66;         
         }
      }     
      while( !input(pin_c4))
      {
         if((dato&0x00)==0)
         {
            puerto_b=0x6D;         
         }
      }      
      
       while( !input(pin_c7))
      {
         if((dato&0x00)==0)
         {
            puerto_b=0x3F;         
         }
      }     
   }
}
```


----------



## facuenta (Mar 18, 2010)

Que tal. Les hago una pregunta que me dejo trabajo completamente.
Tengo el pickit2, pero como hago el debuger para ir midiendo el tiempo de los procesos con un programa hecho en CCS? in circuit? Me compré hace unos días una placa entrenadora que viene con el PIC16F887 pero el problema que tengo que el LCD tiene su bus de datos conectado al PORTD, pero los terminales de control están en otro lado... el E está conectado a RE2, el RS está conectado al RE1 y el R/W directamente a masa... qué tengo que cambiar en el LCD.C?
Saludos,
Facundo


----------



## denianke (Mar 20, 2010)

por lo que vi en el primer mensaje, estas intentando rotar el byte?
algo asi serviria:


```
byte Dato=0x55;

void main (void){
while(1){
output_b(Dato);
Rotate_Right(&Dato,1);
delay_ms(500);
}
}
```

Dos cosas, es mi primer mensaje;
Tambien voy empezando a usar CCS, y no se muy bien c.


----------



## ByAxel (Mar 20, 2010)

Hola facuenta:
Por lo que veo el LCD.C trabaja estrictamente todo por un puerto, el cambio seria en varias partes; antes de eso que tal si pruebas con el FLEX_LCD.C, todos los pines de esta libreria se pueden manipular al punto que puedes usar las patas que te sobran del PIC para controlar el LCD.
http://www.google.com.pe/search?hl=es&ei=KeWkS8_-LoKdlgfy8tHaCA&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CA8QBSgA&q=flex_lcd.c&spell=1


----------



## havat (May 11, 2010)

hola mi proyecto es una cslculadora con el pic 16f877, lcd y teclado matricial, perotengo un problema no se como hacer en esta parte,, me llegan del teclado caracteres y necesito operarlos, pero no se como hacerlo, si alguien me puede ayudar..!!


----------



## TheLordDuran (Sep 1, 2010)

Saludos.

Estoy con un super problemon, tengo este código (yo lo hice) que controla temperatura y humedad de un invernadero, bueno, lo hice por etapas, primero el testeo de esas variables, pues funcionava bien, procedi a hacer el control de esas variables, es decir, querer hacer funcionar los actuadores (motores para aire acondicionado, bomba de agua y demás), al ingresar el código para ello y las variables necesarias, pues..... me da un monton de errores (57), me dice que no declare ninguna variable, no me reconoce ninguna. Estoy utilizando la version 4.084 del compilador, para hacer algunos otros proyectos, eso me funciono muy bien, además que lo tengo bien parchado.


```
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(D)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>

void main()
{
   set_tris_c(0xB0);
   set_tris_d(0xC0);
   //DECLARANDO VARIABLES DE CONTROL
   short control;
   short control1;
   short controlh;
   //FIN VARIABLES DE CONTROL
   int16 hum1;
   int16 hum2;
   int16 hum3;
   int16 temp1;
   int16 temp2;
   float tempt1;
   float tempt2;
   float humt1;
   float humt2;
   float humt3;
   float humS;
   float tempS;
   float RH;
   float p;
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   control = 0;
   control1 = 0;
   controlh = 0;
   while(1)
   {
      set_adc_channel(0);  //CANAL 0
      delay_us(10);
      temp1 = (read_adc() * 100);
      set_adc_channel(1);  //CANAL 1
      delay_us(10);
      temp2 = (read_adc() *100);
      tempt1 = temp1 * 0.0049;
      tempt2 = temp2 * 0.0049;
      tempS = (tempt1 + tempt2) / 2.0;   //TEMPERATURA A MANEJAR
      //*********** RUTINA DE CONTROL DE TEMPERATURA ****************
      if (tempS >= 28.0)
      {
         if (control == 0)  //AQUI TESTEAR EL RC3
         {
            output_high(PIN_C1);
            // ir a sube y luego regresar
            delay_ms(3000);
            // ir a paraA y luego regresar
            output_low(PIN_C1);
            control = 1;  //aqui ver el RC3
         }
      }
      if (tempS <= 20.0)
      {
         if (control == 1)
         {
            output_high(PIN_C3);
            //ir a baja y regresar
            delay_ms(3000);
            //ir a paraB y regresar
            output_low(PIN_C3);
            control = 0;
         }
         output_high(PIN_C2); //AIRE CALIENTE
         control1 = 1;
      }
      if (control1 == 1)
      {
         if (tempS <= 25.0)
         {
            output_high(PIN_C2);  //AIRE CALIENTE
         } else
           {
              output_low(PIN_C2);  //APAGA AIRE CALIENTE
              control1 = 0;
           }
      }
      //************ FIN RUTINA CONTROL TEMPERATURA *****************
      set_adc_channel(2);  //CANAL 2
      delay_us(10);
      hum1 = read_adc();
      set_adc_channel(3);  //CANAL 3
      delay_us(10);
      hum2 = read_adc();
      set_adc_channel(4);  //CANAL 4
      delay_us(10);
      hum3 = read_adc();
      //hum1t = (5.0 * hum1) / 1024.0;
      humt1 = hum1 * 0.0049;
      humt2 = hum2 * 0.0049;
      humt3 = hum3 * 0.0049;
      humS = (humt1 + humt2 + humt3) / 3;
      RH = (humS - 0.958) / 0.0307;   // HUMEDAD HA MANEJAR
      //******* RUTINA CONTROL DE HUMEDAD ****************
      if (RH >= 80.0)
      {
         output_low(PIN_C0);
      }
      if (RH <= 75.0)
      {
         output_high(PIN_C0);
         controlh = 1;
      }
      if (controlh == 1)
      {
         if (RH <= 77.0)
         {
            output_high(PIN_C0);
         }else
         {
            output_low(PIN_C0);
            controlh = 0;
         }
      }
      //*********** FIN RUTINA CONTROL HUMEDAD **************
      //printf(lcd_putc, "\fADC = %4ld", q);
      //printf(lcd_putc, "\nVoltage = %01.2fV", p);
      printf(lcd_putc, "\f   TEMPERATURA    ");
      printf(lcd_putc, "\n     %01.2f C", tempS);
      printf(lcd_putc, "\n HUMEDAD   ");
      printf(lcd_putc, "\n%01.2f PHS", RH);
      //TRANSMISION SERIAL
      printf("ADC = %4ld", tempt1);
      printf(" Temperatura = %01.2f C\r", tempS);  // El \r permite cambiar de línea
      printf("ADC = %4ld", hum3);
      printf(" humedad = %01.2f RH\r", RH);
      delay_ms(100);
   }
}
```

no se cual sea el error    , ya prove cambiando el tipo de variables, pero nada.


----------



## ByAxel (Sep 1, 2010)

TheLordDuran dijo:


> Saludos.
> 
> además que lo tengo bien parchado.



Ok, declara las variables globales fuera de MAIN que al parecer son todas, (ponlas entre #include... y MAIN); este C no es como programar en consola para Visual C, si es que lo has usado...

Saludos


----------



## TheLordDuran (Sep 1, 2010)

ByAxel dijo:


> Ok, declara las variables globales fuera de MAIN que al parecer son todas, (ponlas entre #include... y MAIN); este C no es como programar en consola para Visual C, si es que lo has usado...
> 
> Saludos



Saludos ByAxel, muchas gracias por responder.

Bueno, hice los siguiente en el código, en si, en el orden.


```
void main()
{
   //DECLARANDO VARIABLES DE CONTROL
   short control;
   short control1;
   short controlh;
   //FIN VARIABLES DE CONTROL
   int16 hum1;
   int16 hum2;
   int16 hum3;
   int16 temp1;
   int16 temp2;
   float tempt1;
   float tempt2;
   float humt1;
   float humt2;
   float humt3;
   float humS;
   float tempS;
   float RH;

   set_tris_c(0xB0);
   set_tris_d(0xC0);

   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   control = 0;
   control1 = 0;
   controlh = 0;
```

Cambie la posicion de código de la configuracion de puertos C y D, lo puse despues de declarar las variables, y da como se quiere.

Y bueno, voy a provar lo que me endicas, no esta demás seguir dandole un poco de orden.

Muchas gracias.


----------



## f0raster0 (Sep 28, 2010)

Hola.. estoy iniciándome con la programación de PIC y tengo el 16F887..

Estoy tomando el siguiente ejemplo, 
#include <16F887.h>
#fuses XT, NOWDT
#use delay( clock = 4000000)
#BYTE TRISB = 0x86
#BYTE PORTB = 0x06
#BYTE OPTION_REG = 0x81

void main()
{
bit_clear(OPTION_REG,7);
bit_set(TRISB,0);
bit_clear(TRISB,1);
bit_clear(PORTB,1);

while (1)
   {
   if (bit_test(PORTB,0) ==1)
   bit_clear(PORTB,1);
   else
   bit_set(PORTB,1);

   }
 }


Al presionar un botón en RB0 se enciende el led conectado en RB1.. el problema es que al simularlo en Proteus me da error, estoy culpando al error de warning que me da al compilar el firmware.. 

warning 203 "hola1.c" Line17(1,1): Condition always TRUE
Memory Usage: ROM=0% RAM=2%
0 Errors, 1 Warnings.

La línea 17 es la donde está:  "{ antes del if
Me pueden echar una mano con ese mensaje de precaución??

Gracias desde el fin del mundo..


----------



## ByAxel (Sep 28, 2010)

f0raster0 dijo:


> Al presionar un botón en RB0 se enciende el led conectado en RB1.. el problema es que al simularlo en Proteus me da error, estoy culpando al error de warning que me da al compilar el firmware..
> 
> warning 203 "hola1.c" Line17(1,1): Condition always TRUE
> Memory Usage: ROM=0% RAM=2%
> ...



En *while(1)* pon *while(TRUE)*, ya se que parece poca cosa pero así es como lo pide el compilador del ccs...

saludos


----------



## f0raster0 (Sep 28, 2010)

ByAxel..¡¡¡

Gracias.. ha funcionado de maravilla la compilación.. luego lo pruebo en Proteus y de allí a la placa de prueba de microchip..

Estoy ansioso que llegue el libro C CCS desde el país del norte.. para continuar practicando..

Nuevamente gracias desde las tierras de sol y cobre..


----------



## VALERYRAMIREZ (Sep 18, 2011)

Buenas tardes, yo estoy en las mismas usando el if de la siguiente manera (las funciones y variables definidas aparte son para usarlas posteriormente):
#include "C:\Users\valery\Documents\UCV\Tesis\Microcontrolador e interfaces\Simulaciones\batería a cargar.h"

long cbat(); long cpanel(); long bat(); long vpanel(); long ccorto();
void main()
{
long corpanel, vpanel, vbat;
set_tris_B(0xfe);
//setup_adc_ports(sAN2|sAN3|sAN4|VSS_VDD);
//setup_adc_ports(ALL_ANALOG);
//setup_adc(ADC_CLOCK_DIV_2);
//set_tris_A(0b11111100);

//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!

                  //Si el voltaje de los paneles es mayor al de la batería,
                  //deja pasar corriente a la batería.  
if (PIN_B0>0)                   
output_b(0x00);
//bat();
else
output_b(0xff);
}
//***********************Declaración de rutinas*******************************

long vpanel()
{
set_adc_channel(0);
output_b(read_adc());
}
long ccorto()
{
set_adc_channel(1);
delay_us(20);
output_b(read_adc());
}
long bat()
{
set_adc_channel(2);
delay_us(20);
output_b(read_adc());
}
long cpanel()
{
set_adc_channel(3);
delay_us(20);
output_b(read_adc());
}
long cbat()
{
set_adc_channel(4);
delay_us(20);
output_b(read_adc());
}


----------



## 1rodrigochino (Sep 19, 2013)

hola ByAlex, yo nesecito el driver lcd flex y fui a tu dirección para buscar el archivo pero me apareció un código,la verdad no se muy bien pero yo pensé que encontraría un archivo para poder guardarlo la crapeta de los drivers de mi programa o no se si seras tan amable de decirme como usarlo


----------



## ByAxel (Sep 19, 2013)

1rodrigochino dijo:


> nesecito el driver lcd flex y fui a tu dirección para buscar el archivo pero me apareció un código,la verdad no se muy bien pero yo pensé que encontraría un archivo para poder guardarlo la crapeta de los drivers de mi programa o no se si seras tan amable de decirme como usarlo


Hola, lo explican por aquí. Hace tiempo que no uso el CCS pero diria que este no va a funcionar (creo) con copiar a la carpeta de "Driver" como una libreria más... igual prueba. Generalmente hacia una copia de la libreria y lo agregaba en la misma carpeta donde está el resto de código... main y demás.


----------



## 1rodrigochino (Sep 19, 2013)

mmmmm ByAxel me temo que te entendí muy poco, pero por lo que te entendí lo que hice fue copiar el codigo en el compilador PCW de ccs,y realice un nuevo archivo en con en source file con extencion .c pero al compilarlo me mando un error eso producirá un problema con mi otro codigo que estoy realizando o no afecta,  gracias de antemano por tu respuesta


----------



## ByAxel (Sep 20, 2013)

1rodrigochino dijo:


> lo que hice fue copiar el codigo en el compilador PCW de ccs,y realice un nuevo archivo en con en source file con extencion .c pero al compilarlo me mando un error eso producirá un problema con mi otro codigo que estoy realizando o no afecta,  gracias de antemano por tu respuesta


Que dice el error.
Es mejor hacer una copia de la libreria flex_lcd.c por cada proyecto donde involucre un LCD ya que es suceptible a cambios.
Saludos


----------



## 1rodrigochino (Sep 20, 2013)

a*quí *te adjunto el error, dice que requiere device se lo puse y manda mas errores y otra*_*vez gracias


----------



## ByAxel (Sep 21, 2013)

Debes de declarar el tipo de dispositivo arriba de todo #DEVICE PICxxxx. que generalmente está en un archivo *.h y luego ya el resto como #DEFINE, #INCLUDE, etc...


----------



## Jgmicro (Oct 28, 2014)

Hola alguno de ustedes sabe como reflejar un corazón en un lcd utilizando el puerto d que es por defaul?
eh intentado con varias formas pero no me ah salido :S


----------



## D@rkbytes (Oct 28, 2014)

Jgmicro dijo:


> Hola. ¿Alguno de ustedes sabe como reflejar un corazón en un lcd utilizando el puerto d que es por default?
> He intentado con varias formas pero no me ha salido.


Mira el ejemplo adjunto, realicé dos tipos de caracteres personalizados que se almacenan en la CGRAM de la pantalla.

Espero que sea lo que estás intentado hacer.

Suerte.


----------



## martin12as (Oct 28, 2014)

yo tengo un programa que se llama "generador cgram", te permite hacer el carácter que quieras en la matriz de 5*7 y luego te genera el código para el pic en lenguaje ensamblador o en C para css.


----------



## tonchez (Dic 15, 2015)

Quiero testear siempre unos estados pero q*ue* me corra un switch de un menú*.*
*L*a idea es que el menú siempre esté corriendo y cuando yo cambie el estado se vean los cambios*.*
*¿C*ómo se podría hacer eso*?*




```
#include<16f88.H> 
#FUSES INTRC_IO,nowdt,PUT,noprotect 
#use delay(clock = 8000000) 
#use rs232 (baud =9600,XMIT =PIN_b5,RCV =PIN_b2,BITS=8,PARITY =N,FORCE_SW,INVERT)


const char pass[]={'i','c','e','1'}; //constante con la clave
int ban=0;
char PRENDER_LED; 
void MENU()
{
   puts("\f                OPRIMA BARRA PARA REGRESAR A MENU\n\n");
   puts("\r OPRIMA 0 ESTADOS\r\n");
   puts("oprima 1 PARA ABRIR LA PUERTA\r\n");
   puts("oprima 2 PARA CERRAR LA PUERTA\r\n");
   puts("oprima 3 PARA ACTIVAR ALARMA\r\n");
   puts("oprima 4 LUZ DEL CUARTO\r\n");
}
VOID ALARMA(){
char key;      //variable para pulsación del teclado
char dato[4];  //variable vector para ir guardando cada uno de las pulsaciones de caracteres
int i=0;
   while(true){
   output_bit(52,0);
              if(input(PIN_B4)==1)
      {
            PRINTF("\fTeclee el pasword para desactivar la alarma\r\r");
            output_bit(53,1);
      while(i<=3)       //Este ciclo permite ingresar
      {                 //cuatro digitos
      key=getc();
      if(key!=0){
      dato[i]=key;
      i++;
      delay_ms(100);
      }}
      i=0;
      if((dato[0]==pass[0])&&(dato[1]==pass[1])&&(dato[2]==pass[2])&&(dato[3]==pass[3]&&input(PIN_b4)==0))
      {
      
      output_bit(52,0);output_bit(53,0);
      printf("\f CORRECTO BIENVENIDO A CASA");
      break;
      }
            
      else
      {
      printf("\f Incorrecto int");
      delay_ms(1000);
      }
      }
   }
}
 
   VOID main ()
   {
      output_bit(48,0);
      output_bit(42,0);
      output_bit(43,0);
      printf("                     PULSE BARRA\r");
      printf("\f ENTRADA1 : %u\r\n",INPUT(PIN_A0));
      printf(" ENTRADA2 : %u",INPUT(PIN_A1));
      OUTPUT_BIT(41,0);
      IF(INPUT(PIN_A0)==1){OUTPUT_BIT(41,1);
      while(INPUT(PIN_A0)==1){}
      ban=1;}
      if(ban==1){OUTPUT_BIT(41,0);
      BAN=0;}
      FOR (;;){
           PRENDER_LED=getch();
      SWITCH (PRENDER_LED){ 
      CASE ' ': MENU();
      BREAK;
      CASE '0': output_toggle(PIN_A4);
      BREAK;
      CASE '1':  output_toggle(PIN_A2),output_bit(54,1);
      BREAK;
      CASE '2':  output_toggle(PIN_A3),output_bit(55,1);
      BREAK;
      CASE '3': ALARMA(); 
      break;
      }}}
```
Este es mi código pero testea y entra al menú, y cuando hago los cambios en las entradas, no me los lee.
*¿*Habrá alguna forma que sea sin interrupción*? *Que sean sólo las banderas.
Porque me han comentado que eso se logra con unas banderas booleanas.
En realidad ya intenté varias veces, pero me corre o el Switch o los IF y ni siquiera se ven los cambios de los estados.


----------

