desktop

Curso de programación de PIC en PICBasic Pro

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: 106
¿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.
 
Hola. Buenos días. Estoy haciendo un programa sencillo de distintos menús en LCD con 1 solo pulsador,
ya que quiero ir avanzando con lo que he aprendido, pero veo que al compilarlo y probarlo, el LCD me muestra varios menús sin necesidad de un presionar el pulsador, está como loco.

Copio lo que llevo hasta ahora.
Código:
;*********************************************************************************************************;
                      
OSCCON=%01100110  ; Se utiliza para pic 16f88, Configura oscilador interno en 4MGH de frecuencia estable                                            

ANSEL=0           ; Se utiliza para pic 16f88, Todos los puertos configurados como digital y si los queremos analogos los = 1                     

;*******************************************************************************
DEFINE LCD_DREG PORTB  ; Indica que el Bus estará conectado en el Puerto B

DEFINE LCD_DBIT 4      ' Selección del Bit de inicio del puerto en el uC para el
                       ' bus de datos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto B
DEFINE LCD_RSBIT 3     ' "RS" estará conectado en RB3
DEFINE LCD_EREG PORTB  ' Indica al uC que el pin "E" estará en el Puerto B
DEFINE LCD_EBIT 2      ' "E" estará conectado en RB2
Define Osc 4           ' Define el Oscilador para un Cristal
                       ' de 4 Mhz.

TRISA=%00111110
TRISB=%00000000


;************************* Pines de control ************************

Symbol enter = PORTA.1


;****************************** Declaración de variables******************************
B0      Var Byte
B1      Var Byte
B2      Var Byte

Dias  Var Byte
Tardes   var byte
Noches  var byte

cafe var byte
arroz var byte
jugo var byte

dato var byte
datod var byte
datoa var byte
datoc var byte

Dato = 0
datod = 0
datoa = 0
datoc = 0

LCDOut $fe, 1 ' Limpia la pantalla



Inicio:

LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Bienvenidos"
LCDOut $fe,$C0, "Welcome"

clear
     

;Menus:


   For B0 = 1 To 200
   if enter=0 and dato = 0 then gosub suma
   Next
   gosub Hola1
   
   For B1 = 1 To 200
   if enter=0 and dato = 1 then gosub suma
   next 
   gosub Hola2    
    
   For B2 = 1 To 200
   if enter=0 and dato = 2 then gosub suma
   next
   gosub Hola3 

;goto Menus
goto Inicio
    
Hola1:

for Dias = 1 to 30
lcdout $fe,1    
lcdout $fe,$80,"Buenos"
lcdout $fe,$c0,"Dias"
   pause 100
   NEXT Dias

lcdout $fe,1    
lcdout $fe,$80,"Como"
lcdout $fe,$c0,"Estas"   
pause 300  

if enter = 0 then gosub desayuno

return    


    
Hola2:

for Tardes = 1 to 30
lcdout $fe,1    
lcdout $fe,$80,"Buenas"
lcdout $fe,$c0,"Tardes"
   pause 100
NEXT Tardes

lcdout $fe,1    
lcdout $fe,$80,"Veo que"
lcdout $fe,$c0,"Estas bien"
pause 300 

if enter = 0 then gosub almuerzo

RETURN 


Hola3:

for Noches = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Buenas"
lcdout $fe,$c0,"Noches"
  pause 100
  NEXT Noches
  
lcdout $fe,1    
lcdout $fe,$80,"Que pases"
lcdout $fe,$c0,"Bien"
pause 300   

if enter = 0 then gosub cena

RETURN    

desayuno:

for cafe = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de desayuno"
  pause 100
  NEXT cafe  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Americano"
lcdout $fe,$c0,"2- Nativo"
pause 300   

if enter = 0 and datod = 0  then gosub sumad
lcdout $fe,1    
lcdout $fe,$80,"1- Americano"
pause 300

if enter = 0 and datod = 1  then gosub sumad
lcdout $fe,1 
lcdout $fe,$c0,"2- Nativo"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN   
  
  
almuerzo:

