Autor Tema: bloqueado en mi primer proyecto  (Leído 3293 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
bloqueado en mi primer proyecto
« en: 25 de Marzo de 2008, 11:03:28 »
saludos a todos, este es mi primer proyecto con pic y c, se trata de un secuencidor de arranque para aparatos electronicos,quisiera que fuera encendiendose del primero al ultimo cuando se genera 1 en A0 y se quedara todo encendido, luego a la inversa cuando estuviera en 0 pero poder hacer la inversa en medio de la ejecucion del arranque , supongo que seria con una interrupcion,no tengo claro como funcionan ¿solo se pueden ejecutar en el puerto B? lo mas parecido que consigo a sido esto y no tiene mucho que ver

#include <16f877a.h>           //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(a)                //Optimizamos E/S A
#use fast_io(b)                //Optimizamos E/S B 
#byte portb = 0x6              //Direccion PORTB
#byte porta = 0x5              //Direccion PORTA

void arranque()                // funcion arranque
{

      portb = 0b00000001;
      delay_ms(500);
      portb = 0b00000011;
      delay_ms(500);
      portb = 0b00000111;
      delay_ms(500);
      portb = 0b00001111;
      delay_ms(500);
      portb = 0b00011111;
      delay_ms(500);
      portb = 0b00111111;
      delay_ms(500);
      portb = 0b01111111;
      delay_ms(500);
      portb = 0b11111111;

}
void emergencia()               // funcion emergencia
{
 portb = 0b00000000;
}
void apagado()                  // funcion apagago
{
      portb = 0b11111110;
      delay_ms(500);
      portb = 0b11111100;
      delay_ms(500);
      portb = 0b11111000;
      delay_ms(500);
      portb = 0b11110000;
      delay_ms(500);
      portb = 0b11100000;
      delay_ms(500);
      portb = 0b11000000;
      delay_ms(500);
      portb = 0b10000000;
      delay_ms(500);
      portb = 0b00000000;
}
void fijo()
{
portb = 0b11111111;
}

void main()
{

  set_tris_b(0b00000000);         // PORTB salida
  set_tris_a(0b11111111);         // PORTA entrada

 do {
if (input(PIN_A0))
  arranque(),sleep();
  else
  emergencia();


}while (true);

}


Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: bloqueado en mi primer proyecto
« Respuesta #1 en: 25 de Marzo de 2008, 11:25:13 »
antes que nada bienvenido al foro!!  8)
aparentemente el código está bien (a grandes razgos, no entiendo mucho éste lenguaje, pero es bastante gráfico. yo programo en assembler)
....  necesito que me pases el circuito electrico y chequeo que esté todo en orden.
saludos.
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: bloqueado en mi primer proyecto
« Respuesta #2 en: 25 de Marzo de 2008, 11:55:04 »
Hola,

El problema que veo, es que estas cerrando el proceso una vez, que detecta el pin.

Lo que te recomendaria es algo como esto:
Código: C
  1. #include <16f877a.h>           //PIC utilizado
  2. #fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos fuses
  3. #use delay (clock=4000000)     //Oscilador a 4Mhz
  4. #use fast_io(a)                //Optimizamos E/S A
  5. #use fast_io(b)                //Optimizamos E/S B
  6. #byte portb = 0x6              //Direccion PORTB
  7. #byte porta = 0x5              //Direccion PORTA
  8.  
  9. int i;
  10.  
  11. void izquierda(){
  12.       if (i < 8){
  13.       #asm
  14.         bsf 03,0;//STATUS,C
  15.         RRF portb,1
  16.       #endasm    
  17.       i++;
  18.       delay_ms(500);}
  19. }
  20.  
  21. void derecha(){
  22.       if (i > 0){
  23.        #asm
  24.            bcf 03,0;//STATUS,C
  25.            RLF portb,1
  26.       #endasm    
  27.       i--;
  28.       delay_ms(500);}
  29. }
  30.  
  31. void main()
  32. {
  33.   i=0;
  34.   set_tris_b(0b00000000);         // PORTB salida
  35.   set_tris_a(0b11111111);         // PORTA entrada
  36.  
  37.   portb=0;
  38.  do {
  39.       if (input(PIN_A0))
  40.         derecha();
  41.       else
  42.         izquierda();
  43.  
  44.       }while (true);
  45. }

Disculpa la parte en asm, pero no encontre una forma mas facil de hacerlo.

Saludos,

