Programas hechos en MPLAB

Hola Amigos, les cuento que he avanzado mucho en el manejo de los motores paso a paso tanto en sentido horario como antihorario:), ahora les pido sus tan valiosa ayuda en la recepción de datos del puerto serie por medio del pic, yo uso esto:

char parametros;

parametros = getchar();

pero la verdad no se si es la forma correcta:unsure:, además de eso no se como sincronizar mi aplicación en VB.NET con el circuito simulado en Proteus.

Espero me puedan ayudar

Saludossss......
 
Hola Amigos, les cuento que he avanzado mucho en el manejo de los motores paso a paso tanto en sentido horario como antihorario:), ahora les pido sus tan valiosa ayuda en la recepción de datos del puerto serie por medio del pic, yo uso esto:

char parametros;

parametros = getchar();

pero la verdad no se si es la forma correcta:unsure:, además de eso no se como sincronizar mi aplicación en VB.NET con el circuito simulado en Proteus.

Espero me puedan ayudar

Saludossss......

Usa el software Virtual Serial Port es un porgrama para crear puertos virtuales o COM virtuales...googlea para encontrarlo
saludos
 
hola, alguien sabe que ventaja o desventaja tiene usar un ciclo infinito como while(true) comparado con un label - goto label?
Gracias y saludos
En un caso como ese la única diferencia es estética. La legibilidad no cambia gran cosa y el código generado es el mismo.

En general, un código sin goto es más legible que con goto. Pero la elegancia y limpieza de un código pasa lejos más por la habilidad del programador que por si usa goto.

La verdadera razón por la que no conviene el goto, es porque al no poder determinar el compilador el orden en que se ejecutan las instrucciones (porque se salta de cualquier lado a cualquier lado), le fracasan los criterios de optimización.
 
Hola, estoy intentado realizar un menu con lcd, pero evidentemente tengo un error en la estructura de seleccion, simulandolo en proteus se ve bien el primer menu y entra a la funcion op1, pero cuando presiono "abajo" (el siguiente menu) nunca pasa y se queda trabado. Alguien puede aclararme en donde metí la pata?
Soy nuevo en el ccs, antes programaba en picbasic y este menu lo habia hecho en 15 minutos con basic...y funcionaba perfecto, sin embargo la estructura de c se la ve mas ordenada, espero no haberme equivocado en el cambio.
Gracias

Código:
#include <16f628a.h>
#use delay(clock=4000000)
#fuses nowdt,nomclr,intrc
#define use_portb_lcd TRUE
#include <lcd.c>

void op1(VOID);
void op2(void);
void op3(void);

void main(){

  lcd_init();
  int1 b1;
  b1=1;

  set_tris_a(0b0000111);
  set_tris_b(0x00);
  
 
 do{
                        
    switch (b1){
                  case 1: 
                         printf(lcd_putc,"\f* Opcion 1\n  Opcion 2");
                         delay_ms(100);
                         if (input(pin_a0)==0) b1=b1+2;
                         if (input(pin_a1)==0) op1();
                         if (input(pin_a2)==0) b1=b1+1;
                       
                         break;
                  case 2: 
                         printf(lcd_putc,"\f  Opcion 1\n* Opcion 2");
                         delay_ms(100);
                         if (input(pin_a0)==0) b1=b1-1;
                         if (input(pin_a1)==0) op2();
                         if (input(pin_a2)==0) b1=b1+1;
                         
                        break; 
                  case 3: 
                        printf(lcd_putc,"\f  Opcion 2\n* Opcion 3");
                        delay_ms(100);
                         if (input(pin_a0)==0) b1=b1-1;
                         if (input(pin_a1)==0) op3();
                         if (input(pin_a2)==0) b1=1;
                         
                       break;
}
 }while(1);
 
}

void op1(){
           
           printf(lcd_putc,"\fEsta es la Op 1");
        delay_ms(2000);
   }


void op2(){
           printf(lcd_putc,"\fEsta es la Op 2");
        delay_ms(2000);
   }

void op3(){
           printf(lcd_putc,"\fEsta es la Op 3");
        delay_ms(2000);
   }
 
A la variable b1 la tenés declarada como bit (int1) ==> Jamás podrá tomar valores como 2 y 3. Cuando hacés el primer b1=b1+1 el resultado es 0.

Además revisá lo que hacés en el switch caso 1, porque si pin_a0 y pin_a2 están en 1 ==> si b1 estuviera bien declarada pasaría a valer 4.



PD.
Esos b1=b1+1,b1=b1-1 y b1=b1+2 son muy de Basic. Por favor, en C usá b1++ , b1-- y b1+=2 :)
 
Última edición:
A la variable b1 la tenés declarada como bit (int1) ==> Jamás podrá tomar valores como 2 y 3. Cuando hacés el primer b1=b1+1 el resultado es 0.

Además revisá lo que hacés en el switch caso 1, porque si pin_a0 y pin_a2 están en 1 ==> si b1 estuviera bien declarada pasaría a valer 4.

