Curso de programación de PIC en PICBasic Pro

Viendo el código que se produce con ese engendro de BASIC...está por darme algo...
Mejor voy a vomitar...:sick::sick::sick::sick::sick::sick:

PD: hace mas de 40 años que no uso goto + etiquetas
🤮🤮🤮🤮🤮🤮🤮🤮🤮
 
Pues ese no es el programa que has subido anteriormente. A mi me aparece esto: (No subo todo el código).

C:
IF XSR = 0  THEN    ; si XSR es accionado entonces
gosub ar            ; ir a antirebote          
gosub contar        ; ir a subrutina contar
endif

Que llama a este subrutina para quedarse a vivir en ella:

C:
'*****************************ANTIREBOTES*****************************
AR:                  
if XSR =0 then goto ar
return

'***********************************************************************


Alguien dijo algo así como que hay tantas formas de programar como programadores existen. Pero te repito, como te han repetido ya varias veces: Aprende a usar interrupciones y usa temporizadores.


Un ejemplo rápido (Que no lo mejor):

-> Interrupción por fin de carrera (Pulsador).
- Chequeo si terminó la temporalización. (Temporización activa).
Si no está activa:
- Activo bandera de que se detecto el fin de carrera.
- Marco para temporizar 1 Segundo (puede ser más, puede ser menos) (Temporizador echo también con interrupciones).
- Salgo de la interrupción.

Programa:

-Si la bandera de fin de carrera esta activa -> aumento el contador y borro la bandera.
- Goto programa :LOL:.
Buenas noches.
Gracias, todas las sugerencias las tomaré en cuenta.
Con respecto al antirebotes, si te fijas en el código actual, no lo estoy utilizando.
Es el mismo programa, pero con las modificaciones realizadas en base a los amables consejos de torres.electrónico.
únicamente no puse la parte superior donde está la declaración de variables, etc. porque creí que no era importante al estar ya en el archivo anterior.

Aquí lo pongo completo:
Saludos.
Código:
'//directivas

INCLUDE "modedefs.bas"

ADCON1=6                ;Apaga los comparadores de voltaje y digitaliza el puerto A (PIC16F876A)

@ ERRORLEVEL -306       ; anular el mensaje de limite de página rebasado

'@ device XT_osc        ; Utiliza un cristal externo de 4 MHz

'@ device BOD_OFF       ; APAGAMOS EL BODEN DE CONSUMO

'************************************************************

'//dimensionamiento

'VARIABLES     

B5          VAR BYTE    ;SELECTOR PISOS 0~3

C0          VAR BYTE    ;MEMORIA

n1          VAR BYTE    ;variable para intermitnte

n0          VAR byte    ;variable para retardo cerrar puerta

CNT         VAR BYTE    ;variable para conteo interrupción

CONTA       VAR BYTE    ;variable para incrementar o decrementar conteo         

SELECTOR    VAR BYTE    ;variable para almacenar conteo

'************************************************************

'//ALIAS


XP0         VAR  PORTA.0   ;llamada piso 0

XP1         VAR  PORTC.5   ;llamada piso 1

XP2         VAR  PORTA.2   ;llamada piso 2

XSR         VAR  PORTA.1   ;final de carrera selector (contador)         

'***************************SALIDAS************************

led0        VAR PORTB.0    ;Memoria PISO 0

led1        VAR PORTB.1    ;Memoria PISO 1

led2        VAR PORTB.2    ;Memoria PISO 2

    

'*********Variables dependiente del SELECTOR DE PISOS*********

S0          var B5.0       ;borra memoria Piso 0

S1          var B5.1       ;borra memoria Piso 1

S2          var B5.2       ;borra memoria Piso 2

'***********************MEMORIZACION DE PISOS*****************

RP0         VAR  C0.0       ;memoria Piso 0

RP1         VAR  C0.1       ;memoria Piso 1

RP2         VAR  C0.2       ;memoria Piso 2

'*************************************************************

'//configuraciones

TRISA=%11111111          ;Configuara el puerto A como ENTRADAS

TRISB=%10000000          ;Configuara el puerto B.7 como entrada, el resto como salidas

TRISC=%00101000          ;Configuara el puerto _C.3 y C.5 como entrada, el resto como salidas

PORTB=0

'SELECTOR=0


'inicio:



'\\Cuando el final de carrera XSR = 0, es decir, cuando es accionado, esto en la realidad dura