Y@el
PD: Puedes simular esto usando los siguiente archivos prueba.zip
« Última modificación: 25 de Marzo de 2008, 11:58:19 por Y@el »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: bloqueado en mi primer proyecto
« Respuesta #3 en: 25 de Marzo de 2008, 11:59:24 »
Hola tinho:

Tienes tres opciones, la primera como haz dicho, por interrupción en cambio de una de las patas del pic, pero esta interrupción, solo está en el puerto B.

La segunda opción, que lo hagas por el RA4 por medio del Timer0 ya que lo puedes configurar que cuente pulsos, así, cuando cambia de estado, ya que ingresa un pulso, se crea una interrupción y la atiendes, pero con este método, solo deberás usar un pulsador y no un iterruptor como en el circuito original.

Como tercera opción, chequea el pin RA0 entre cada delay_ms(500); si es cero, sale de esa rutina y apaga todo y si aún es 1, continua con los demás pines del puerto b.

Si no me expliqué bien, decimelo que te lo vuelvo a explicar.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #4 en: 25 de Marzo de 2008, 12:12:00 »
intento responder a una y lla tengo otra soys rapidos e probado tu archivo Y@el muchas gracias el problema es que solo simulas ya te empieza la ejecucion de apagado y esta solo se tendria que poder realizar una vez aya iniciado el encendido pero me as dado una buena idea y la tercera opcion de leon pic me parece muy buena tambien gracias por vuestras respuestas

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #5 en: 25 de Marzo de 2008, 13:05:17 »
como podria hacer bien el chekeo del pin a estoy intentandolo con if else pero no me funciona demasiado bien

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: bloqueado en mi primer proyecto
« Respuesta #6 en: 25 de Marzo de 2008, 13:16:41 »
Yo tengo una seria discución con el CCS, estoy tratando de hacer las pases, pero no llegamos a ningún acuerdo.

Para hacerlo en assembler es así:

Código: ASM
  1. BSF           PORTB,0                   ;Pongo a 1 a RB0
  2.                  BTFSS       PORTA,0                   ;¿RA0 es 1?
  3.                  GOTO        EMERGENCIA            ;No, es 0. Voy a apagar los electrodomesticos
  4.                  CALL         DELAY_MS                ;Si, es 1. Voy al retardo de 500 ms, cuando termina el retardo, vuelvo a ca por medio del RETURN
  5.                  BSF           PORTB,1                   ;Pongo a 1 a RB1
  6.                  BTFSS       PORTA,0                   ;¿RA0 es 1?
  7.                  GOTO        EMERGENCIA            ;No, es 0. Voy a apagar los electrodomesticos
  8.                  CALL         DELAY_MS                ;Si, es 1. idem anterior.
  9.                  ......
  10.                  ......

Fijate que se repite hasta llegar a PORTB,7
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #7 en: 25 de Marzo de 2008, 13:28:03 »
jeje necesitamos paz en todos lados y mas entre el hombre y la maquina aunque en esto de la programacion em c llevo unas horas en pocos dias y lla me esta ganando ahora investigare y probare tu codigo assembler gracias, espero no hacerme pesado si no me sale 

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: bloqueado en mi primer proyecto
« Respuesta #8 en: 25 de Marzo de 2008, 14:52:02 »
Estimado Tinho,

Si lo que necesitas es la comprobacion de un Pin, puedes hacer lo siguiente
Código: C
  1. if (input_state(pin_A0) == 0 )   //Revisa el estado del pin PORTA.0
  2.  {
  3.   //Hace lo que coloques aca si vale 0
  4.   }
  5.   else
  6.  {
  7.   //Hace lo que coloques aca si vale 1
  8.   }

Por otro lado, no entiendo que es lo que quieres hacer, dejame explicarte lo que coloque el codigo que envie antes, ya que solo queria demostrarte que funcionaba, y segun veo lo hacia pero al reves.

Y lo unico que debes cambiar es:

Código: C
  1. if (input(PIN_A0))
  2.   derecha();
  3.   else
  4.   izquierda();

Por:

