SoloCodigo
		Programación Específica => Microcontroladores => Programación en C => Mensaje iniciado por: jodch en Lunes 12 de Febrero de 2007, 08:26
		
			
			- 
				HOLA QUE TAL .... :o   
 ESTOY ESTUDIANDO PROGRAMACION Y MIS "  P :devil: ROFESORES" ME MANDARON UN PROYECTO EL DE CONTROLAR UNA LLAVE DE PASO DE UNA TUBERIA, LA MISMA QUE SE ACTIVA POR MEDIO DE UN SENSOR Y TODO ESTO UTILIZANDO LO QUE ES C++..
 dE LO CUAL ESTOY MAS PERDIDO  QUE "GAVIOTA EN BOLIVIA" Y NECESITO PORFA su ayuda en links,tutoriales,manuales no sea lo que sea ......
 -----> estoy a toda busqueda :comp:
 Ademas tengo un reto el de realizarlo en Win xp,pero he indagado y es renegado a aquello pero tengo la opcion de hacerlo en 98
 
 
 GRACIAS POR LA ATENCION PRESTADA A LA PRESENTE
 SALUDOS DESDE QUITO-ECUADOR
 mi mail es  jorge.eept@gmail.com
 
 
 
 "QUERES ES PODER" Y "AMAR ES VIVIR  " :smartass:
- 
				Bienvenido!.. Dime, que puerto vas a usar para controlar la valvula?, el puerto paralelo o el puerto serial?, el soft lo desarrollaras en VC++ o Builder C++ ?.. tienes mas o menos una idea armada de lo que pretendes hacer y como?, Saludos
			
- 
				¿Con qué vas a abrir la válvula? ¿Es sólo abrir/cerrar o control de % de apertura? ¿Sensor, para qué, qué sensa?
			
- 
				hola sabes es un sendor de humedad y ese valor es el que automatizara una valvula para que esta se abra todo esto con comunicacion serial rs232 pero mi problema se complica al usar el pic 17f877a y realizar el software de control en c++ y lo del pic en microcode he indagado pero solo teeoricamente (todavia busco ejemplos sencillos) gracias por todo...........
 saludos............