'unos 20 segundos o más, el programa se estanca y no se puede hacer las llamadas

'desde otros pisos y ninguna otra acción.



'IF XSR = 0  THEN    ; si XSR es accionado entonces

'gosub ar            ; ir a antirebote           

'gosub contar        ; ir a subrutina contar

'endif


main:

if XSR = 1 then encendido '(si la entrada 0 es igual a 1, ir al sub programa…)

if XSR = 0 then contar '(si la entrada 0 es igual a 0, ir al sub programa ….)

goto main '(volver a la 1er línea del programa, osea, main)


encendido:

'***************Los bits del SELECTOR, anulan la memorización del piso solicitado********************

IF SELECTOR = 0 THEN

S0=1

ELSE

S0=0

ENDIF


IF SELECTOR = 1 THEN

S1=1         

ELSE

S1=0

ENDIF

 

IF SELECTOR = 2 THEN

S2=1       

ELSE

S2=0

ENDIF


llamadas:

'*************************LLAMADAS Y MEMORIZACIION DE PISO***********************************

if S0=0 and RP0=1 or XP0=1  then

RP0=1

led0=1

else

RP0=0

led0=0

endif


if S1=0 and RP1=1 or XP1=1  then

RP1=1

led1=1

else

RP1=0

led1=0

endif


if S2=0 and RP2=1 or XP2=1  then

RP2=1

led2=1

else

RP2=0

led2=0

endif


'GOTO INICIO

goto main '(volver a la etiqueta “main”)

'END

'**********************CONTADOR/SELECTOR*************************

'Conforme va subiendo de pisos el selector se va incrementando

contar:

'incrementar:

CONTA=CONTA+1 ; INCREMENTAMOS EL contador

IF CONTA=1 THEN

SELECTOR= SELECTOR+1

CONTA=0

ENDIF

If SELECTOR >= 3 Then SELECTOR = 0

goto llamadas


goto main '(volver a la etiqueta “main”)

END

'*****************************ANTIREBOTES*****************************

AR:                   

if XSR =0 then goto ar

return


'***********************************************************************
Viendo el código que se produce con ese engendro de BASIC...está por darme algo...
Mejor voy a vomitar...:sick::sick::sick::sick::sick::sick:

PD: hace mas de 40 años que no uso goto + etiquetas
🤮🤮🤮🤮🤮🤮🤮🤮🤮
No sé por qué lo dices.
Nadie nace sabiendo, y si como novato que soy me sirve el Basic para iniciarme en esto de la programación de los microcontroladores, pues bien venido sea.
A propósito, cuál es el lenguaje que tu utilizas?
Me refiero al de programación.
Saludos!
 
Nadie nace sabiendo, y si como novato que soy me sirve el Basic para iniciarme en esto de la programación de los microcontroladores, pues bien venido sea.
A propósito, cuál es el lenguaje que tu utilizas?
Me refiero al de programación
La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...
 
La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...
No hay problema!
Tomaré en cuenta tus observaciones.
Saludos!
 
Tranqui Oswald, es como el helado, te gustan unos y otros menos,.
Yo por ejemplo, siempre amé a Basic,(compilable o no) porque me permitía resolver pavadas en 10 minutos, que era mi necesidad inmediata, para resolver asuntos de reparar COSAS.
Al C en todas sus versiones, no le tuve paciencia y no me gustaba su sintaxis en general. Tampoco ahora. :giggle:
 
Tranqui Oswald, es como el helado, te gustan unos y otros menos,.
Yo por ejemplo, siempre amé a Basic,(compilable o no) porque me permitía resolver pavadas en 10 minutos, que era mi necesidad inmediata, para resolver asuntos de reparar COSAS.
Al C en todas sus versiones, no le tuve paciencia y no me gustaba su sintaxis en general. Tampoco ahora. :giggle:
Estimado unmonje, gracias por tus comentarios.
Algo parecido me pasa, me siento más cómodo con el lenguaje Basic, pero si tengo oportunidad más adelante si me gustaría curiosear el lenguaje C aunque sea para desanimarme.
Cordial saludo!
 
Última edición:
...y a Python lo odio...
"Ya no te ajunto"* :ROFLMAO:

Soy Pytoniso total, me encanta de la A a la Z

Yo aprendí a programar en basic de los 80, también ensamblador. Pasar a basic estructurado fue fácil, pasar a objetos no tanto.
C medio me aclaro pero nunca me ha gustado. C++ y C# lo justo tirando a "modificar un poco y ya"
He probado java, javascript, pascal... y por último python y claramente me quedo con la serpiente para todo caso y condición.

