TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: esantunez en 15 de Junio de 2009, 07:55:38

Título: Ayuda con programa
Publicado por: esantunez en 15 de Junio de 2009, 07:55:38
Hola a todos, soy nuevo en el el foro. Necesito una ayudita con un proyecto. Consiste en dos pulsadores, uno enciende un motor 15 minutos el otro una luz otros 15 minutos. Me he trabado en el programa cuando: enciendo por ejemplo el motor y esta funcionando, como hacer para que en cualquier momento encender la luz y funcione sus 15 minutos aparte. Acabo de empezar con la progracion en pic basic, asi que ando un poco perdido. Muchas gracias.
Título: Re: Ayuda con programa
Publicado por: RedPic en 15 de Junio de 2009, 10:02:11
Sé bienvenido a Todopic.

¿Te importaría poner el código que llevas escrito? Así tendríamos la oportunidad de ver qué es lo que has hecho y en qué podemos ayudarte.

De todas formas te ruego que leas (y apliques) las Reglas del Foro (http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1). Muchas gracias.
Título: Re: Ayuda con programa
Publicado por: esantunez en 15 de Junio de 2009, 12:22:39
He leido ya las reglas del foro.. ¿incumpli alguna?. Si es asi lo siento.
he aqui lo que ya he hecho, a ver si sirve de algo, pero no creo.

AllDigital

TRISA = %11111111
TRISB = %00000000

Symbol pulsa_motor = RA0
Symbol pulsa_luzuv = RA1
Symbol pulsa_apaga = RA2
Symbol pulsa_puerta1 = RA3
Symbol pulsa_puerta2 = RA4

Symbol motor = RB0
Symbol luzuv = RB1
Symbol puerta1 = RB2
Symbol puerta2 = RB3

Dim a As Word

empieza:
PORTB = 0

While pulsa_puerta1 = 1    'esto es un interlock de puertas, cuando se habre una puerta, acciona un pulsador que cierra la otra
                                        hasta que se cierra otra vez'
   puerta2 = 1
Wend

While pulsa_puerta2 = 1    ' lo mismo que antes en la otra puerta'
   puerta1 = 1
Wend

PORTB = 0

If pulsa_motor = 1 Then               'aqui empieza el lio, doy al pulsador para el motor; las puertas se bloquean, y el motor
   puerta1 = 1                          empieza a funcionar.  Mi problema es que como hago para que tenga la posibilidad de
   puerta2 = 1                          encender la luz (pulsa_luzuv) y funcione (luzuv) durante el tiempo programado sin parar el
   motor = 1                             el motor'
   WaitMs 5000
   
Endif

Goto empieza


Espero me haya explicado bien, y me sepan solucionar el problema. Muchas gracias.

Título: Re: Ayuda con programa
Publicado por: Suky en 15 de Junio de 2009, 13:47:30
Puedes detectar el accionamiento de los pulsadores con interrupciones por cambio de estado de RB4-RB7 y generar las demoras mediante los timers e interrupciones.
Título: Re: Ayuda con programa
Publicado por: KALLITOS en 16 de Junio de 2009, 15:09:35
Hola esantunez, ya te entendí.
En ese caso lo que haría es lo siguiente:

Arreglo una interrupcion de algun timer para que me de 1 segundo y me active un flag para cada uno y me avise del segundo transcurrido.
Activo la luz con un pulsador y el motor con otro pulsador (podrias ponerle un stop individual)
Entonces cuando activo una u otra salida sumo los avisos de cada flag que me de el timer hasta llegar al tiempo que desee, por ejemplo:

