Curso de programación de PIC en PICBasic Pro

No estan adjuntados los que subi? bueno no los ejecuta?
Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador :(

Si el trabajo así se lo pide debe hacerlo así para cumplirlo pero no pretenda que lo que aplica a nivel de software para el circuito con un codificador binario a 7 segmentos sea idéntico al que no lo tiene.

Estoy refiriéndome a lo que subió en el adjunto Ciruito3.rar.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISB = 0
PORTB = 0

TRISC = 0
PORTC = 0
'DECLARACION DE VARIABLES
i VAR BYTE
a VAR BYTE
b VAR BYTE



un0 VAR a.0
un1 VAR a.1
un2 VAR a.2
un3 VAR a.3

de0 VAR b.0
de1 VAR b.1
de2 VAR b.2
de3 VAR b.3



INICIO:
FOR i=99 TO 0 STEP -1
b=i/10
a=i-b*10

PORTB.0=un0
PORTB.1=un1
PORTB.2=un2
PORTB.3=un3  

PORTC.0=de0
PORTC.1=de1
PORTC.2=de2
PORTC.3=de3


PAUSE 500
NEXT i
GOTO INICIO

Los archivos incluidos no corresponde el hex al pbp que contienen.

El archivo hex se ejecuta con la falla del dígito de la decena pero no se puede analizar o reformar nada por que no corresponde al archivo pbp que se encuentra allí(ver código subido).

Tal vez soy yo que no veo donde convierte de binario a 7 segmentos en dicho software y usted me lo puede indicar.

Tabla que contiene el codificador binario a 7 segmentos 7447 y que se debe implementar en el software si no se lo quiere usar.

Ca.JPG

Por cierto también es de buena practica realizar comentarios de que se esta haciendo en el programa para ayudar al otro a comprender que se esta realizando y en el futuro para uno mismo, ver de que forma lo hacia.

Simulacion

Captura.JPG

Donde se aprecian todas y cada una de las fallas que le advertí anteriormente(cristal, uso erróneo del puertoD cuando el software usa el C, etc).
 
Última edición:
Buenas noches.
soy nuevo en esto del PIC12F635, me podrian brindar una mano con alun ejemplo sencillo , como por ejemplo encender un led. por que la verdad no tengo idea de como configurar a sus pines de salida ni como cambiarles de nombre. Dicho sea de paso programo en Pic Basic Pro.

Pd:
Por experiencias en otros Pic se que para cambiar de nombre a un pin en especifico que quiero como salida,en este caso un led ,hago lo siguiente:
LED1 VAR PORTC.5 o SYMBOL LED1 = PORTC.5

En el PIC12f635 como llamaria a sus pines de salida.?!

Gracias de ante mano.
 

D@rkbytes

Moderador
¿En el PIC12F635 cómo llamaría a sus pines de salida?
En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA
¿Me podrían brindar una mano con algún ejemplo sencillo, como por ejemplo; encender un LED?
High Pin para establecer un estado alto y Low Pin para establecer un estado bajo.

Ejemplos sobre LED con PIC en PICBasic existen muchos en el Foro.
 
Gracias por la respuesta D@rkbytes
Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.

En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA

Encontre tambien este programa: (otra manera de llamar a los pines del PIC)

Código:
X VAR BYTE              ;crea variable de 255
 
 trisio=%110111               ;todos los pines gpio son de salida

 INICIO:
    FOR x=1 TO 5     
    HIGH gpio.0            ;encender el led del pin gpio.1
    PAUSE 300     
    LOW gpio.0
    PAUSE 300
    NEXT X
        
    GOTO INICIO
    
 END
 

D@rkbytes

Moderador
trisio=%110111 ;todos los pines gpio son de salida
No, ahí solo se está declarando que GPIO.3 sea salida.
Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "High Pin" lo convierte en salida, por eso el programa funcionará.
Por lo tanto, quedó de sobra configurar los pines con TRISIO
Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.
Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.
Claro, en la hoja de datos se encuentra esa información, algo que ahora muchos olvidan.
Port References.jpg
 
No, ahí solo se está declarando que GPIO.3 sea salida.
Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "High Pin" lo convierte en salida, por eso el programa funcionará.
Por lo tanto, quedó de sobra configurar los pines con TRISIO
Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.

Claro, en la hoja de datos se encuentra esa información, algo que ahora muchos olvidan.
Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin.
Ayudame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el pic.
 

D@rkbytes

Moderador
Por defecto en todos los PIC los pines están configurados como entradas.
Así que si todo un puerto se necesita como entrada, no tendrá caso escribir TRISA = %11111111 porque será redundante.
Si no se usan, no captan ruidos, ni afectan al programa como muchos piensan y por eso configuran como salidas los pines que no van a usar.
Un pin que no se usa no tiene porqué afectar al programa, puesto que su sistema lógico es independiente.
Como ejemplo: si un pin estuviera recibiendo datos seriales, no tiene porqué interferir con el resto.
Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin.
Eso tampoco tiene sentido, ya que siendo el Master Clear o Reset, siempre será entrada, así que configurarlo como salida no tiene sentido.
Si no lo piensas tocar, simplemente no lo usas sabiendo que no se puede, a menos que pueda ser entrada digital como en algunos PIC.

Ayúdame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el PIC
Eso no requiere ayuda, simplemente configuras lo que requieras que sea salida y entrada y posteriormente les asignas un estado.
El uso del registro TRISIO es cuando piensas darle un estado al pin directamente sin el uso de las instrucciones "High Pin", "Low Pin" o "Toggle Pin"
Esas instrucciones como mencioné anteriormente configuran el pin como salida haciendo uso de los registros TRISx
O sea que si voy a escribir "GPIO.2 = 1" entonces sí se debe usar el registro TRISIO y configurar GP2 como salida.
TRISIO = %11111011 o TRISIO.2 = 0
 
Estimado D@rkbytes, buenas noches.
¿Có
mo podría yo configurar el PIC para que por más que esté encendido no ejecute el programa hasta después de unos minutos, o quizás agregarle una especie de tiempo de retardo?

Esto lo hago por protección en caso de apagones.
Código:
SYMBOL  LED1       = PORTB.0
SYMBOL  MOTOR      = PORTB.1
TRISB=0

Motor_1:
    high MOTOR          
    pause 8000      
    low MOTOR            
    pause 2000        
    GOTO Motor_1
   
END
 

D@rkbytes

Moderador
Con alguno de los timers, te recomiendo el Timer1 porque es de 16 bits, lo cual permite realizar retardos más grandes.
Lo configuras para que desborde cada 10 o 100 mS y haces cuentas conforme al tiempo que quieras.
Por cada desborde incrementas un contador y cuando llegue a X conteo activas una bandera que comprobarás dentro del bucle principal del programa.

Algo similar comenté por aquí: Timer con PIC12F629. Tiempos
 
D@rkbytes

Disculpa la molestia pero, me podrías ayudar con algun ejemplo, por favor.

Te comento estuve averiguando sobre como hacer para no ejecute el programa y me encontre con el comando SLEEP

SLEEP 60 ; duerme por aprox. 1 minuto.

se puede usar esto o queda mejor con el Timer1.?

Gracias de antemano.
 

D@rkbytes

Moderador
Sí se puede usar pero sería igual que usar "Pause", de todos modos congelaría al microcontrolador durante el tiempo establecido.
Por eso es mejor usar los Timers.

Adjunto un ejemplo usando la interrupción por desborde del Timer 1
 

Adjuntos

  • 12F635 Temporizador de tiempos largos.rar
    36.7 KB · Visitas: 14
Estimado D@rkbytes

Adjunto un ejemplo usando la interrupción por desborde del Timer 1

Intente llevar tu programa al PIC 16f628A ,y no me activa la pantalla LCD, sin embargo si enciende el led1 despues de terminar el tiempo que en este caso es 5 segundos pre-establecidos.
No se que podría estar haciendo mal.

Este es el código:

Código:
@ __CONFIG _FOSC_INTOSCIO & _WDT_OFF & _PWRTE_ON & _LVP_OFF

Define OSC 8                ; Definir que se trabajará con 8 MHz.

 ; Definición de pines para la pantalla.
Define LCD_DREG PORTB        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTA        ; Puerto de RS (Register Select)
Define LCD_RSBIT    0        ; Pin para RS
Define LCD_EREG PORTA        ; Puerto de E (Enable)
Define LCD_EBIT     1        ; Pin para E

  Symbol LED1 = PORTA.2        ; LED indicador de tiempo 1 en RA2
  Symbol LED2 = PORTA.3        ; LED indicador de tiempo 2 en RA3

Pre_Timer1    Var Word        ; Variable para el valor de precarga del Timer 1
Ticks_T1    Var Byte        ; Variable para contar los desbordes del Timer 1
Cont_Segs    Var Word        ; Variable para contar segundos
Tiempo_Segs    Var Word        ; Variable para establecer el tiempo deseado en segundos
Flag_Tiempo    Var Bit            ; Variable bandera para indicar tiempo completado

inicio:
    TRISA = 1
    TRISB=1
    ; Configurar el Timer 1
    T1CON = %00111101            ; Prescaler 1:8
    Pre_Timer1 = 40536            ; Para que desborde cada 100 mS @ 8 MHz.
    TMR1H = Pre_Timer1.HighByte    ; Precargar el byte más significativo en el Timer 1
    TMR1L = Pre_Timer1.LowByte    ; Precargar el byte menos significativo en el Timer 1
    PIE1.0 = 1                    ; Activar la interrupción por desborde del Timer 1
    
    INTCON = %11000000
    
    Tiempo_Segs = 5                ; Establecer el tiempo deseado en segundos.
    Flag_Tiempo = 0                ; Inicializar la bandera "Flag_Tiempo" en 0
    
    On Interrupt GoTo Servicio_Interrupciones
  
    LCDOut $FE,1    ; Inicializa o borra la pantalla.
    
Programa:
    ; Dentro del bucle principal no deben existir retardos.
    
    If Flag_Tiempo = 1 Then        ; Si se cumplió el tiempo establecido...
        ; Aquí se ejecutaría el programa cuando se cumpla el tiempo establecido.
        ; Esto es como ejemplo pero no se deben usar retardos dentro del bucle
        ; porque afectarían la operación continua del Timer 1
    
    high led1
    
    LCDOUT $FE,$80, " * Welcome * "   ;limpiar pantalla y sacar el texto
    LCDOUT $FE,$C0, " Prueba No. 01"  ;pasar al comienzo de la segunda línea
        
    Flag_Tiempo = 0            ; Indicar que ya se ejecutó el programa.
    EndIf
    
    ; Dentro del bucle principal no deben existir retardos.
    
    GoTo    Programa
    
Servicio_Interrupciones:
    Disable
    
    If PIR1.0 = 1 Then            ; Ocurrió un desborde del Timer 1
        Ticks_T1 = Ticks_T1 + 1    ; Incrementar la variable "Ticks_T1"
        If Ticks_T1 > 9 Then    ; Cuando llegue a 10 es porque se cumplió un segundo.
            Cont_Segs = Cont_Segs + 1    ; Incrementar la variable "Cont_Segs"
            Ticks_T1 = 0        ; Regresar la variable "Ticks_T1" a 0
        EndIf
        ; Si la variable "Cont_Segs" es igual a la variable "Tiempo_Segs"...
        If Cont_Segs = Tiempo_Segs Then
            Cont_Segs = 0        ; Regresar la variable "Cont_Segs" a 0
            Flag_Tiempo = 1        ; Indicar que se ha cumplido el tiempo establecido.
        EndIf
        
        PIR1.0 = 0                ; Limpiar la bandera TMR1IF
        ; Recargar el Timer 1
        TMR1H = Pre_Timer1.HighByte    ; Precargar el byte más significativo en el Timer 1
        TMR1L = Pre_Timer1.LowByte    ; Precargar el byte menos significativo en el Timer 1
    EndIf
    
    Resume
    Enable

    End
 
Pasar de un PIC a otro no es solo cambiar la cabecera. En muchas ocasiones hay que leer atentamente la hoja de datos de los dos PIC y ver si son 100% compatibles.

En este caso el 16F628 solo tiene oscilador interno de 4MHz y por defecto arranca con los pines de los puertos con los comparadores analógicos activado, etc y no veo que los desactives.

Código:
Define OSC 4                ; Definir que se trabajará con 4 MHz.
cmcon = 7                   ' apago comparadores analogicos

Todo esto es en general y en particular de ese programa seguramente te contestara el tocayo.

Para cuando hagas una consulta deberías ofrecer el archivo de la simulación, el archivo fuente y el hex ya compilado todo dentro de un archivo comprimido para ver que es lo que estas haciendo.

Saludos.

Ric.
 
Buenas tardes
Ando buscando implementar un conversor rs232 a rs485, encontre este diagrama, lo implementé, sin embargo no me esta funcionando. por lo que leí este diagrama es bi-direccional.

Si alguien me pudiera ayudar seria excelente.

Gracias.
1600458858484.jpeg
 

torres.electronico

Well-known-Alfil
Buenas tardes
Ando buscando implementar un conversor rs232 a rs485, encontre este diagrama, lo implementé, sin embargo no me esta funcionando. por lo que leí este diagrama es bi-direccional.

Si alguien me pudiera ayudar seria excelente.

Gracias.
Ver el archivo adjunto 196574
Algo parecido hice pero sin la conexión de rts, déjame ver dónde tengo la protoboard para verificar
Este es el que arme (el de Lucas ) Conversor RS232 a RS485 – Automatismos Mar del Plata
Pero déjame ver dónde tengo armado en el protoboard por qué algo le modifique
 

Adjuntos

  • rs232-rs485-converter.rar
    326.7 KB · Visitas: 5
Última edición:
Arriba