El resumen sería que hay que aprender de todo para poder elegir, y que a cada uno le irá una u otra cosa. Si no aprendes el lenguaje X no puedes elegir no usarlo, estás obligado a no usarlo porque lo desconoces.

*Es lo que decíamos en el cole a los 5 años cuando nos enfadábamos con un compañero.
 
Hace muuuuchos me decidí a aprender Cobol por que en esa época era bastante bien pagado en aplicaciones de mainframe. No es que me gustara, solo que parecía que valía la pena y era potencialmente rentable poner algo de tiempo ahí...
Compré un pequeño libro ..tipo "Aprenda Cobol para mermos"...y creo que no llegué a la sexta página, cuando ví que había que tabular y usar espacios para una suerte de identado que definía los alcances de las estructuras de control 🤮 🤮🤮🤮
Y en Python es exactamente la misma porquería...
Si...ya sé que los editores se toman el trabajo de hacerlo, pero luego de años de usar delimitadores para las estructuras de control ...sencillamente no soporto su inexistencia 🤷‍♂️
 
Buenos días compañeros.
Como todos ustedes se habrán dado cuenta, soy nuevo en el foro de Picbasic Pro.
Agradezco el haberme permitido pertenecer a este fabuloso foro.

En este punto me gustaría aclarar un par de cosas.
En ningún momento mi intención ha sido que alguien de ustedes haga el programa por mí.
La ayuda que he solicitado es de orientación para saber cómo debo proceder para solucionar mis inquietudes y poder mejorar mi programa.
Si alguien amablemente me proporciona algún código, será para que yo lo analice y pueda utilizarlo como una base para lo que deseo desarrollar.

Agradezco a todas las personas que han respondido, en realidad valoro mucho su colaboración porque han invertido tiempo y paciencia para ayudarme.
Estoy buscando la teoría sobre los temas que me sugirieron tales como interrupciones, banderas, contadores, etc. Si alguien tiene ejemplos de código sobre estos temas donde se pueda aprender a utilizarlos les agradeceré muchísimo.

Para finalizar quiero decir que en relación a mi pregunta sobre el momntacargas, que creo que a más de uno ha confundido, lo que quise consultar es que si es posible detectar un pin de entrada solo en el momento que se produce el cambio de “1” a “0” es decir en el flanco de bajada. De lo que he podido leer al parecer es posible usando una interrupción, pero me gustaría saber si alguien conoce otra manera de hacerlo.
Saludos!
 
Estoy buscando la teoría sobre los temas que me sugirieron tales como interrupciones, banderas, contadores, etc. Si alguien tiene ejemplos de código sobre estos temas donde se pueda aprender a utilizarlos les agradeceré muchísimo.
Sobre este mismo post hay bastantes ejemplos, y en el Foro también.
No necesitas salir cuando lo tienes todo en casa.
 
Sobre este mismo post hay bastantes ejemplos, y en el Foro también.
No necesitas salir cuando lo tienes todo en casa.
Gracias por tu respuesta amigo.
He buscado valga la redundancia con el Buscador que está en la parte superior derecha de la página donde está una lupa, pero me despliega unos resultados que cuando entro se trata de programación en C u otro diferente de Picbasic Pro. Estaré haciendo algo mal al momento de la búsqueda?
 
La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...

... Este tópico no está referido a nada de lo que usas; Sería bueno Doc que tratemos de no desvirtuar el tema. Yo uso también otros lenguajes y sin embargo, me aferró al pedido concreto y al hilo del tópico "PICBASIC PRO"....

Volviendo al tema original, llegó a casa y te escribo unas líneas de ejemplo, pero con unas modificaciones, ya que el contador en caso de ser electrónico, te conviene hacerlo por una interrupción de hardware y un par de banderas para activar y desactivar la interrupción por puerto y no tener falsos disparos.
 
... Este tópico no está referido a nada de lo que usas; Sería bueno Doc que tratemos de no desvirtuar el tema.
Yo solo le respondí lo que el me preguntó:
A propósito, cuál es el lenguaje que tu utilizas?
Me refiero al de programación.
y hasta ahí llegó mi explicación 🤷‍♂️. No escribí ningún ejemplo en C ni en ningún otro lenguaje, así que no creo desvirtuar nada...
 
