Curso de programación de PIC en PICBasic Pro

la instruccion PULSIN sera la adecuada?

Que tal Darkbytes y a todos en el foro!

Encontre este proyecto en la red es sobre un Detector de Proximidad.Esta diseñado con un solo microcontrolador y esta escrito en ASM cosa que no manejo y bueno ya que estamos en pic basic pro,la pregunta es ¿puedo utilizar la funcion PULSIN por aquello de PulsIn PORTA.0,0,pulsos ,(lectura de pulsos en estado bajo) para capturar la señal de rebote,como ves en el texto de mas abajo remarque en negrita lo que considere relevante es decir:
emitir pulsos a 38khz--->rebotar en el objeto--->capturar la señal(frecuencia)--->comparar la señal enviada con la recibida y en base a eso ejecutar acciones.

En resumen mi duda es:¿puedo utilizar la funcion PULSIN para capturar la señal de rebote y luego comparar? por que no se me ocurre otra idea.

Anexo un par de imagenes y un programa PWM con Hardware con el pic 16f628A con un ciclo util del 50% y frecuencia de 38 KHZ aproximadamente
Por su aportacion Gracias...


*****Extracto del texto original*****

Principio de funcionamiento:

Por medio del microcontrolador, se activa el LED infrarrojo mediante trenes de pulsos. Cuando algún objeto se aproxima al LED (a una distancia que puede regularse entre 5 y 20 cms, dependiendo de la corriente que se suministre al LED), refleja la energía hacia el detector, el cual envía la señal al microcontrolador. El microcontrolador compara la señal enviada con la señal recibida y, si son similares, entonces activa el relevador.

El envío de pulsos, y la comparación entre la frecuencia de envío y la recibida, hace posible evitar el disparo en falso del relevador por efecto de sombras o cambios en la luminosidad del ambiente, ya que el dispositivo puede funcionar de día y de noche.

Descripción:

El principio de funcionamiento es generar, por medio del firmware en el microcontrolador, un tren de 30 pulsos modulando a una portadora de 36 kHz, cada uno con una duración de de 835 us, y seguido por un espacio de la misma duración, como se muestra en la imagen de abajo. Para generar tal señal, se utiliza la función PWM (Modulación por ancho de pulso) integrada en el hardware del microcontrolador 18F2550.

Esta señal se emitida por el diodo infrarrojo TN153B, reflejada por el objeto y detectada por el receptor de infrarrojo TMF5360. La señal de 36 khz demodulada es analizada por un algoritmo en el firmware del microcontrolador 18F2550, que posteriormente activa el relevador cuando se detecta una señal válida.
 

Adjuntos

  • Detector de Proximidad_01.jpg
    Detector de Proximidad_01.jpg
    49.6 KB · Visitas: 52
  • Detector de Proximidad_02.jpg
    Detector de Proximidad_02.jpg
    36.4 KB · Visitas: 42
  • PWM_hardware.jpg
    PWM_hardware.jpg
    104.1 KB · Visitas: 41
  • PWMhardware.rar
    73.3 KB · Visitas: 53
Buenas Arturo vie el dribe de tu video en interne , y me he apuntado al foro , yo no controlo mucho de pic , pero bueno intentare ponerme al dia , el proyecto de este motor con encoder es de lo mejorcito que he visto por la red , lo he intentado simular en Proteus , pero no lo he conseguido asi que lo intentare hacer en fisico , pero me parece tam bueno que creo que se merece un pos independiente , para ver si se sigue desarrollando porque creo que podria dar mas de si , yo algo intentare y si lo consigo lo pondre por aqui anque dudo que lo consiga , pero creo que le hace falta el empujon de un dato mas ( la velocidad ) , porque creo que los desplazamintos los hace todos a la maxima velocidad y estaria bien poder elegir no solo el punto de destino si no a que velocidad lo hace .
 
Hola compañeros, buenas noches.

He practicado y realizado proyectos pequeños con el PIC16f84A.
Ahora quise cambiarme al PIC16F88, que según lo que he leído es compatible pin a pin y en la gran parte de la programación.
Quise adaptar este simple programa para encender un LED añadiendo la instrucción CMCON = 7 para habilitar el puerto A como digital, como también la instrucción OSCCON = %01100110 para hablitar el oscilador interno, pero aun así no me funcionó.
¿Ustedes que sugieren?

