Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/06/2007 #1


Programa en CCS para el pic 16F877A
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.


Código PHP:
        /* 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;
                 } 
07/06/2007 #2


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í:

Código:
#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.

Código:
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:

Código:
/*
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,
11/06/2007 #3


muchas gracias
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


Código PHP:
#include <16f874A.H>
 # use delay (clock=4000000)
 
int comodin 0;

 
void main (void)
       {
     while (
1)
           {
          if(
input (pin_c0 == 0ll (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;
                   }
             } 
12/06/2007 #4


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:

Código:
 #if (!input(PIN_B0=0));
En este último código quieres preguntar si las entradas son iguales a 0, entonces no te entiendo ¿?

Código:
 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:

Código:
if(input(PIN_C1)==true){ }
Algo mas corto:

Código:
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:

Código:
if(!input(PIN_C1)){ }
Debo admitir que veo mejoría en tu sintaxis, pero define por donde vas ¿de acuerdo?

Saludos,
25/07/2007 #5


el mismo
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]



Código PHP:
                          //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);    
                }    
            }    
        } 
28/07/2007 #6


Hola,

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

Código:
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.
28/07/2007 #7


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!
28/07/2007 #8


gracias por la ayuda
cada dia se aprende mas
la información esta, uno es el que la procesa
thank
01/08/2007 #9


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
Imágenes Adjuntas
Tipo de Archivo: jpg esquematico_395.jpg (64,0 KB (Kilobytes), 346 visitas)
02/08/2007 #10


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,
15/08/2007 #11


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
Archivos Adjuntos
Tipo de Archivo: rar nuevo_documento_de_texto__2__126.rar (1,0 KB (Kilobytes), 369 visitas)
09/05/2009 #12


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
Código:
      while( !input(pin_c0))  //
      {
         if((dato&0x00)==0)   //

Código PHP:
//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;         
         }
      }     
   }

18/03/2010 #13


Respuesta: Programa en CCS para el pic 16F877A
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
20/03/2010 #14


Respuesta: Programa en CCS para el pic 16F877A
por lo que vi en el primer mensaje, estas intentando rotar el byte?
algo asi serviria:

Código PHP:
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.
20/03/2010 #15

Avatar de ByAxel

Respuesta: Programa en CCS para el pic 16F877A
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=e..._lcd.c&spell=1
11/05/2010 #16


Respuesta: Programa en CCS para el pic 16F877A
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..!!
01/09/2010 #17


Respuesta: Programa en CCS para el pic 16F877A
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.

Código:
#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.
01/09/2010 #18

Avatar de ByAxel

Respuesta: Programa en CCS para el pic 16F877A
TheLordDuran dijo: Ver Mensaje
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
01/09/2010 #19


Respuesta: Programa en CCS para el pic 16F877A
ByAxel dijo: Ver Mensaje
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.

Código:
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.
28/09/2010 #20


Respuesta: Programa en CCS para el pic 16F877A
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..
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.