Volviendo al tema original, llegó a casa y te escribo unas líneas de ejemplo, pero con unas modificaciones, ya que el contador en caso de ser electrónico, te conviene hacerlo por una interrupción de hardware y un par de banderas para activar y desactivar la interrupción por puerto y no tener falsos disparos.
Genial!
Muchas gracias amigo.
Aprecio mucho tu interés en ayudarme.
Perdona el atrevimiento, pero me gustaría pedirte que cuando escribas esas líneas de ejemplo que mencionas, por favor las comentes para de esa manera poder entender mejor y familiarizarme con los términos sobre interrupciones, banderas, etc.
Mientras tanto seguiré leyendo sobre esos temas.
Un Saludo!
 
Buenas noches amigos del foro, espero que todos se encuentren bien.
Primero que nada quiero agradecer a todos por su ayuda desinteresada y de manera especial a los compañeros torres.electrónico, unmonje y D@rkbytes por su tiempo y paciencia.
He leído lo que me recomendaron, es decir sobre las interrupciones y lo puse en práctica, pero no obtuve los resultados deseados, debe ser por mi falta de experiencia, pero valió la pena porque aprendí algo nuevo en el mundo de la programación de PICs con PBP.
Finalmente resolví mi problema colocando un sensor (fin de carrera, etc.) en cada piso y con eso asunto solucionado en cuanto a la llegada al piso.
El paso siguiente será intentar implementar un programa para manejo de dirección, es decir subir y bajar, luego el control de puerta, etc.
Espero contar con su ayuda si tropiezo con alguna dificultad y tengo alguna inquietud.
Adjunto dejo esquema y programa.
Cordial saludo!
 

Adjuntos

  • Foro.rar
    19.7 KB · Visitas: 7
Buenas noches amigos del foro, espero que todos se encuentren bien.
Primero que nada quiero agradecer a todos por su ayuda desinteresada y de manera especial a los compañeros torres.electrónico, unmonje y D@rkbytes por su tiempo y paciencia.
He leído lo que me recomendaron, es decir sobre las interrupciones y lo puse en práctica, pero no obtuve los resultados deseados, debe ser por mi falta de experiencia, pero valió la pena porque aprendí algo nuevo en el mundo de la programación de PICs con PBP.
Finalmente resolví mi problema colocando un sensor (fin de carrera, etc.) en cada piso y con eso asunto solucionado en cuanto a la llegada al piso.
El paso siguiente será intentar implementar un programa para manejo de dirección, es decir subir y bajar, luego el control de puerta, etc.
Espero contar con su ayuda si tropiezo con alguna dificultad y tengo alguna inquietud.
Adjunto dejo esquema y programa.
Cordial saludo!
¿ Como funciona una interrupción ?
Se debe aclarar que es una tarea relativamente compleja, muy detallada, pero muy eficaz a la vez.
En ella pierde el programador el control lineal del programa, para ganar en eficacia y seguridad.

Los dispositivos que aceptan este tipo de recursos, lo hacen de varias manera pero todos se comporta de manera semejante al ejemplo que describo a continuación a saber :

1- Se lee toda la documentación respecto de las interrupciones en la hoja de datos del dispositivo elegido.
2- En la hoja de datos se aclaran los diferentes tipos de interrupciones de ese dispositivo (PIC, micro, etc)
3- En la hoja de datos figuran las dirección de memoria donde se atienden ESAS interrupciones.

4- En muchas PICs simples, por ejemplo, esa dirección de memoria suele ser 0x0004 hexa del banco 0 de memoria. En otros micros, hay varias direcciones de salto, varias interrupciones o todo es mas complejo.
5- La interrupción es inmediata y ocurre por hardware inmediatamente, ni bien se cumpla la condición de salto, por ende cuando se salta a la interrupción, al llegar a ella lo primero que se hace es guardar todos los registros de memoria, con los que se estaba trabajando, al momento de la interrupción.
Eso se hace con la instrucción PUSH X,RX , que guarda el registro X del Pic en el STACK RX1 por ejemplo.
6- Terminado los PUSH, se escribe el codigo donde se resuelve la interrupción. Se termina relevando el bit de interrupción y antes de retornar al lugar donde se estaba ejecutando el codigo de programa anterior, se deben recuperar los datos con los que se estaba trabajando mediante las instrucciónes POP RX1,X que hubiera, finalmente se ejecuta la instrucción RETURN INT para volver al programa principal, como si nada hubiera ocurrido. 👇 Ver abajo