Uy que abriboca, tenes toda la razon Eduardo, lo que paso fue que al comienzo pense hacerlo con banderas, despues cambie de idea y esa variable quedo mal definida, Gracias ademas por recordarme lo de los incrementos, es que no estaba bien seguro se era b++ o ++b, asi que lo puse del modo mas basio para ver funcionameinto, sin embargo en lugar de incrementar ahora puse directamente los valores de los case, es decir if (input(pin_a2)==0) b1=2; y asi. Solo le faltaria agragarle unos antirrebote a los pulsadores y quedaria aceptable.
Ey Eduardo mil gracias por notarme mi error y los consejos. :apreton:
Gran saludo.(y)
 
Buen día amigos, les cuento que he avanzado en el manejo del pi16f877 y controlar motores
pero ahora tengo un problem con el envio y recepción de datos del puerto serie, el problema se me presenta en el archivo input.c

no se que es lo que pasa!!!

si me pueden ayudar, les agradeceré infinitamente....

Saludos.........
 
Bueno amigos, no he podido solucionar el problema, acá dejo el proyecto completo así como el circuito en Proteus, espero me puedan ayudar, ya que me interesa recibir y enviar datos por el puerto rs232, espero su ayuda...

saludos.....
 

Adjuntos

  • ENCIENDE_ULN2803_DB9.rar
    99.6 KB · Visitas: 113
Hola, a ver si pueden ayudarme con este programa que ya me tiene loco. No logro que compile, me da un error en la libreria de lcd.c diciendo que no sabe lo que es la instruccion delay_ms() lo cual es muy raro. Espero puedan ayudarme.

Saludos

Código:
#include <16F628.h>
#include <lcd.c>
#use delay (clock=4000000)
#fuses NOMCLR, NOWDT, NOPROTECT
#byte PORTB = 0x06
#byte TRISB = 0x86

//lcd_gotoxy(1,1);
//            printf(lcd_putc, "HOLA");

int SENSOR;
int32 TAPADO;
int32 LIBRE;

VOID main(VOID){
TRISB = 0b00000001;
PORTB = 0;
SENSOR, LIBRE, TAPADO = 0;
init_lcd();

         WHILE (1){

         IF(input(PIN_B0)==0){
            
            IF(SENSOR==0){
               ++TAPADO;
               SENSOR = 0;
            }
         
            IF(SENSOR==1){
               TAPADO, LIBRE = 0;
               SENSOR = 0;
            }
         }
/////////////////////////////////////////////////////////////////////////// E(input(PIN_B1)
         IF(input(PIN_B0)==1){
         
            IF(SENSOR==0){
               LIBRE,TAPADO = 0;
               SENSOR = 1;
            }
            
            IF(SENSOR==1){
               ++LIBRE;
               SENSOR = 1;
            }
         }
///////////////////////////////////////////////////////////////////////////         
         IF(LIBRE>=50000){
            output_high(PIN_B1);
             
         }
         IF(LIBRE<50000){
            output_low(PIN_B1);
         }
         
         
         IF(TAPADO>=100000){
            output_high(PIN_B2);
         }
         IF(TAPADO<100000){
            output_low(PIN_B2);
         }
         }
}
 