Código: C
  1. if (input(PIN_A0)==0)
  2.   derecha();
  3.   else
  4.   izquierda();

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #9 en: 25 de Marzo de 2008, 15:24:21 »
ahora estaba revisando tu codigo intentando hacer lo que me acabas de decir lo pruebo ensegida, el proyecto es un secuenciador de arranque concretamente para unos rack de amplificadores para sonido de directo me dedico al sonido e iluminacion, necesito que se arranquen de uno en uno,aunque es la primera fase del proyecto luego quiero poner un voltimetro con tres displays y poder elegir el tiempo de secuencia y un apagado por voltage bajo de ai la funcion de emergencia, en programacion no puedo ayudar mucho de momento llevo escasas horas pero si necesitais algo en sonido e iluminacion en lo que pueda aqui estoy.
me gustaria comprender donde haces que el valor de A0 pueda interrumpir la funcion en medio de su proceso ya sea izquierda o derecha, gracias

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #10 en: 25 de Marzo de 2008, 16:16:29 »
muchas gracias Y@el al final se a quedado en esto y funcionando, si observas algo mal o mejorable agradeceria la correccion ahora ya puedo pasar a la segunda fase


#include <16f877a.h>           //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(a)                //Optimizamos E/S A
#use fast_io(b)                //Optimizamos E/S B
#byte portb = 0x6              //Direccion PORTB
#byte porta = 0x5              //Direccion PORTA

int i;

void arranque(){           //funcion arranque
if (i < 8){                //condicion menor que 8
#asm
    bsf 03,0;              //pone el bit a 1     
    RLF portb,1            //rota a la izquierda por el puerto
#endasm
i++;                       //incrementa en 1
delay_ms(500);             //retardo elegido
}
}

void paro(){               //funcion parada
if (i > 0){                //condicion mayor que 8
#asm
    bcf 03,0;              //pone el bit a cero
    RRF portb,1            //rota a la derecha po el puerto
#endasm
i--;                       //decrementa en 1
delay_ms(500);             //retardo elegido
}
}
void emergencia()               // funcion emergencia
{
 portb = 0b00000000;            // todo el puerto a 0
}

void main()
{
  i=0;
  set_tris_b(0b00000000);         // PORTB salida
  set_tris_a(0b11111111);         // PORTA entrada

  portb=0;
 do {
if (input(PIN_A0))
  arranque();
  else
  paro();

}while (true);

}

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: bloqueado en mi primer proyecto
« Respuesta #11 en: 25 de Marzo de 2008, 19:05:06 »
Hola Tinho,

Lo que hago, no es interrumpir el proceso, solo que realiza solo un cambio  a la vez.

El programa funciona asi:

1.- setea TRISA y TRISB
2.- setea PORTB = 0
3.- Lee PORTA.0
4.- Si es 0, arranca
5.- Si es 1, para
6.- Salta a 4...

Arranca:
1.- mira si i <8 salta a 4
2.- rota el puerto B a la izquierda, tomando en cuenta que el acarreo es 1
2.- delay de 500ms
3.- return

Para:
1.- mira si i >0 salta a 4
2.- rota el puerto B a la derecha, tomando en cuenta que el acarreo es 0
2.- delay de 500ms
3.- return

Y con esto lo que consigo, es que en cada paso vaya a arranca o para, dependiendo del valor de PORTA.0,  Y como arranca o para, no son un bucle, sino una sola accion, esto hace que el programa te permita, seguir arrancando o parando, y no esperar a que todos prendan o apaguen.

Espero que esto sea entendible.

Saludos,

Y@el

Desconectado tinho

  • PIC10
  • *
  • Mensajes: 11
Re: bloqueado en mi primer proyecto
« Respuesta #12 en: 27 de Marzo de 2008, 09:31:38 »
te as explicado como un libro abierto muchas gracias, e investigado un poco como funcionan los dysplay para incorporarselo al codigo y solo consigo los caracteres definidos cuando los pongo de uno en uno los tres a la vez me parpadean o salen cosas diferentes, supongo que la culpa es del delay, he probado con todas las variables, poner catodo comun, anodo invertir los registros, o alomejor es mala configuracion del proteus algun consejo gracias,
 

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use  standard_io(C)
#use fixed_io(e_outputs=PIN_E0,PIN_E1,PIN_E2)

int a=1,b=1,c=1;


void main()
{
int dis7seg[10]={0b0000001,0b10011111,0x12,0x06,0x4C,0x24,0x3F,0x0F,0x00,0x04};

set_tris_c(0b00000000);

do{

output_low(PIN_E0);
output_low(PIN_E1);
output_high(PIN_E2);
delay_ms(5);
output_c(dis7seg[ a ]);
output_low(PIN_E0);
output_high(PIN_E1);
output_low(PIN_E2);
delay_ms(5);
output_c(dis7seg[ b ]);
output_high(PIN_E0);
output_low(PIN_E1);
output_low(PIN_E2);
delay_ms(5);
output_c(dis7seg[ c ]);
}while(TRUE);
}