for arroz = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de almuerzo"
  pause 100
  NEXT arroz  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Guisado"
lcdout $fe,$c0,"2- Sopa"
pause 300   

if enter = 0 and datoa = 0  then gosub sumaa
lcdout $fe,1    
lcdout $fe,$80,"1- Guisado"
pause 300

if enter = 0 and datoa = 1  then gosub sumaa
lcdout $fe,1 
lcdout $fe,$c0,"2- Sopa"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN        



cena:

for jugo = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de almuerzo"
  pause 100
  NEXT jugo  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Asado"
lcdout $fe,$c0,"2- Pizza"
pause 300   

if enter = 0 and datoc = 0  then gosub sumac
lcdout $fe,1    
lcdout $fe,$80,"1- Asado"
pause 300

if enter = 0 and datoc = 1  then gosub sumac
lcdout $fe,1 
lcdout $fe,$c0,"2- Pizza"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN        
    


Suma:
Dato = Dato + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".


Sumad:
datod = datod + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".



Sumaa:
datoa = datoa + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".



Sumac:
datoc = datoc + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".
 
Última edición por un moderador:
Hola. Deberías empaquetar todo (Programa, archivo compilado, simulación) en un archivo comprimido y subirlo porque ya de entrada, si no pones resistencia de Pull-UP en PortA.1, va a ir a "sumar" ya que Dato=0
No seguí analizando la lógica del programa.
Saludos.

Ric.
 
Última edición por un moderador:
Hola, adjunto el archivo de simulación y los demas archivos, asi como esta simulado lo tengo montado en protoboard. El oscilador del pic 16f88, esta configurado internamente a 4 Mh, utilizo una resistencia pull-up en el puerto A.
 

Adjuntos

  • Menu lcd puldador.rar
    32.6 KB · Visitas: 77
La lógica del programa no me "cierra", el bucle principal esta permanentemente y de forma innecesaria, imprimiendo en el display y limpiándolo cuando esta a la espera, cuando pulsas "enter", se desencadenan una serie de mensajes, sin ningún tope,etc, etc....te sugiero que empieces por volcar tú idea en un programa corto de pocas lineas y ver como funciona, a este le agregas después otras opciones y pruebas y así sucesivamente hasta que funcione como tú esperas.
No se que quieres hacer con un solo botón/pulsador pero ten en cuenta que cuando mas simple es el hardware, mas complejo es la programación y mas espacio ocupa el software. Cuando usas diferentes freses a mostrar te quedas sin espacio enseguida.
Revisa la instrucción "Button" de la ayuda del PBP, que te puede servir para lo que quieras hacer.
Saludos.

Ric.
 
Última edición:
Hola buenas noches, hice unos cambios y logré algo de avance pero me toca dejar undido el pulsador para que me responda a los demas menus secundarios; intentaré con la instrucción Button, gracias de todas maneras por su colaboración.

Disculpen aqui adjunto el archivo modificado. gracias
 

Adjuntos

  • Menu lcd puldador.rar
    38.5 KB · Visitas: 51
Hola buenos dias, He estado leyendo sobre el Pic 18f2550 de 28 pines y lo que he logrado entender acerca de la conversión de los pines de analogo a digital en los 4 puertos que dispone utilizandolos con PBP y MCS; es que solo es posible en los siguientes pines:

Entrada y salida digital
Puerto A: RA.0-RA.1-RA.2-RA.3-RA.5
Puerto B: RB.0-RB.1-RB.2-RB.3-RB.4-RB.5-RB.6-RB.7
Puerto C: RC.0-RC.1-RC.2-RC.6-RC.7

Solo salida digital
Puerto A: RA.4

Entiendo que CMCOM = 7 , Desactiva los comparadores analogicos, pero no se si de los 3 puertos a la vez; como tambien que ADCON1 = 0F configura el Puerto A con ADC como digital y ADCON1 = 0E configura el Puerto B con ADC como digital; Pero entonces como configuro el puerto C? o estoy totalmente errado en todo lo que acabo de escribir? Muchas gracias.
 
Atrás
Arriba