Código: QBasic/QuickBASIC
  1. IF pulsa_motor = 1 THEN
  2.    motor = 1
  3.    motor_encendido = 1
  4.    acumulador_motor = 0
  5. endif
  6.  
  7. IF pulsa_luzuv = 1 THEN
  8.    luzuv = 1
  9.    luzuv_encendido = 1
  10.    acumulador_luzuv = 0
  11. endif
  12.  
  13. IF apaga_motor = 1 THEN
  14.    motor = 0
  15.    motor_encendido = 0
  16. endif
  17.  
  18. IF apaga_luzuv = 1 THEN
  19.    luzuv = 0
  20.    luzuv_encendido = 0
  21. endif
  22.  
  23. IF motor_encendido = 1 THEN
  24.     IF flag_motor = 1 THEN
  25.         acumulador_motor = acumulador_motor + 1
  26.         IF acumulador_motor => "segundos a contar" THEN
  27.             motor = 0
  28.             motor_encendido = 0
  29.         ENDIF
  30.         flag_motor = 0
  31.     ENDIF
  32. ENDIF
  33.  
  34. IF luzuv_encendido = 1 THEN
  35.     IF flag_luzuv = 1 THEN
  36.         acumulador_luzuv = acumulador_luzuv + 1
  37.         IF acumulador_luzuv => "segundos a contar" THEN
  38.             luzuv = 0
  39.             luzuv_encendido = 0
  40.         ENDIF
  41.         flag_luzuv = 0
  42.     ENDIF
  43. ENDIF
Falta hacer el arreglo de interrupcion del timer para que te de 1 seg y en ella la activacion de los flags por separado y la declaracion de variables, eso te lo dejo de tarea  :)

Saludos
Título: Re: Ayuda con programa
Publicado por: dogflu66 en 17 de Junio de 2009, 21:29:45
'Prueba esto a ver si vale, no utiliza las interrupciones, no es muy exacto pero puede que sirva.
'se puede corregir el tiempo sustituyendo el WaitMs 1 por WaitUs xxx.

AllDigital
TRISA = %11111111
TRISB = %00000000

Symbol pulsa_motor = RA0
Symbol pulsa_luzuv = RA1
Symbol pulsa_apaga = RA2
Symbol pulsa_puerta1 = RA3
Symbol pulsa_puerta2 = RA4
Symbol motor = RB0
Symbol luzuv = RB1
Symbol puerta1 = RB2
Symbol puerta2 = RB3

Dim a As Word
'__Timer por soft
Dim tr_base As Byte  'Contador base timer
Dim tr_base_end As Byte  'Divisor de los timer
Dim tr1 As Byte  'Timer 1
Dim tr2 As Byte  'Timer 2
Dim tr3 As Byte  'Timer 3
Dim tr1_end As Byte  'Tiempo Timer1 mSeg * 100
Dim tr2_end As Byte  'Tiempo timer2 mSeg * 100
Dim tr3_end As Byte  'Tiempo timer3 mSeg * 100
tr_base_end = 100 'Paso de 100mSeg.
tr1_end = 50  'tr1 = 5Seg.
tr2_end = 10  'tr2 = 1Seg.
tr3_end = 10  'tr3 = 1Seg.
tr1 = tr1_end  'Stop timer
tr2 = tr2_end  'Stop timer
tr3 = tr3_end  'Stop timer
'__
main:
   PORTB = 0

   While pulsa_puerta1 = 1  'esto es un interlock de puertas, cuando se abre una puerta, acciona un pulsador que cierra la otra hasta que se cierra otra vez
      puerta2 = 1
   Wend

   While pulsa_puerta2 = 1  'lo mismo que antes en la otra puerta'
      puerta1 = 1
   Wend

   PORTB = 0

   If tr1 >= tr1_end Then  '___Codigo controlado por tr1
      If pulsa_motor = 1 Then  'aqui empieza el lio, doy al pulsador para el motor; las puertas se bloquean, y el motor
         tr1 = 0  'Activa timer
         puerta1 = 1  'empieza a funcionar. mi problema es que como hago para que tenga la posibilidad de
         puerta2 = 1  'encender la luz (pulsa_luzuv) y funcione (luzuv) durante el tiempo programado sin parar el
         motor = 1  'el motor
      Endif
   Endif  '___________________Fin codigo controlado por tr1
   
   Gosub control_timer  'Control timer
   
Goto main
End                                              
control_timer:  'Rutina base de tiempos o timer por soft
   WaitMs 1  'Establece la base patron
   tr_base = tr_base + 1  'Base control tr
   If tr_base >= tr_base_end Then  'Divide por tr_base_end
      If tr1 < tr1_end Then tr1 = tr1 + 1  'Control tr1
      If tr2 < tr2_end Then tr2 = tr2 + 1  'Control tr2
      If tr3 < tr3_end Then tr3 = tr3 + 1  'Control tr3
      tr_base = 0  'Inicializa el siguiente ciclo
   Endif
Return