Estás declarando el clock para calcular los retardos (#use delay (clock=4000000)) después de #include <lcd.c>

Otro error es cuando llamás a init_lcd() ==> la rutina se llama lcd_init()
 
Hola amigos!!, como les habia planteado con anterioridad el problema que tengo es similar al de dragondgold solo que mi problema es con el método getc() que me da error al compilarlo y abre el archivo input.c cuando lo hago y señala el metodo, no se que hacer:unsure:

espero sus ayuda

saludos...
 
Hola amigos!!, como les habia planteado con anterioridad el problema que tengo es similar al de dragondgold solo que mi problema es con el método getc() que me da error al compilarlo y abre el archivo input.c cuando lo hago y señala el metodo, no se que hacer:unsure:
espero sus ayuda
saludos...
Empezá ayudando vos ==> Al código lo dejaste lleno de líneas anuladas (con // ) y parece que esperás que la gente se tome el trabajo de descifrar cuáles líneas son de prueba y cuales no.
Tampoco está claro como es el comando que hay que escribir en el Terminal.

Lo único que salta a la vista es que tenés invertida RX-TX entre COMPIM y el MAX232 y estás cortocircuitando la salida R1OUT con el TX del Terminal.
 
Hola, bueno gracias a Eduardo pude avanzar muchísimo en mi proyecto. Les vengo con un planteo que no pude solucionar. Les comento un poco para que entiendan. El programa es un sensor para una cosechadora que debe detectar cuando no hay mas semillas y cuando se tapo la salida. Utilizo un emisor infrarrojo a 38KHz y su respectivo receptor para que de acuerdo a si el rayo se corta del todo o nunca es cortado sepa si no hay semillas o si se tapo la salida. el problema es que uso 8 sensores y para ello creo 8 registros en la RAM llamados sensores, TAPADO y LIBRE. Incremento una variable que me provoca un incremento en los registros ya que uso matrices. El problema es que necesito incrementar también el pin que testea la señal PIN_B0 incrementarlo a PIN_B1 por ejemplo, para ello utilice una matriz que incrementando el valor me va colocando los diferentes pines, pero no funciona cuando lo simulo y no se por que pueda ser. Les dejo el programa y la simulación a ver si me pueden dar una mano.

Saludos y gracias!!

Código:
//0 = OBJETO            1 = NADA 
#include <16F877A.h>
#use delay (clock=4000000)
#include <lcd.c>
#fuses XT, NOWDT, NOPROTECT
#byte PORTB = 0x06
#byte TRISB = 0x86
/////////////////////////////////////////////////////////////
int SENSOR[];
int32 TAPADO[];
int32 LIBRE[];
int DY[];
int PIN[] = (PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7); 
int s = 1;
/////////////////////////////////////////////////////////////
VOID main(VOID){
TRISB = 1;
PORTB = 0;
SENSOR, LIBRE, TAPADO = 0;
lcd_init();
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
         WHILE (1){

         IF(input(PIN[s])==0){
            
            IF(SENSOR[s]==0){
               ++TAPADO[s];
               SENSOR[s] = 0;
            }
         
            IF(SENSOR[s]==1){
               TAPADO[s], LIBRE[s] = 0;
               SENSOR[s] = 0;
            }
         }
/////////////////////////////////////////////////////////////////////////// 
         IF(input(PIN[s])==1){
         
            IF(SENSOR[s]==0){
               LIBRE[s],TAPADO[s] = 0;
               SENSOR[s] = 1;
            }
            
            IF(SENSOR[s]==1){
               ++LIBRE[s];
               SENSOR[s] = 1;
            }
         }
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
         IF(LIBRE[s]>=5000){
            
            lcd_gotoxy(1,1);
            printf(lcd_putc, "SIN SEMILLAS");
            lcd_putc('\n');
            printf(lcd_putc, "BOCA:%u",s);
            DY[0]=0;
                               }
         IF(LIBRE[s]<5000){
            
            IF(DY[0]==0){
            lcd_putc('\f');
            lcd_gotoxy(1,1);           
            printf(lcd_putc, "OK");
            DY[0]=1;
            }
         }
        
//////////////////////////////////////////////////////////////////////////      
         IF(TAPADO[s]>=5000){
            
            lcd_gotoxy(1,1);
            printf(lcd_putc, "TAPADO");
            lcd_putc('\n');
            printf(lcd_putc, "BOCA:%u",s);
            DY[1]=0;
                     }
         IF(TAPADO[s]<5000){
            
             IF(DY[1]==0){
            lcd_putc('\f');
            lcd_gotoxy(1,1);           
            printf(lcd_putc, "OK");
            DY[1]=1;
             }
                     }
         }

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

           
}
 

Adjuntos

  • Simulacion.rar
    16.2 KB · Visitas: 80
hola q tal como estan!!! los aportes q estan dando al foro estan increibles... me he alejado un poco del foro por algunos motivos de ocupacion...
Les cuento q todavia sigo con el problema de las interrupciones... q noc como utilizarlas... en que momento activalarlas y desactivarlas... noc si me puedan ayudar... explicarme como mismo funcionan... pero plis paso a paso para poder entender bien...
Gracias...
 
Esto está mal declarado:
Código:
/////////////////////////////////////////////////////////////
int SENSOR[];
int32 TAPADO[];
int32 LIBRE[];
int DY[];
int PIN[] = (PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7); 
int s = 1;
/////////////////////////////////////////////////////////////
No estás declarando el tamaño de los vectores ==> Como suponés que va a saber acomodarlos? Solamente en PIN[] se puede saber el tamaño. Un compilador no es una madre...
Debería saltar error durante la compilación, pero no lo hace (bug). Te termina asignando 1 byte a todos, y cuando escribís DY[1] le escribe encima a PIN[]

También está mal la sintaxis, es:
int PIN[8] = {PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7};

Los índices de los vectores empiezan en 0, y vos empezás con s=1.

Tampoco incrementás "s" en ningún lado.
 
Bueno, el incremento de s lo elimine por ahora porque era una etapa de prueba lo de los {} en ves de () en la variable PIN me di cuenta después, error mio. De acuerdo con lo que mencionas de no colocar ningún numero para asignar la cantidad de variables dentro de PIN, según mi libro de C si no coloco nada el compilador me toma la cantidad de variables de acuerdo a la cantidad de valores que yo le asigne entre los {}. Anoche lo analice un poco mas y fui descubriendo errores, gracias nuevamente por la ayuda prestada en cuanto lo tenga armado y funcionando lo posteo.

Saludos y muchísimas gracias!!
 
Atrás
Arriba