desktop

Curso de programación de PIC en PICBasic Pro

Hola exactamente que no funciona, no lee el adc no se mueven los motores, no envia la señal serial? Especifica un poco, yo lo montaría en físico pero no cuento con un servo motor. Por lo tanto no tengo como saber que es lo que no funciona, tal vez mañana compre un servo para probar. Pero igual indícame que no te funciona.

PD: Cuales son las especificaciones de los servo motores que estas usando.

hola Reyvilla te cuento, los motores no se mueven probé con un frecuencimetro y los pics no dan señales de salida, cambie los pics y tampoco y los servos son HT500 HEXTRONIK no se que faltara a la hora de configurar los pics:(
te agradezco por estar ayudandome(y)
 
gracias ricbevi !! por el dato me sirvió de mucho, entiendo y hasta cuanto podría contar ò medir con
un pic16f628a en pbp?? gracias saludos
No recuerdo...deberias consultar la ayuda del PBP para el comando que uses pero seguramente no pasaras los 100Khz.
Saludos.

Ric.
 
hola Reyvilla te cuento, los motores no se mueven probé con un frecuencimetro y los pics no dan señales de salida, cambie los pics y tampoco y los servos son HT500 HEXTRONIK no se que faltara a la hora de configurar los pics:(
te agradezco por estar ayudandome(y)

Hola, me imagino que cuanto te refieres a frecuenciometro te refieres a osciloscopio o algo similar con lo cual puedas ver la señal de salida ya que no le veo el uso del frecuenciometro para ver la señal.
Por otro lado coloca el código que estas programando en los pics y coloca si puedes una imagen del circuito y el esquema para ver que es lo que esta sucediendo.
 
hola a todos de nuevo ando por estos lados con la molestadera, a ver les cuento un poco de historia hace ya casi 11 años tuve un accidente y estuve incapacitado 3 meses por lo cual tuve bastante tiempo para mi, así que me puse en la tarea de hacerme un frecuencimetro que tambien fuera capaz de contar pulsos o eventos y lo hice totalmente con tecnología TTL y aunque hoy día aun funciona perfectamente ya creo que está obsoleto y quiero hacerlo ahora con un pic en aquella época utilice para este fin la gran cantidad de integrados de 13 en total, 12 para contadores y divisores y un 74c925 para el control de los 4 display de cátodo común; ya hice un prototipo en proteus y escribí un programa, pero como suele pasar no me funciono como yo quiero, en frecuencimetro funciona perfectamente pero no en la función contador, se supone que en esta función debe ser capaz de contar los pulsos que lleguen a su entrada con la misma velocidad que entren pero esto no lo he podido conseguir, creo que lo mejor sería usar interrupciones pero no se como usarlas para este fin, aquí les subo los archivos para que los vean.

este era mi antiguo frecuencimetro
media frecuencias hasta de 100 MHz como verán ya se ve muy anticuado pero aun funciona perfectamente
estaré muy agradecido por su ayuda(y)
 

Adjuntos

  • frecuencimetro.rar
    31.7 KB · Visitas: 121
Última edición:
hola a todos de nuevo ando por estos lados con la molestadera, a ver les cuento un poco de historia hace ya casi 11 años tuve un accidente y estuve incapacitado 3 meses por lo cual tuve bastante tiempo para mi, así que me puse en la tarea de hacerme un frecuencimetro que tambien fuera capaz de contar pulsos o eventos y lo hice totalmente con tecnología TTL y aunque hoy día aun funciona perfectamente ya creo que está obsoleto y quiero hacerlo ahora con un pic en aquella época utilice para este fin la gran cantidad de integrados de 13 en total, 12 para contadores y divisores y un 74c925 para el control de los 4 display de cátodo común; ya hice un prototipo en proteus y escribí un programa, pero como suele pasar no me funciono como yo quiero, en frecuencimetro funciona perfectamente pero no en la función contador, se supone que en esta función debe ser capaz de contar los pulsos que lleguen a su entrada con la misma velocidad que entren pero esto no lo he podido conseguir, aquí les subo los archivos para que los vean.

este era mi antiguo frecuencimetro http://youtu.be/K1LhIJD8aQ8 media frecuencias hasta de 100 MHz como verán ya se ve muy anticuado pero aun funciona perfectamente
estaré muy agradecido por su ayuda(y)

Hola...te oriento en tu problema...no esperas el cambio de estado del pin a la hora de contar...no le indicaste al compilador que el "puertoa" sera usado de forma digital...no tienes cargada la entrada con una resistencia a GND para prevenir la entrada de señales espurias al estar siempre en alta impedancia.
Saludos.

Ric.
 
Hola...te oriento en tu problema...no esperas el cambio de estado del pin a la hora de contar...no le indicaste al compilador que el "puertoa" sera usado de forma digital...no tienes cargada la entrada con una resistencia a GND para prevenir la entrada de señales espurias al estar siempre en alta impedancia.
Saludos.

Ric.

Hola Ric gracias por mirar mi proyecto, ya hice lo que me dices pero igualmente sigue sin funcionar sera que habrá que usar un código basado en interrupciones? y sí es así como se haría las interrupciones no se como se usan tú me podrías ayudar?
 
Hola Ric gracias por mirar mi proyecto, ya hice lo que me dices pero igualmente sigue sin funcionar sera que habrá que usar un código basado en interrupciones? y sí es así como se haría las interrupciones no se como se usan tú me podrías ayudar?

@ferdy575 Observa las modificaciones que le realice a tú programa y mejora la representación del valor de los pulsos después de un reset....evidentemente se podía!!!.

Ric.
 

Adjuntos

  • Frecuencimetro1.zip
    18 KB · Visitas: 113
@ferdy575 Observa las modificaciones que le realice a tú programa y mejora la representación del valor de los pulsos después de un reset....evidentemente se podía!!!.

Ric.

Excelente te felicito funciona perfectamente te agradezco mucho, dime que función se obtiene cuando escribes:
repeat
until in = 0

y lo más importante donde la conseguiste.
 
Última edición:
Excelente te felicito funciona perfectamente te agradezco mucho, dime que función se obtiene cuando escribes:
repeat
until in = 0

y lo más importante donde la conseguiste.

Dicha instrucción o conjunto lo que hace es repetir lo que se encuentre después del "repeat" hasta que se cumpla la condición que enumera "until"...en este caso nada esperando a que cambie de estado bajo "int" después de haber detectado un alto en él..."conseguirlo"... LEE LA AYUDA que trae PBP que allí se encuentra descriptos los comando que soporta el compilador y como usarlos como ya te lo indique anteriormente.

Ric.
 
le puedes añadir proteccion antirrebotes en el pulsador como 20ms por ejemplo?

Proyecto2 pulsadores


Código:
;Proyecto con 2 pulsadores y 3 leds ; cuando es accionado P1(primer pulsador) se 
;enciende un led ubicado en RB2 durante un segundo,lo mismo pasa si se acciona 
;P2 con otro led ubicado en RB3 , pero si son accionados al mismo tiempo un 
;tercer led (RB4)parpadeara 5 veces duante 300mls se uitliza pic 16F877A.

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

;configuracion de pines 

led1 var portb.2               ;ubicacion del primer LED en RB2 del pic 16F877A 
led2 var portb.3               ;""""                        RB3
led3 var portb.4                ;""""""""""""""""""""       RB4
p1 var portb.0                  ;"""""""del primer pulsador RB0 """"""""""""
p2 var portb.1                  ;"""""""segundo pulsador   RB1
x var byte                      ;variable x con capacidad de 255


; lectura de pulsadores
inicio
if p1=0 then encender   ; pregunta si se acciono el pulsador 1 ir a encender
PAUSE 200
if p2=0 then encender1  ;  """ pulsadodor2 ir a encender 1
PAUSE 200
if (p1=0) AND (p2=0) then encender2  ; """"pulsador1 y pulsador2 ir a encender2
PAUSE 200
goto inicio                   ; crea un bucle cerrado


encender:                    ;rutina encender
high led1                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led1                ; apaga led
pause 1000
goto inicio                   ;ir a inicio

encender1:
high led2                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led2                ; apaga led
pause 1000
goto inicio 

encender2:
for x=0 TO 4           ; repite cinco veces 
high led3                ; enciende led 
pause 300                   ;espera 300mls
low led3                ; apaga led utilice comando low que cumple la misma 
                         ;funcion que toggle que cambia la configuracion
                         ;de un bit es decir si esta en ALTO LO PASA A BAJO
                         ;y viceversa
pause 300
NEXT                   ; SIGUIENTE HASTA QUE SE REPITE 5 VECES
goto inicio 
end                            ;fin del programa
 
Hola a todos.

Soy nuevo en esto, estoy haciendo un programa enciende apaga osea un pulsador en PICBasic Pro
y necesito una ayuda en el programa que he elaborado, díganme que instrucciones me faltan para lograrlo.
Estoy tratando de usar num para verificar las pulsaciones por PORTA.1

De antemano gracias por su apoyo :)
********************************************************************
Código:
LED1    var    portb.0        ;designamos LED1 al portb.0
boton    var    porta.1        ;designamos boton a porta.1
num    var BYTE
num=0
Pulsar

porta.1=num
IF boton=0 THEN    encender

GOTO    Pulsar

encender:

        IF boton=0 THEN    encender;espera que suelte boton
        PAUSE    200                ;pausa de 200 milisegundos para antirrebotes
        HIGH    LED1            ;encendemos LED1
        num=2                       ;no estoy seguro si esto debe ir 
        IF num=2 THEN apagar ;contabiliza dos pulsaciones y va a apagar
apagar
        LOW        LED1

GOTO    Pulsar

END
 
Última edición por un moderador:
Hola a todos.

Soy nuevo en esto, estoy haciendo un programa enciende apaga osea un pulsador en PICBasic Pro
y necesito una ayuda en el programa que he elaborado, díganme que instrucciones me faltan para lograrlo.
Estoy tratando de usar num para verificar las pulsaciones por PORTA.1
Te hace falta especificar que PIC estás usando, aparte así como está tu programa no lograrás ver que pase algo.
Todo sería tan rápido que no alcanzarías a ver cuando el LED se encienda.
¿Por qué?
Porque tu mismo le das valor a la variable num, y luego comparas con el mismo valor asignado.
Asignas a num el valor 2
Entonces este "If num = 2 Then encender" sale sobrando, ya que num siempre será 2
A soltar el botón haces una pausa de 200ms y prendes el LED,
pero inmediatamente después de la comparación, como num es 2, lo apagas, por eso no notarias el cambio.

Si lo único que quieres hacer es prender y apagar un LED, puedes usar la instrucción "Toggle"
Algo así...
Código:
Pulsar:
    If boton = 0 Then Encender
    GoTo Pulsar

Encender:
    If boton = 0 Then Encender
    Toggle LED1
    GoTo Pulsar
Explícanos bien ¿para que quieres contar las pulsaciones?

Saludos.
 
Última edición:
buenas noches amigos por favor les pido podrían ayudarme con este proyecto. se trata de una red de suministro de agua automatizada.
la misma posee :
sensores de flujo (sensor hall, salida cuadrada, 0 y 1, 0v y 5v)
sensor de nivel (sensor ultrasónico hc-sr04)
pic16f877a
comunicación serial inhalambrica entre pic y pic, (transceiver kyl-210)
comunicación serial entre pc (visual basic) y pic
electroválvulas 12vdc
entre otros..

en principio pensaba utilizar 3 pic16f877a;
uno para el control y monitoreo de sensores válvulas... recibir y enviar información inalámbricamente por su puerto serial portc.6 y portc.7..con el transceiver kyl-210.
otro para recibir y enviar información por el puerto serial portc.6 y portc.7 inalámbricamente igual con otro kyl-210... este a su vez activaría alguno pines entre 1 y 0 los cuales se conectaban a un tercer pic.
este tercer pic, según el estado de los pines enviaba o recibia información a o desde la pc igualmente por su puerto serial portc.6 y portc.7 en un programa en visual basic donde se visualizara todo el proceso..
otro para recibir esa información...

este simulando, me funcionaba , si se puede decir bien. los tres pic y visual basic se comunicaba bien..

pero me entere que se puede enviar y recibir datos por cualquier pin del pic. entonce decidi reducir la cantidad de pic a 2.

aquí fue donde comezo todo el problema!
no he podido comunicar los 2 pic inhalambricamente. ya que uno de ellos se comunicara al pc por su puerto serial portc.6 y portc.7, y también se comunicara con el otro pic mediante el transceiver kyl-210 pero a otros pin cualquiera del pic (ya he probado varios y nada). y el otro pic solo se conecta al kly-210 ademas de los sensores y válvulas.
puedo observar por que los kyl-210 tiene luces para tx y rx. y si están enviando y recibiendo (pero al parecer no en el mismo idioma) y lo pruebo conectando el otro kyl-210 a la pc por rs-232 y con un programa que es para probar los mismos, y me envía caracteres muy diferentes a lo que quiero que envie o reciban..

aquí los códigos:
Código:
'pic conectado a pc y a kyl-210

INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISB = %11101111 ' Configuración el Puerto A
TRISD = %00000000 ' Configuración el Puerto B
TRISC = %10101111
SENSOR1 VAR BYTE
SENSOR2 VAR BYTE
SENSOR3 VAR BYTE
SENSOR4 VAR BYTE
TX VAR PORTC.6
RX VAR PORTC.7
B0  VAR BYTE
A VAR BYTE
A = 1
B VAR BYTE
B = 2
C VAR BYTE
C = 3
D VAR BYTE
D = 4
E VAR BYTE
E = 5
F VAR BYTE
F = 6
G VAR BYTE
G = 7
H VAR BYTE
H = 8
PORTD = %11111111 ' Inicializa el puerto "D".
PORTB = %00001000

INICIO:
   
   SERIN RX,T9600,2000,SENSAR,B0     'RECIBE DESDE VISUAL BASIC
   if B0 = "1" THEN CALL purga1            'SI ES 1 LLAMA A PURGAR TUBERIA 1
   IF B0 = "2" THEN CALL purga2
   IF B0 = "3" THEN CALL purga3
   IF B0 = "4" THEN CALL purga4
   IF B0 = "5" THEN                              'SI ES 5,PIDE INFORMACION DE LOS SENSORES, 
   CALL SENSORUNO                           'LLAMA A SENSOR 1
   PAUSE 1000
   CALL SENSORDOS
   PAUSE 1000
   CALL SENSORTRES
   PAUSE 1000
   CALL SENSORCUATRO
   PAUSE 1000
   ENDIF
   GOTO INICIO
   END

SENSAR:
   CALL SENSORUNO
   PAUSE 100
   CALL SENSORDOS
   PAUSE 100
   CALL SENSORTRES
   PAUSE 100
   CALL SENSORCUATRO
   PAUSE 100
   GOTO INICIO
   
purga1:
  LOW PORTD.0               'ESTO SOLO SON LEDS PARA VERIFICAR EL FUNCIONAMIENTO
  PAUSE 250
  SerOut PORTB.4,T9600,["X",A]  'ENVIA EL COMANDO PARA HACER PURGA
  PAUSE 500
  HIGH PORTD.0              'ESTO SOLO SON LEDS PARA VERIFICAR EL FUNCIONAMIENTO
  RETURN

purga2
  LOW PORTD.1
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",B]
  PAUSE 500
  HIGH PORTD.1
  RETURN

purga3:
  LOW PORTD.2
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",C]
  PAUSE 500
  HIGH PORTD.2
  RETURN

purga4:
  LOW PORTD.3
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",D]
  PAUSE 500
  HIGH PORTD.3
  RETURN
   
SENSORUNO:
   low PORTD.4          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   SEROUT PORTB.4,T9600,["X", E]  'ENVIA POR PORTB.4, KYL-210, PIDE INFO DE SENSOR1
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR1   'ESPERA POR EL PORTB.5 CONECTADO AL KYL-210                                                       'RESPUESTA  DEL SENSOR 1 EN EL OTRO PIC
   PAUSE 100
   SEROUT TX,T9600,[SENSOR1]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
   PAUSE 100
   HIGH PORTD.4                          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   RETURN
   
SENSORDOS:
   low PORTD.5
   SEROUT PORTB.4,T9600,[6]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR2
   PAUSE 100
   SEROUT PORTB.4,T9600,[SENSOR2]
   PAUSE 100
   HIGH PORTD.5
   RETURN
   
SENSORTRES:
   low PORTD.6
   SEROUT PORTB.4,T9600,[7]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR3
   PAUSE 100
   SEROUT TX,T9600,[SENSOR3]
   PAUSE 100
   HIGH PORTD.6
   RETURN
   
SENSORCUATRO:
   low PORTD.7
   SEROUT PORTB.4,T9600,[8]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR4
   PAUSE 100
   SEROUT TX,T9600,[SENSOR4]
   PAUSE 100
   HIGH PORTD.7
   RETURN    

   END

Código:
'Pic conectado a kyl-210, sensores y válvulas

INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISA = %111111
TRISB = %11111111 ' Configuración el Puerto A
TRISD = %00000000 ' Configuración el Puerto B
TRISC = %10111000
ADCON0 = %00000000
ADCON1=7
TX VAR PORTC.6
RX VAR PORTC.7
B0  VAR BYTE
SENSOR1 VAR BYTE
SENSOR2 VAR BYTE
SENSOR3 VAR BYTE
SENSOR4 VAR BYTE
FRECUENCIA1 VAR BYTE
FRECUENCIA2 VAR BYTE
FRECUENCIA3 VAR BYTE
FRECUENCIA4 VAR BYTE
e var byte
f var byte
g var byte
h var byte
PORTA = %000000
PORTD = %00000000 ' Inicializa el puerto "B".
PORTB = %00000000
PORTC = %00000000

INICIO:
   IF PORTC.3 = 1 THEN CALL MANUAL 'uso manual
   IF PORTC.4 = 1 THEN CALL RecibeRF  'automatico
   PAUSE 100
   GOTO INICIO
   END
MANUAL:   
   IF PORTB.0 = 1 THEN CALL purga1
   IF PORTB.1 = 1 THEN CALL purga2
   IF PORTB.2 = 1 THEN CALL purga3
   IF PORTB.3 = 1 THEN CALL purga4
   PAUSE 100
   RETURN
   
RecibeRF:
   PAUSE 250
   HIGH PORTD.7    'solo para verificar funcionamiento
   SERIN RX,T9600,["X"],B0    'recibe comando guarda en B0 y elije 
   if B0 = 1 THEN CALL purga1    'para purgar tubería principal
   IF B0 = 2 THEN CALL purga2
   IF B0 = 3 THEN CALL purga3
   IF B0 = 4 THEN CALL purga4
   IF B0 = e THEN CALL SENSORUNO  'para sensar en el sensor 1
   IF B0 = f THEN CALL SENSORDOS
   IF B0 = g THEN CALL SENSORTRES
   IF B0 = h THEN CALL SENSORCUATRO
   LOW PORTD.7
   RETURN

SENSAR:
   CALL SENSORUNO
   PAUSE 100
   CALL SENSORDOS
   PAUSE 100
   CALL SENSORTRES
   PAUSE 100   
   CALL SENSORCUATRO
   PAUSE 100
   GOTO INICIO
     
purga1:
    portd.0 = 1 'CIERRA V1 
    pause 1000
    portd.1 = 1 'ABRE V2
    pause 1000
    portc.0 = 1 'ENCIENDE BOMBA 
    pause 10000  'TIEMPO QUE DURA BOMBA ENCENDIDA(MODIFICABLE), SI LA PRESION AUMENTA SE APAGA AUTOMATICAMENTE LA BOMBA! 
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.1 = 0 'ABRE V1
    pause 1000
    portd.0 = 0 'CIERRA V2
    pause 1000
    goto inicio
purga2:
    portd.2 = 1 'CIERRA V3
    pause 1000
    portd.3 = 1 'ABRE V4
    pause 1000
    portc.0 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.2 = 0 'ABRE V3
    pause 1000
    portd.3 = 0 'CIERRA V4
    pause 1000
    goto inicio
purga3:
    portd.4 = 1 'CIERRA V5 
    pause 1000
    portd.5 = 1 'ABRE V6
    pause 1000
    portd.5 = 0
    portc.0 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.4 = 0 'ABRE V5
    pause 1000
    portc.1 = 1 'CIERRA V6
    pause 1000
    portc.1 = 0
    goto inicio    
purga4:
    portd.6 = 1 'CIERRA V7 
    pause 1000
    portd.7 = 1 'ABRE V8
    pause 1000
    portd.7 = 0
    portc.1 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.1 = 0 'APAGA BOMBA
    pause 1000
    portd.6 = 0 'ABRE V7
    pause 1000
    portc.2 = 1 'CIERRA V8
    pause 1000
    portc.2 = 0
    goto inicio

SENSORUNO:   
   count PORTB.4,2000,SENSOR1   ' cuenta la salida del sensor 1 y guarda
   FRECUENCIA1 = SENSOR1/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA1]  'envía respuesta al otro pic por kyl-210
   RETURN
SENSORDOS:   
   count PORTB.5,2000,SENSOR2 
   FRECUENCIA2 = SENSOR2/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA2]
   RETURN
SENSORTRES:   
   count PORTB.6,2000,SENSOR3 
   FRECUENCIA3 = SENSOR3/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA3]
   RETURN
SENSORCUATRO:   
   count PORTB.7,2000,SENSOR4 
   FRECUENCIA4 = SENSOR4/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA4]
   RETURN
     
   end
por favor me podrian decir que estoy haciendo mal???
el serin y serout desde otro pin del pic funciona igual?
o cuales tengo que utilizar?? serin2, serout2, hserin, hserout, debug, debugin??? y si me pueden decir como seria???

y otra consulta como desactivo el conversor a/d del pic16f877a??? necesito esos pines como entradas y salidas, pa los sensores de nivel (hc-sr04), que aun no incluyo en programación.

por favor ayúdenme no ignoren este mensaje ni lo borren.. por favor... solo necesito una ayudadita de ustedes los expertos..
 
Última edición por un moderador:
Te hace falta especificar que PIC estás usando, aparte así como está tu programa no lograrás ver que pase algo.
Todo sería tan rápido que no alcanzarías a ver cuando el LED se encienda.
¿Por qué?
Porque tu mismo le das valor a la variable num, y luego comparas con el mismo valor asignado.
Asignas a num el valor 2
Entonces este "If num = 2 Then encender" sale sobrando, ya que num siempre será 2
A soltar el botón haces una pausa de 200ms y prendes el LED,
pero inmediatamente después de la comparación, como num es 2, lo apagas, por eso no notarias el cambio.

Si lo único que quieres hacer es prender y apagar un LED, puedes usar la instrucción "Toggle"
Algo así...
Código:
Pulsar:
    If boton = 0 Then Encender
    GoTo Pulsar

Encender:
    If boton = 0 Then Encender
    Toggle LED1
    GoTo Pulsar
Explícanos bien ¿para que quieres contar las pulsaciones?

Saludos.
Gracias por el aporte (Toggle cambio el estado de led1 ) buena ;-)
el programa salio así le añadi 200ms para los rebotes funciona , quisiera contar las pulsaciones en porta para manejar 3 salidas en portb en con un solo pulsador obviamente

gracias por el aporte me ayudo muchísimo.
Código:
LED1    var    portb.0        ;designamos LED1 al portb.0
boton    var    porta.1        ;designamos boton a porta.1


Pulsar:
    If boton = 0 Then Encender
    GoTo Pulsar

Encender:
    If boton = 0 Then Encender
    PAUSE 200
    Toggle LED1
    GoTo Pulsar
 
Última edición por un moderador:
buenas noches amigos por favor les pido podrían ayudarme con este proyecto. se trata de una red de suministro de agua automatizada.
la misma posee :
sensores de flujo (sensor hall, salida cuadrada, 0 y 1, 0v y 5v)
sensor de nivel (sensor ultrasónico hc-sr04)
pic16f877a
comunicación serial inhalambrica entre pic y pic, (transceiver kyl-210)
comunicación serial entre pc (visual basic) y pic
electroválvulas 12vdc
entre otros..

en principio pensaba utilizar 3 pic16f877a;
uno para el control y monitoreo de sensores válvulas... recibir y enviar información inalámbricamente por su puerto serial portc.6 y portc.7..con el transceiver kyl-210.
otro para recibir y enviar información por el puerto serial portc.6 y portc.7 inalámbricamente igual con otro kyl-210... este a su vez activaría alguno pines entre 1 y 0 los cuales se conectaban a un tercer pic.
este tercer pic, según el estado de los pines enviaba o recibia información a o desde la pc igualmente por su puerto serial portc.6 y portc.7 en un programa en visual basic donde se visualizara todo el proceso..
otro para recibir esa información...

este simulando, me funcionaba , si se puede decir bien. los tres pic y visual basic se comunicaba bien..

pero me entere que se puede enviar y recibir datos por cualquier pin del pic. entonce decidi reducir la cantidad de pic a 2.

aquí fue donde comezo todo el problema!
no he podido comunicar los 2 pic inhalambricamente. ya que uno de ellos se comunicara al pc por su puerto serial portc.6 y portc.7, y también se comunicara con el otro pic mediante el transceiver kyl-210 pero a otros pin cualquiera del pic (ya he probado varios y nada). y el otro pic solo se conecta al kly-210 ademas de los sensores y válvulas.
puedo observar por que los kyl-210 tiene luces para tx y rx. y si están enviando y recibiendo (pero al parecer no en el mismo idioma) y lo pruebo conectando el otro kyl-210 a la pc por rs-232 y con un programa que es para probar los mismos, y me envía caracteres muy diferentes a lo que quiero que envie o reciban..
por favor me podrian decir que estoy haciendo mal???
el serin y serout desde otro pin del pic funciona igual?
o cuales tengo que utilizar?? serin2, serout2, hserin, hserout, debug, debugin??? y si me pueden decir como seria???

y otra consulta como desactivo el conversor a/d del pic16f877a??? necesito esos pines como entradas y salidas, pa los sensores de nivel (hc-sr04), que aun no incluyo en programación.

por favor ayúdenme no ignoren este mensaje ni lo borren.. por favor... solo necesito una ayudadita de ustedes los expertos..
En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.

Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
Al ser PICBasic Pro un lenguaje de alto nivel, utiliza recursos y no los registros para lograr un propósito.
Así que para trabajar en PBP a 9600 bps, es recomendable aumentar la frecuencia de reloj.
También es importante tener en cuenta las temporizaciones del programa para que no exista desincronización.
Se debe también tener en cuenta que pasará tras el regreso de una sub rutina y su continuación.

He modificado solamente el primer programa, qué es dónde realizas doble recepción y transmisión de datos.
Pruébalo con la interfaz que adjunto creando dos instancias.
"Crear dos instancias, es ejecutar dos programas idénticos a la vez."
Una instancia la configuras para trabajar virtualmente por el puerto 3, y la otra para trabajar por el puerto 5
Cada vez que se crea una nueva instancia, el programa pregunta si se desea crear otra nueva.
Cada instancia del programa tendrá un identificador de ventana "Handle Window" ó HWND
También se le puede identificar por el número de conexión al puerto en la parte baja del programa.

Debido a tus pocos conocimientos en el tema de PBP y RS-232, sé que te costará algo de trabajo entender.
Pero aquí tienes un tema que te puede ayudar bastante en tu proyecto.
Interfaz RS232 PIC PC (Proyecto Completo VB6)

Adjunto el programa con los cambios realizados, dónde ya se puede establecer comunicación bilateral.

Suerte.
 

Adjuntos

  • kano2468 16F877A Serial COM.rar
    166 KB · Visitas: 186
Última edición:
En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.

Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
Al ser PICBasic Pro un lenguaje de alto nivel, utiliza recursos y no los registros para lograr un propósito.
Así que para trabajar en PBP a 9600 bps, es recomendable aumentar la frecuencia de reloj.
También es importante tener en cuenta las temporizaciones del programa para que no exista desincronización.
Se debe también tener en cuenta que pasará tras el regreso de una sub rutina y su continuación.

He modificado solamente el primer programa, qué es dónde realizas doble recepción y transmisión de datos.
Pruébalo con la interfaz que adjunto creando dos instancias.
"Crear dos instancias, es ejecutar dos programas idénticos a la vez."
Una instancia la configuras para trabajar virtualmente por el puerto 3, y la otra para trabajar por el puerto 5
Cada vez que se crea una nueva instancia, el programa pregunta si se desea crear otra nueva.
Cada instancia del programa tendrá un identificador de ventana "Handle Window" ó HWND
También se le puede identificar por el número de conexión al puerto en la parte baja del programa.

Debido a tus pocos conocimientos en el tema de PBP y RS-232, sé que te costará algo de trabajo entender.
Pero aquí tienes un tema que te puede ayudar bastante en tu proyecto.
Interfaz RS232 PIC PC (Proyecto Completo VB6)

Adjunto el programa con los cambios realizados, dónde ya se puede establecer comunicación bilateral.

Suerte.


buen diaaa
D@rkbytes muchisiiiiiimasssssssss gracias hermanoooooo.... gracias por tu respuesta...
te comento que ya lo había logrado de tanto insistir, buscar, estudiar.. lo consegui con algunos detalles.. pero tu información me ayudara bastante para que funcione correctamente..
y por supuesto que lo voy a implementar como tu lo hicisteee....
pero tengo unas dudas....

@ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje
en esta línea:
Sensar:
SerOut TX,T9600,[B0] ; Sólo para saber si el caractér recibido es = a $

no la entiendo muy bien.. va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?

en estas líneas
SerOut PORTB.4,T9600,["X",A,13,10] 'ENVIA EL COMANDO PARA HACER PURGA
SerOut TX,T9600,[SENSOR1,13,10] 'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC

13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo tal cual en el otro pic es cierto?, pero en visual basic?
y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me funciono.. a mi..

y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc mediante resistencias de 1k. si intercambio los puertos de tu programación funciona igual verdad?


gracias por todo viejo. te gradezco un mundo de verdad
espero tu respuesta.
gracias
 
tengo unas dudas....

@ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje
Esa es la palabra de configuración para el PIC.
Determina varios parámetros sobre el funcionamiento del microcontrolador.
Lee este documento Significado de los Fuses y también busca información acerca de ello.

en esta línea:
Sensar:
SerOut TX,T9600,[B0] ; Sólo para saber si el caractér recibido es = a $

no la entiendo muy bien.. va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?
El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.
en estas líneas
SerOut PORTB.4,T9600,["X",A,13,10] 'ENVIA EL COMANDO PARA HACER PURGA
SerOut TX,T9600,[SENSOR1,13,10] 'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC

13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo tal cual en el otro pic es cierto?, pero en visual basic?
El 13 equivale a enviar un retorno de carro, y el 10 a enviar un salto de línea.
Que vendría siendo como en Visual Basic usar "vbCrLf"
Tan solo sirve para que los datos no se muestren uno detrás del otro.
Los puedes eliminar en las líneas de código donde no se necesiten.
Consideremos que este fue un programa debug, y contiene código que puedes quitar.
y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me funciono.. a mi..
Si, todo depende de la forma en que quieras recibir los datos, y solamente se usa para números.
y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc mediante resistencias de 1k. si intercambio los puertos de tu programación funciona igual verdad?
Posiblemente, en tu programa estás usando los pines del módulo USART, pero les das un uso normal,
porque la recepción y transmisión la haces por software, y no usando el módulo.
Para eso tendrías que usar HSerOut y HSerIn y entonces si lo harías usando el módulo USART.
Lee la información del tema que te mencioné, ahí encontrarás lo que necesitas saber.
gracias por todo viejo. te agradezco un mundo de verdad
De nada, Saludos.
 
Esa es la palabra de configuración para el PIC.
Determina varios parámetros sobre el funcionamiento del microcontrolador.
Lee este documento Significado de los Fuses y también busca información acerca de ello.


El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.
El 13 equivale a enviar un retorno de carro, y el 10 a enviar un salto de línea.
Que vendría siendo como en Visual Basic usar "vbCrLf"
Tan solo sirve para que los datos no se muestren uno detrás del otro.
Los puedes eliminar en las líneas de código donde no se necesiten.
Consideremos que este fue un programa debug, y contiene código que puedes quitar.

Si, todo depende de la forma en que quieras recibir los datos, y solamente se usa para números.

Posiblemente, en tu programa estás usando los pines del módulo USART, pero les das un uso normal,
porque la recepción y transmisión la haces por software, y no usando el módulo.
Para eso tendrías que usar HSerOut y HSerIn y entonces si lo harías usando el módulo USART.
Lee la información del tema que te mencioné, ahí encontrarás lo que necesitas saber.

De nada, Saludos.


eres el mas mejor D@rkbytes jejejeje
gracias por tu ayuda de verdad creo que entendí jejejeje

de todas maneras para salir de duda.. con esto:
El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.

quieres decir que "$" es: cualquier cosa extraña que se reciba por rx... osea lo que se recibe cuando hay mala comunicación o algo anda mal es decir figuritas extrañas....


de antemano muchas gracias me has ayudado mucho. soy nuevo programando y quisiera aprender bastante sobre el tema. pero aquí en Maracay Venezuela es difícil conseguir donde te den un curso de programación de pic, y si lo consigues te dan lo básico lo que medio uno sabe.
te adjunto una imagen del programa en visual basic, para que me des tu punto de vista, de verdad tu lo debes ver muy fácil pero llegar a esto me ha costado mucho, prácticamente volver a estudiar y todo lo he hecho en menos de 2 meses. yo quisiera que este proyecto funcionara lo mejor posible, pero tampoco tengo tanto conocimiento en visual basic solo lo básico. y bueno hay voy. todavía me falta agregar lo de los sensores de nivel. y hacer que el prototipo funcione.

gracias un saludo.
 

Adjuntos

  • programa en visualbasic.jpg
    programa en visualbasic.jpg
    86.1 KB · Visitas: 65
eres el mas mejor D@rkbytes jejejeje
gracias por tu ayuda de verdad creo que entendí jejejeje

de todas maneras para salir de duda.. con esto:


quieres decir que "$" es: cualquier cosa extraña que se reciba por rx... osea lo que se recibe cuando hay mala comunicación o algo anda mal es decir figuritas extrañas....


de antemano muchas gracias me has ayudado mucho. soy nuevo programando y quisiera aprender bastante sobre el tema. pero aquí en Maracay Venezuela es difícil conseguir donde te den un curso de programación de pic, y si lo consigues te dan lo básico lo que medio uno sabe.
te adjunto una imagen del programa en visual basic, para que me des tu punto de vista, de verdad tu lo debes ver muy fácil pero llegar a esto me ha costado mucho, prácticamente volver a estudiar y todo lo he hecho en menos de 2 meses. yo quisiera que este proyecto funcionara lo mejor posible, pero tampoco tengo tanto conocimiento en visual basic solo lo básico. y bueno hay voy. todavía me falta agregar lo de los sensores de nivel. y hacer que el prototipo funcione.

gracias un saludo.


buenas noches.. D@rkbytes
creo que pude hacer funcionar el proyecto, con tu ayuda por supuesto!

te adjunto los archivos para que me des tu punto de vista si no es mucha molestia. y si me puedes corregir algunas cosas y falllitas que tengo que aun no se como solucionar.
como por ejemplo cuando se sensa el sensor 2, la pc suena como un error..
otro es que tuve que quitar del serout al pc el 13,10 ya que no me hacia una función el visual basic, es de ocultar y mostrar imágenes, comote dije no se mucho de visual basic tampoco.
y otro es que cuando cualquiera de los sensores su valor sea 0 me envía dos mensajes, ya que no encontré como ponerlo, intente con select case, y no pude o no supe, lo hice con if.. then.. else... endif... osea:
Código:
Low PORTD.4          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   SerOut TX,T9600,["X",e,13,10]  'ENVIA POR PORTB.4, KYL-210, PIDE INFO DE SENSOR1
   Pause 100
   SerIn RX,T9600,["se"],SENSOR1   'ESPERA POR EL PORTB.5 CONECTADO AL KYL-210                                                       'RESPUESTA  DEL SENSOR 1 EN EL OTRO PIC
   Pause 100
   if SENSOR1 > 30 then
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: CORRECTO "]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
   ELSE   
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: BAJO "]
   endif
   if sensor1 = 0 then
   SerOut TXPIN,T9600,[" *FALLA TUBERIA PRINCIPAL* "]
   endif 
   Pause 1000
   High PORTD.4                          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   Return


ahh aun no pruebo incluyendo los sensores de nivel...

saludos gracias y disculpa la molestia..
 

Adjuntos

  • proyecto visual basic.rar
    42 KB · Visitas: 87
  • PROYECTO microcode.rar
    103.7 KB · Visitas: 100
  • simulacion.rar
    29.6 KB · Visitas: 83
Saludos kano2468

Estuve revisando tus programas y noté que aún no incluyes la palabra de configuración el tus códigos.
Ahora más que nada es importante que la incluyas, pues cambiaste de 4MHz a 20MHz.
Y el compilador usará XT_OSC y necesitas usar HS_OSC
También estará el Watch Dog Timer habilitado, y eso te puede estar reseteando el microcontrolador.
Es recomendable habilitar el fuse PWRTE "Power Up Timer" para estabilizar voltajes al iniciar.
En cuanto al fuse BOREN "Brown-Out Reset" puede quedar habilitado.
Su uso provocará un reset cuando exista un bajo voltaje en la alimentación del PIC.
Por lo tanto, si tu fuente de alimentación es estable, y con suficiente amperaje, puede quedar habilitado.
Tienes que tener en cuenta esto cuando trabajas con la misma fuente para activar motores, válvulas, etc.

El símbolo $ usado en el Select Case puede ser cualquiera, ése es un símbolo muy usado, por eso lo usé.
Pero puedes usar el que quieras, no es para saber si el caractér es basura.
En ese caso lo que se utilizaría es la opción "Else".
Así cualquier dato no incluido en la selección, entrará en la parte contraria "Else".

Pasando al programa en Visual Basic, es recomendable el uso de Option Explicit
Para esto tienes dos opciones...
Puedes escribir Option Explicit en la cabecera del programa, o ir al menú Herramientas/Opciones...
Ahí seleccionas "Requerir declaración de variables"
Con esto obligas al compilador a que detecte los tipos de variables no declaradas en el programa.
Y en tu código existen errores por no usar esta sentencia.
Si miras bien tu programa, sobre todo en los bucles For del Timer1, verás que escribes... For y = o To 2
En vez de For y = 0 To 2

Te recomiendo que en vez de usar un timer, uses el evento OnComm del control MSComm32
Así la recepción de datos no estará limitada por la temporización de Timer1, y podrás tener más control.

Otra recomendación es que tengas un control sobre los posibles errores que puedan ocurrir.
Por ejemplo... ¿Qué pasaría si tu programa fuera ejecutado en una PC que no tiene puertos seriales?
Obviamente se producirá en error que terminará tu programa abruptamente. Y eso no es deseado.

En cuanto a hacer comparaciones con cadenas de texto, no lo veo funcional.
Solamente puedes guardar un byte dentro de la variable de recepción. Y en tu programa comparas cadenas.
Es mejor que envíes un caractér ó número, y posteriormente lo compares.

También te recomiendo que no diseñes formularios tan grandes, no todos tienen grandes resoluciones de pantalla.
Puedes hacer uso de las API de Windows para saber la resolución de la pantalla, y dar aviso al usuario.
Cuando un programa es mayor en tamaño que la resolución en pixeles de la pantalla, éste se sale.
Se pierde visibilidad de los controles, quedando incomodo para el usuario.
En estos casos lo que se hace, es crear formularios redimensionables que se puedan ajustar a la pantalla.
Trata en lo posible de no usar gráficos pesados, eso hace que tu programa ocupe mucha memoria.
Siempre son buen vistos los programas ligeros, de rápida carga, y menos consumo de recursos.
"Por eso me gustan los programas realizados en ensamblador de 32 bits" MASM32
Nota que tu programa compilado "*.exe" pesa más de 4Mb y no tiene mucho código.
Eso es debido al uso de gráficos que puedes sustituir por mensajes, o imágenes GIF.
Ahora que si te gusta la programación gráfica puedes usar DirectX para VB y verás mejores resultados.

Saludos y suerte.
 
Última edición:
Atrás
Arriba