- 
				HolA estoy haciendo un proyecto de un sistema de control de  temperatura, en hitech pero al momento de compilarlo no me genera el archivo hex y me marca el error número 139 , no se que pueda estar mal o que le pueda cambiar !!!  dejo el programa ... si lo puede alguien checar .. se los agredeceria mucho oh si alguien puede compilarlo ...gracias
 
 
 PROGRAMA EN C:
 //PROGRAMA DE UN SISTEMA Q MIDE LA TEMPERATURA ACTUAL,
 //ADEMÁS MIDE LA MAXIMA Y MINIMA (O LIMITA LA TEMPERATURA A
 //UN RANGO IMPUESTO POR EL USUARIO).
 // SI EL SISTEMA SUPERA LA TEMPERATURA MAXIMA DEL RANGO, SE
 //ACTIVARA LA ALARMA "FRIO" Y SE APAGARA EL LED CONECTADO A LA
 //PATILLA RA2.
 //SI POR EL CONTRARIO, EL SISTEMA NO SUPERA LA TEMPERATURA
 //MINIMA DEL RANGO, SE ACTIVARA LA ALARMA "CALOR" Y SE
 //APAGARA EL LED CONECTADO A LA PATILLA RA1.
 //LOS LEDS SE APAGARAN DEBIDO A QUE POR DEFECTO LOS LEDS
 //ESTARAN ENCENDIDOS AL ALIMENTAR LA PLACA DE LEDS
 //EN PORTC SE INDICARA LA TEMPERATURA MINIMA DEL RANGO
 //MEDIANTE MICROINTERRUPTORES.
 //EN PORTD SE INDICARA LA TEMPERATURA MAXIMA DEL RANGO
 //MEDIANTE MICROINTERRUPTORES.
 //SI PORTC>PORTD VISUALIZAREMOS LA ALARMA "ERROR".
 #include<pic1687x.h>
 unsigned char x=1; //para el switch (inicializa y actualiza max y min)
 unsigned int temp,tempmin,tempmax,t; //variables en hexadec y t (retardo conversor).
 unsigned int templcd,tempminlcd,tempmaxlcd; //variables en decimal para enviar al lcd.
 unsigned int rangmin,rangmax; //variables en Hexadecimal para enviar al lcd.
 //de los interruptores.
 unsigned char hexadec (unsigned char hex); //Pasa a decimal.
 void iniciar_lcd(void); //Inicia el LCD.
 void lcd_control(unsigned int valor); //Control del LCD (Instrucciones).
 void prueba(void); //Texto y datos a enviar al LCD.
 void prueba2(void); //Texto y datos a enviar al LCD.
 voi rango(void); //Texto y datos a enviar al LCD.
 void prueba3(void); //Texto y datos a enviar al LCD.
 void prueba4(void); //Texto y datos a enviar al LCD.
 void error(void); //Texto y datos a enviar al LCD.
 void lcd_dato(unsigned int dato); //Envia al LCD.
 unsigned int i; //para el retardo de las funciones.
 
 //*********************************************************************
 //****************************MAIN************************************
 void main(void){
 TRISB=0x00; //SALIDA
 TRISE=0x00; //SALIDA
 TRISC=0xFF; //ENTRADA DIGITAL
 TRISD=0xFF; //ENTRADA DIGITAL
 TRISA=0x01; //salida digital. RA0 IN ANALOG
 PORTA=0x00; //PORTA SALIDAS DIGITALES A 0
 PORTC=0x00; //TEMP MINIMA DEL RANGO
 PORTD=0x00; //TEMP MÁXIMA DEL RANGO
 PORTE=0x00; //INICIALIZO A 0
 PORTB=0x00;
 OPTION=0x80;
 INTCON=0xC0;
 ADCON1=0x8E; //justificado a derecha
 ADCON0=0x81;
 templcd=tempminlcd=tempmaxlcd=37; //37dec=25hex temperatura por defecto
 ADIE=1; //HABILITO INTERRUPCION.
 ADGO=1; //PONGO EN MARCHA LA CONVERSIÓN.
 while(1);
 }//MAIN
 //*************************FIN DEL MAIN*******************************
 //*********************************************************************
 
 //***************INTERRUPCION CONVERSOR A/D***********************
 void interrupt convertir (void)                          {
 if(ADIF)                                                            { //SI HA TERMINADO LA CONVERSION
 ADIF=0;
 temp=(ADRESH<<8)+ADRESL; //JUSTIFICADO A DERECHA EN ADCON1.
 temp=temp>>1; //divido entre 2 para buscar paridad de la escala.
 templcd=hexadec(temp); //PASO A DECIMAL.
 rangmin=PORTC; //temp mínima introducida interruptores.
 rangmax=PORTD; //temp mínima introducida interruptores.
 iniciar_lcd();
 lcd_control(0x80); //fija mensaje en la primera fila.
 prueba(); // envia al lcd.
 //Si queremos visualizar la temperatura minima y maxima q alcanza el termometro:
 //*****Inicializa y Actualiza la temperatura mínima y máxima********************
 //La idea es q si la primera vez q conectamos el sistema y:
 // 1)la temp actual(28 por ej) es mayor a la minima (25 por defecto),la minima sea 28.
 // 2)la temp actual (23 por ej) es menor a la maxima (25 por defecto), la maxima sea 23.
 switch(x)                         {
 case 1:
 if(templcd>tempminlcd)                     { //podra entrar solo una vez
 tempminlcd=templcd;
 }
 x++;break;
 case 2:
 if(templcd<tempmaxlcd)                         { //podra entrar solo una vez
 tempmaxlcd=templcd;
 }
 x++;break;
 case 3:
 if (templcd<tempminlcd)                             {
 tempminlcd=templcd;
 }
 x++;break;
 case 4:
 if(templcd>tempmaxlcd)                         {
 tempmaxlcd=templcd;
 }
 x=3;break;
 }//switch
 //**********************************************************
 
 lcd_control(0xC0); //MENSAJE EN 2ª FILA
 //prueba2(); //prueba2() es para visualizar la max y min del termometro
 rango(); //rango() es para visualizar la max(PORTD)y la min(PORTC)
 //introducidas por el usuario
 //CONDICIONES PARA ACTIVAR LA ALARMA Y APAGAR LOS LEDS RA1 Y RA2.
 //EN UN PRINCIPIO LOS LEDS ESTAN TODOS ON (CONDICION DE LA PLACA).
 if (templcd < PORTC)                                      { //SI LA TEMP ACTUAL ES MENOR Q LA MINIMA Q INTRODUCIMOS
 if (PORTC>PORTD)                                                { //SI LA TEMP MIN RANGO>TEMP MAX RANGO=>ERROR.
 lcd_control(0x80); //primera fila del lcd
 error(); //rango mal introducido
 RA1=1; //desactivamos led calor,ya q hay error en el rango
 }
 else                     { //SI NO...
 lcd_control(0x80); //primera fila del lcd
 RA1=0; //APAGAMOS LED RA1
 prueba3(); //MOSTRAMOS CALOR EN LCD
 }
 
 }
 if (templcd > PORTD)            {      //SI LA TEMP ES MAYOR Q LA Q LE INTRODUCIMOS
 //(LA MAXIMA Q QUEREMOS).
 if (PORTC>PORTD)                          { //SI LA TEMP MIN RANGO>TEMP MAX RANGO=>ERROR.
 lcd_control(0x80); //primera fila del lcd
 error(); //rango mal introducido
 RA2=1; //desactivamos led frio, ya q hay error.
 }
 else        {
 lcd_control(0x80); //primera fila del lcd
 RA2=0; //APAGAMOS LED RA2
 prueba4(); //MOSTRAMOS FRIO EN LCD
 }
 }
 
 //*********PARA VOLVER A ENCENDER LOS LEDS RA1 RA2***************
 if (templcd<=PORTD){ //SI LA TEMP <= A LA MAXIMA INTRODUCIDA
 RA2=1; //ENCENDEMOS LED FRIO.
 }
 if (templcd>=PORTC){ //SI LA TEMP>= A LA MINIMA INTRODUCIDA
 RA1=1; //ENCENDEMOS LED CALOR..
 }
 //*********************************************************************
 for (t=0;t<50000;t++); //retardo antes de volver a activar conversor
 ADGO=1;
 } //IF de if (ADIF)
 } //INTERRUPT
 //*********************FIN INTERRUPCION******************************
 
 //*********************************************************************
 //*******************ZONA DE FUNCIONES******************************
 unsigned char hexadec (unsigned char hex){
 unsigned char x,y;
 x=hex/0x0A;
 x=x<<4;
 y=hex%0x0A;
 return (x+y);
 }//unsigned char hexADEC
 void iniciar_lcd(void)          {
 PORTB=0x0E; //INICIO EL LCD(texto visible,cursor vis,no parpadea)
 RE0=1; //ACTIVO ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 RE0=0; //DESACTIVO ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 PORTB=0x3C; //Juego de datos(bus 8 bits,2 lineas,5x10 puntos)
 RE0=1; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 RE0=0; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 return;
 }
 void lcd_control(unsigned int valor)         {
 RE2=0; //INDICA Q ES INSTRUCCION (RS=0)
 for(i=0;i<=100;i++); //aplico retardo
 PORTB=valor; //PORTB=0x80 => primera linea
 for(i=0;i<=100;i++); //aplico retardo
 RE0=1; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 RE0=0; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 return;
 }
 
 void prueba(void){ //TEXTO y TEMPERATURA A ENVIAR AL LCD.
 lcd_dato('A');
 lcd_dato('C');
 lcd_dato('T');
 lcd_dato('U');
 lcd_dato('A');
 lcd_dato('L');
 lcd_dato(':');
 lcd_dato( 0x30 | (templcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=templcd&(0xF0);
 lcd_dato( 0x30 | ( templcd & (0x0F) ) ); //D7-D4=0011. D3-D0=templcd&(0x0F);
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 }
 void prueba2(void){ //TEXTO Y TEMPERATURA A ENVIAR AL LCD
 lcd_dato('M');
 lcd_dato('A');
 lcd_dato('X');
 lcd_dato(':');
 lcd_dato(0x30 | (tempmaxlcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=tempmax&(0xF0);
 lcd_dato(0x30 | ( tempmaxlcd & (0x0F) ) ); //D7-D4=0011. D3-D0=tempmax&(0x0F);
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato('M');
 lcd_dato('I');
 lcd_dato('N');
 lcd_dato(':');
 lcd_dato(0x30 | (tempminlcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=tempmin&(0xF0);
 lcd_dato(0x30 | ( tempminlcd & (0x0F) ) ); //D7-D4=0011. D3-D0=tempmin&(0x0F);
 lcd_dato(' ');
 }
 
 void rango(void){ //TEXTO Y TEMPERATURA A ENVIAR AL LCD
 lcd_dato('M');
 lcd_dato('A');
 lcd_dato('X');
 lcd_dato(':');
 lcd_dato(0x30 | (rangmax & (0xF0))>>4 ); //D7-D4=0011. D3-D0=tempmax&(0xF0);
 lcd_dato(0x30 | ( rangmax & (0x0F) ) ); //D7-D4=0011. D3-D0=tempmax&(0x0F);
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato('M');
 lcd_dato('I');
 lcd_dato('N');
 lcd_dato(':');
 lcd_dato(0x30 | ( (rangmin & (0xF0))>>4 ) ); //D7-D4=0011. D3-D0=rangmin&(0xF0);
 lcd_dato(0x30 | ( rangmin & (0x0F) ) ); //D7-D4=0011. D3-D0=rangmin&(0x0F);
 lcd_dato(' ');
 }
 void prueba3(void){ //TEXTO Y TEMPERATURA A ENVIAR AL LCD.
 lcd_dato('A');
 lcd_dato('C');
 lcd_dato('T');
 lcd_dato('U');
 lcd_dato('A');
 lcd_dato('L');
 lcd_dato(':');
 lcd_dato( 0x30 | (templcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=templcd&(0xF0);
 lcd_dato( 0x30 | ( templcd & (0x0F) ) ); //D7-D4=0011. D3-D0=templcd&(0x0F);
 lcd_dato(' ');
 lcd_dato('C');
 lcd_dato('A');
 lcd_dato('L');
 lcd_dato('O');
 lcd_dato('R');
 lcd_dato(' ');
 lcd_dato(' ');
 }
 
 void prueba4(void){ //TEXTO Y TEMPERATURA A ENVIAR AL LCD.
 lcd_dato('A');
 lcd_dato('C');
 lcd_dato('T');
 lcd_dato('U');
 lcd_dato('A');
 lcd_dato('L');
 lcd_dato(':');
 lcd_dato( 0x30 | (templcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=templcd&(0xF0);
 lcd_dato( 0x30 | ( templcd & (0x0F) ) ); //D7-D4=0011. D3-D0=templcd&(0x0F);
 lcd_dato(' ');
 lcd_dato('F');
 lcd_dato('R');
 lcd_dato('I');
 lcd_dato('O');
 lcd_dato(' ');
 lcd_dato(' ');
 lcd_dato(' ');
 }
 void error(void) {
 lcd_dato('A');
 lcd_dato('C');
 lcd_dato('T');
 lcd_dato('U');
 lcd_dato('A');
 lcd_dato('L');
 lcd_dato(':');
 lcd_dato( 0x30 | (templcd & (0xF0))>>4 ); //D7-D4=0011. D3-D0=templcd&(0xF0);
 lcd_dato( 0x30 | ( templcd & (0x0F) ) ); //D7-D4=0011. D3-D0=templcd&(0x0F);
 lcd_dato(' ');
 lcd_dato('E');
 lcd_dato('R');
 lcd_dato('R');
 lcd_dato('O');
 lcd_dato('R');
 lcd_dato(' ');
 lcd_dato(' ');
 }
 
 void lcd_dato(unsigned int dato){ //ENVIA AL LCD.
 RE2=1; //RS=1; lee dato
 for(i=0;i<=100;i++); //aplico retardo
 PORTB=dato;
 for(i=0;i<=100;i++); //aplico retardo
 RE0=1; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 RE0=0; //ENABLE
 for(i=0;i<=100;i++); //aplico retardo
 return;
 }
 
 
 //*******************FIN DE FUNCIONES*******************************