Código:
cmcon=7                ; Desactiva los comparadores analogicos de todos los pines del puerto A y
                       ; convierte las salidas y entradas en digital del puerto A.
                       

OSCCON=%01100110     ; Configura oscilador interno en 4MGH de frecuencia estable  
                                          
Define Osc 4 ' Define el Oscilador para un Cristal  ' de 4 Mhz.

TRISA = %11110111            ' Configura el puerto A como entrada.
TRISB = $00            ' Configura puerto B como salida.

PORTB = $00 ' Inicializa el puerto B

Inicio:

If PORTA.4 = 1 Then PORTB.7 = 1 ' Pregunta si RA0 = 1, si se cumple
                                ' la condición entonces enciende el Led.
                                
Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)

Low PORTB.7 ' Apaga el Led

Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)

GoTo inicio ' Salta a la etiqueta "Inicio"

End
 
Última edición por un moderador:
Quise adaptar este simple programa para encender un LED añadiendo la instrucción CMCON = 7 para habilitar el puerto A como digital, como también la instrucción OSCCON = %01100110 para hablitar el oscilador interno, pero aun así no me funcionó.
CMCON no es el registro que hace los pines analógicos como digitales.
Y el oscilador interno no se activa con el registro OSCCON, ahí se configura.
¿Ustedes que sugieren?
Que le des una buena leída a la hoja de datos. :cool:
Ahí encontrarás las configuraciones y entenderás el por qué no funciona tu programa.

Suerte.
 
Hola buenas noches D@rkbytes.

Tenias toda la razón, investigando en la hoja de datos del pic 16f88 encontré que colocando en 0 el registro ANSEL todos los puertos se colocaban en digital o si le coloco en binario puedo determinar que bit puedo establecer como analogo o digital. Muchas gracias.

Tengo una duda porqué al precionar el pulsador me toca esperar hasta 2 segundos para que encienda el led.

Muchas gracias.
 
Porque tienes 2 retardos de 1000 ms después de la sentencia IF.
Por lo tanto, siempre habrá 2 segundos para que se regrese a la etiqueta "Inicio"

Podrías envolver las instrucciones dentro de un solo bloque IF, pero de todos modos siempre existirá el retardo.
Haciendo eso, al menos cuando se salga del bloque IF no tendrás que dejar el pulsador presionado esperando el retorno.
 
Que tal a todos!

Alguien me puede decir ¿como puedo enviar el valor de una variable tipo Byte

a la pc,via comunicacion serial(rs-232)?

en formato Binario y Hexadecimal,ya que al compilar en PBP me marca error

es decir,en este formato es como lo he manejado y me lo acepta.


