Autor Tema: Ayuda con programa  (Leído 3211 veces)

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

Desconectado esantunez

  • PIC10
  • *
  • Mensajes: 2
Ayuda con programa
« 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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Ayuda con programa
« Respuesta #1 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. Muchas gracias.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado esantunez

  • PIC10
  • *
  • Mensajes: 2
Re: Ayuda con programa
« Respuesta #2 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.


Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con programa
« Respuesta #3 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.
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con programa
« Respuesta #4 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
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ayuda con programa
« Respuesta #5 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              
« Última modificación: 17 de Junio de 2009, 21:37:47 por dogflu66 »
Saludos desde Granada, España.


 

anything