ver esto
 
Buenos días a los Amigos del Foro.
Como dijo Dario en otra parte, solo nos acordamos del Foro de Electrónica cuando necesitamos algo, jajaja, bueno.
Tengo un Programita en PICBasic Pro que, con PIC16F877A funciona correctamente, pero cuando quiero hacerle funcionar con un PIC18F452, no me compila, me dice que tengo un error de sintaxis en el OPTION_REG:
¿Por qué? ¿Cuál es la palabra clave en MicroCode Studio para continuar con el proyecto?
Gracias.
Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2023 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 17/08/2023                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

    Define Osc 20               ; Define el Oscilador para un Cristal
    
    ADCON1 = 7
    TRISA = 0
    TRISE = 0
    TRISC = 0
    TRISD = 0

    I Var Word                  ; Declaración de la variable “I” tipo Byte.
    OK Var Byte                 ; Variable OK para igualar a la Variable I que regresa de la conversion del TMR0 CON 1 seg.
    OK = 0
    TIEMPO_FASE1 Var Byte
    TIEMPO_FASE2 Var Byte
    TIEMPO_FASE1 = 5
    TIEMPO_FASE2 = 7

    On Interrupt GoTo retardo   ; Define el vector de Interrupción
    
    Symbol TOIF = INTCON.2      ; Alias para el bit 2 del registro INTCON.
    Symbol GIE = INTCON.7       ; Alias para el bit 7 del registro INTCON.
    Symbol LED = PORTA.0        ; Alias para el pin RA0
    Symbol LEDR = PORTA.1
    Symbol LEDY = PORTA.2
    Symbol LEDG = PORTA.3

    OPTION_REG = %00000111      ; Configuración del Registro OPTION
    INTCON = %10100000          ; Configuración del Registro INTCON

PROGRAMA_2FASES:
    Disable
    i = ok           

Inicio:
    If OK = TIEMPO_FASE1 Then paso11
    ok = ok + 1     
    PORTA = %00001100
    PORTC = %00000110
    PORTD = %00001000
    PORTE = %00000001
    Call retardo
    GoTo inicio

paso11:
    ok = 0

paso1: 
    If OK = 3 Then paso22
    ok = ok + 1
    PORTA = %00001010
    PORTC = %00000110
    PORTD = %00001000
    PORTE = %00000001
    Call retardo
    GoTo paso1
        
paso22:
ok = 0             

paso2:
    If OK = TIEMPO_FASE2 Then paso33
    ok = ok + 1
    PORTA = %00100001
    PORTC = %00000001
    PORTD = %00000110
    PORTE = %00000100
    Call retardo
    GoTo paso2

paso33:
    ok = 0             

paso3:
    If OK = 3 Then retea
    ok = ok + 1
    PORTA = %00100001
    PORTC = %00000001
    PORTD = %00000101
    PORTE = %00000010
    Call retardo     
    GoTo paso3

retea:
    ok = 0       
    GoTo INICIO       

Retardo:
    For I = 1 To 1000           ; Repetimos la interrupción 1000 veces para obtener un retardo de 1 segundo.
        Call Retardo1
    Next I
    Return

Retardo1:
    TMR0 = 236                  ; Cargamos el dato en TMR0

Espera:
    If TOIF = 1 Then Reseteo    ; pregunta si TOIF es igual a 1, es decir,
                                ; pregunta si TMR0 se desbordo.
    GoTo Espera                 ; Salta a la etiqueta “Espera”.

Reseteo:
    TOIF = 0                    ; Inicializa la bandera TOIF
    Return
    Resume

    End
 

Adjuntos

  • WhatsApp Image 2023-08-27 at 8.11.04 AM.jpeg
    WhatsApp Image 2023-08-27 at 8.11.04 AM.jpeg
    169.8 KB · Visitas: 7
Última edición por un moderador:
Tengo un Programita en PICBasic Pro que, con PIC16F877A funciona correctamente, pero cuando quiero hacerle funcionar con un PIC18F452, no me compila, me dice que tengo un error de sintaxis en el OPTION_REG:

¿ Sera porque el PIC18F452 no posee el registro OPTION ?

Mejor lee las hojas de datos para configurar bien ese microcontrolador o volverás preguntando porque el programa no corre bien una vez que logres compilarlo. :LOL:
 
Atrás
Arriba