SEROUT PORTB.3,N2400,[" DECIMAL: " ,#b9,10,13] ; b9 variable tipo Byte


Quiero enviar el siguiente valor: Decimal=42--->Binario:101010

o cualquier otro valor en binario o hexadecimal.

por ejemplo:

En decimal no me acepta DEC b9, me acepta #b9

En binario no me acepta Bin b9

En Hexadecimal no probe.

cabe mencionar que en display lcd todo bien,sin problemas.

aqui la cuestion es en la comunicacion con la pc.

Gracias por responder...
 
¿Alguien me puede decir cómo puedo enviar el valor de una variable tipo Byte a la pc, vía comunicación serial RS-232?

En formato Binario y Hexadecimal, ya que al compilar en PBP me marca error.

Es decir, en este formato es como lo he manejado y me lo acepta.
Código:
SEROUT PORTB.3,N2400,[" DECIMAL: " ,#b9,10,13]  ; b9 variable tipo Byte
Quiero enviar el siguiente valor: Decimal=42--->Binario:101010

O cualquier otro valor en binario o hexadecimal.

Por ejemplo:
En decimal no me acepta DEC b9, me acepta #b9

En binario no me acepta Bin b9
Ten en cuenta que no es lo mismo enviar 42 que #42. Dec 42, es lo mismo que #42
Y de esa forma se envía para que el número pueda ser visualizado como texto.
Pero si lo necesitas procesar como un valor entero para una variable tipo Byte, Integer, Long, etc.
Entonces tienes que enviarlo sin usar #, Dec, o Bin.

PD:
Las instrucciones que aceptan DecX, HexX y Bin, son SerOut2 y HSerOut2
 
Buenos días.

Estoy intentando aprender PICBasic, y como me dedico al mundo del ascensor he querido iniciarme con algo que tenga que ver con el mismo.
He empezado con algo que entiendo que es básico, por lo menos a más de uno le parecerá y he realizado el siguiente código para un ascensor de 3 pisos.

Sin complicarme la vida no tiene memoria lógicamente, y para facilitar más las cosas he puesto 3 finales de carrera o nivel de piso o como queramos llamarle para que dé la orden de paro, pero sinceramente me gustaría mejorar la estructura del código ya que me duele a los ojos ver tanto If...Then, pero como estoy pez, a ver si alguien me puede indicar como mejorar ciertas partes del programa, y probablemente corregirme bastantes errores, pero me gustaría saber si voy bien encaminado o no.

Por otra parte, no he realizado el circuito, sólo he empezado a estructurar el código.

He incluido orden de abrir y cerrar puertas así como series de seguridad que se comprueban antes de iniciar la marcha, pero no sé si el código que dejo a continuación expresa lo que quiero indicar:

Aquí dejo el código:
Código:
program Ascensor

' Declarations section 
Symbol         P1=portb.0
Symbol         P2=portb.1
Symbol         p3=portb.2
Symbol         nivel1=portb.3
Symbol         nivel2=portb.4
Symbol         nivel3=portb.5
Symbol         subir=portc.0
Symbol         bajar=portc.1
Symbol         seriepuerta=portb.6
Symbol         seriecabina=portb.7
symbol         abrirp=portc.2
symbol         cerrarp=portc.3
TRISB=$FF
TRISC=$00
PORTB=$00
main:
'   Main program 
 Inicio:
 IF   P1=0   then pcabina
 IF   P2=0   then pcabina
 IF   P3=0   then pcabina
 goto inicio
 pcabina:
 IF   P1=0 nivel1=0 then apuertas  ; si se presiona pulsador 1 y esta en ese nivel 1 va a la rutina de puertas
 IF   P1=0 nivel2=0 then motorb ; si se presiona pulsador 1 y esta en ese nivel 2 va a la rutina motor en bajada
 IF   P1=0 nivel3=0 then motorb si se presiona pulsador 1 y esta en ese nivel 2 va a la rutina motor en bajada
 IF   P2=0 nivel1=0 then motors si se presiona pulsador 2 y esta en ese nivel 1 va a la rutina motor en subida
 IF   P2=0 nivel2=0 then apuertas si se presiona pulsador 2 y esta en ese nivel 2 va a la rutina motor de puertas
 IF   P2=0 nivel3=0 then motorb si se presiona pulsador 2 y esta en ese nivel 3 va a la rutina motor en bajada
 IF   P3=0 nivel1=0 then motors si se presiona pulsador 3 y esta en ese nivel 1 va a la rutina motor en subida
 IF   p3=0 nivel2=0 then motors si se presiona pulsador 2 y esta en ese nivel 2 va a la rutina motor en subida
 IF   P3=0 nivel3=0 then apuertas si se presiona pulsador 3 y esta en ese nivel 3 va a la rutina de puertas
apuertas:
 abrirp=1
 Pause 5000
 cerrarp=1
 goto pcabina
motors:
 IF   seriecabina=1 and seriepuerta=1 then
 IF   P2=0 and nivel2=0 Then  subir=1    else subir=0
 IF   P3=0 and nivel3=0 Then  subir=1    else subir=0
 goto inicio
 
 motorb:
 IF   seriecabina=1 and seriepuerta=1 then
 IF   P1=0 and nivel1=0 Then  bajar=1    else bajar=0
 IF   P2=0 and nivel2=0 Then  subir=1    else bajar=0
 goto inicio

end.


Gracias, de antemano.

Un saludo.
 
Última edición por un moderador:
Hola buenos dias compañeros, estoy empezando a utilizar la EEPROM del pic 16f88 pero tengo la siguiente duda: si quiero grabar en la direccion $00 el dato 135 fisicamnete se haria asi $00:1 $01:3 $02:5, lo pregunto ya que al grabar el .hex en el pic, el software del programador me permite visualizar y cambiar los datos en la EEPROM, donde fisicamente me muestra filas de 8bits desde la $00 hasta la $FF; En otras palabras solo es posible guardar 1 caracter ascii en .hex por cada dirección? o no?. muchas gracias.
 
Puedes guardar un Byte por locación, o sea, valores hasta 255. (0xFF)
Cada carácter de la tabla ASCII equivale a un Byte.
Si quieres guardar 135 no hay problema, pues no pasa de 255.
Pero si lo quieres guardar así por números separados, entonces ocupas 3 Bytes. (3 locaciones de memoria.)

sinceramente me gustaría mejorar la estructura del código ya que me duele a los ojos ver tanto If...Then, pero como estoy pez, a ver si alguien me puede indicar como mejorar ciertas partes del programa, y probablemente corregirme bastantes errores, pero me gustaría saber si voy bien encaminado o no.
Como son varias comparaciones y llamadas a rutinas, no te queda otra más que usar If... Then...
Y precisamente sobre estas instrucciones es donde tienes problemas.
Juntas las sentencias If con Else sin terminar algunas con un EndIf. y en la parte de la rutina "pcabina" hacen falta algún tipo de operador para completar la instrucción.
Yo puse el operador "And" pero realmente sólo tú sabes como debe ser el tipo de comparación.

Este es el código corregido, lo cual tal vez no hará que funcione porque sin un esquema o simulación, es complicado verificar las rutinas y como deban funcionar.
De hecho tampoco se sabe para que PIC es el programa.
PHP:
; program Ascensor

' Declarations section 
Symbol P1 =             PORTB.0
Symbol P2 =             PORTB.1
Symbol P3 =             PORTB.2
Symbol nivel1 =         PORTB.3
Symbol nivel2 =         PORTB.4
Symbol nivel3 =         PORTB.5
Symbol subir =          PORTC.0
Symbol bajar =          PORTC.1
Symbol seriepuerta =    PORTB.6
Symbol seriecabina =    PORTB.7
symbol abrirp =         PORTC.2
symbol cerrarp =        PORTC.3

;TRISB=$FF
TRISC = 0
PORTB = 0
;main:
'   Main program 
Inicio:
    If P1 = 0   Then pcabina
    If P2 = 0   Then pcabina
    If P3 = 0   Then pcabina
    
    GoTo inicio
 
pcabina:
    If P1 = 0 And nivel1 = 0 Then apuertas   ; Si se presiona pulsador 1 y está en ese nivel 1 va a la rutina de puertas
    If P1 = 0 And nivel2 = 0 Then motorb     ; Si se presiona pulsador 1 y está en ese nivel 2 va a la rutina motor en bajada
    If P1 = 0 And nivel3 = 0 Then motorb     ; Si se presiona pulsador 1 y está en ese nivel 2 va a la rutina motor en bajada
    If P2 = 0 And nivel1 = 0 Then motors     ; Si se presiona pulsador 2 y está en ese nivel 1 va a la rutina motor en subida
    If P2 = 0 And nivel2 = 0 Then apuertas   ; Si se presiona pulsador 2 y está en ese nivel 2 va a la rutina motor de puertas
    If P2 = 0 And nivel3 = 0 Then motorb     ; Si se presiona pulsador 2 y está en ese nivel 3 va a la rutina motor en bajada
    If P3 = 0 And nivel1 = 0 Then motors     ; Si se presiona pulsador 3 y está en ese nivel 1 va a la rutina motor en subida
    If p3 = 0 And nivel2 = 0 Then motors     ; Si se presiona pulsador 2 y está en ese nivel 2 va a la rutina motor en subida
    If P3 = 0 And nivel3 = 0 Then apuertas   ; Si se presiona pulsador 3 y está en ese nivel 3 va a la rutina de puertas

apuertas:
    abrirp = 1
    Pause 5000
    cerrarp = 1
    GoTo pcabina
 
motors:
    If seriecabina = 1 And seriepuerta = 1 Then
        If P2 = 0 And nivel2 = 0 Then
            subir = 1
        Else
            subir = 0
        EndIf
    
        If P3 = 0 and nivel3 = 0 Then
            subir = 1
        Else
            subir = 0
        EndIf
    EndIf
    
    GoTo inicio
 
motorb:
    If seriecabina = 1 And seriepuerta = 1 Then
        If P1 = 0 And nivel1 = 0 Then
            bajar = 1
        Else
            bajar = 0
        EndIf
        
        If P2 = 0 And nivel2 = 0 Then
            subir = 1
        Else
            bajar = 0
        EndIf
    EndIf
    
    GoTo inicio

    End
 
Última edición:
Saludos comunidad!!!
Aquí les traigo otro pequeño programa ejemplo de Elevador(Ascensor)
Saludos y seguimos en contacto.:)
 

Adjuntos

  • Elevador(Ascensor).zip
    410.6 KB · Visitas: 105
¿Qué tal? Un saludo a todos!

Necesito de su ayuda con lo que expongo a continuación:

Bueno, pues resulta que estoy haciendo un programa sencillo que consiste en un emisor IR
y un receptor IR.
Aquí lo que hago es que por medio del pulsador(ON) genero un código de 6 bits con ciclos for, los famosos UNOS y CEROS con subrutinas, digamos:

DEC=42 (Bin=101010) lo monto sobre una portadora(38khz),despues lo capturo con el receptor tsopx usando PULSIN y enciendo un led con el codigo recibido hasta ahí todo bien.
El problema está en que cuando oprimo el segundo botón (OFF) me genera el código pero distinto al que programo, es decir, para apagar el LED programo en el PIC emisor DEC=36 (Bin=100100) y me devuelve DEC=54 (Bin=110110)
¿Esto no sé por qué o a que se deba? No sé si tal vez se deba al comando PULSIN o algo que me esté sobrando o faltando. ¿Alguna solución?

Cabe mencionar, que estos códigos ya los probé en simulador proteus y en protoboard dandome los mismos resultados, solamente el primer pulsador me da el valor correcto.

Al oprimir el segundo botón me arroja otro valor muy distinto al esperado.

Por su ayuda, mil gracias.


Utilizo: 2 PIC16F628A con cristales de 4 MHz.

Anexo: códigos + proteus + imagen.
 

Adjuntos

  • picture.jpg
    picture.jpg
    99.1 KB · Visitas: 37
  • Codigos.rar
    21.6 KB · Visitas: 38
Última edición por un moderador:
El problema está en que cuando oprimo el segundo botón (OFF) me genera el código pero distinto al que programo, es decir, para apagar el LED programo en el PIC emisor DEC=36 (Bin=100100) y me devuelve DEC=54 (Bin=110110)
¿Esto no sé por qué o a que se deba? No sé si tal vez se deba al comando PULSIN o algo que me esté sobrando o faltando. ¿Alguna solución?
Supongo que al usar PulsIn de manera consecutiva, se obtienen lecturas incorrectas.
PulsIn debe funcionar utilizando el Timer 0, pero seguramente funciona bien usando una instrucción.

Lo que puedes hacer, es usar la interrupción externa por RB0, tomar el tiempo con el Timer 0 y en cada transición de la señal, limpiar el Timer y cambiar el flanco de interrupción.
De esta forma puedes medir lo que dura cada transición.
 
Buenos dias D@rkbytes,

Perdona el retraso en contestar, y gracias por aclararme el uso de la instruccion.

Revisare el codigo que me adjuntas.

Para tu informacion usaré el pic16f877.

Por otra parte me gustaria simplificar el tema de los sensores de piso, ya que uso tres entradas del pic para identificar los 3 niveles de piso, pero con esta metodologia tendria que usar 4 entradas para un ascensor de 4 niveles y asi sucesivamente, como se podría realizar un conteo de pulsos a traves de una unica entrada , me explico:

Pondria dos biestables uno indicando que esta arriba cuando se active y otro abajo, pero en los piso intermedios con un detecto magnetico solo contaria imanes para saber donde esta en cada momento y donde tiene que parar en caso de recibir una llamada, me podrías dar alguna indicacion de como realizar ese conteo y si es factible.

Gracias de antemano.
 
Hola buenas tardes. Me pregunto si alguna vez les ha pasado lo siguiente con el microcode studio: El cursor cambia de forma con diferente funcion; aveces tiene forma de barra vertical y puedo escribir, copiar caracteres dejar espacios con la barra espaciadora; pero no se porque cuando cambia de forma a un cuadro negro no puedo hacer lo mismo, cuando quiero escribir, copiar caracteres dejar espacios con la barra espaciadora lo que hace es borrar los caracteres que le siguen; no se si esto sucede por introcir un comando al tocar una tecla. Si alguien sabe el significado el porque de estas 2 formas le estaria muy agradecido.
 
Atrás
Arriba