Curso de programación de PIC en PICBasic Pro

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.
 
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: 32
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
 
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: 13
Última edición:
Si quieres hacerlo con pulsadores tan sol hay que modificar el main loop, quitar el Espera = ... y poner otra función en su lugar, la que queráis.
Leer el potenciómetro es lo mas universal.
 
Yo encontré este de aquí que esta en Proton Basic pero para un 16F84A....migrarlo a otro PIC del tipo no implica mucho trabajo pero es con pulsadores y la rutina de impresión deja mucho que desear.

En su momento yo lo acomode a mi gusto de esta forma
Código:
'****************************************************************
'*  Name    : Dimmer_16F84A.BAS                                 *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 10/08/2014                                        *
'*  Version : 2.0                                               *
'*  Notes   : Mod by RicBevi                                    *
'*          :                                                   *
'****************************************************************
 Device 16F84A
 Xtal=4
 EData 30
 On_Hardware_Interrupt GoTo Interrupcion        ' Cuando ocurre la interrupcion salta a Interrupcion
 
 Symbol T0IE = INTCON.5                         ' Habilitacion TMR0
 Symbol T0IF = INTCON.2                         ' Flag TMR0
 Symbol GIE  = INTCON.7                         ' Interrupciones globales habilitadas
 Symbol INTF = INTCON.1                         ' Flag rb0
 Symbol INTE = INTCON.4                         ' Habilitar interrupcion b0
 Symbol T0CS = OPTION_REG.5                     ' Timer0 reloj interno o externo
 Symbol INTEDG = OPTION_REG.6                   ' Flanco ascendente rb0
 
 Input PORTA                                    ' Puerto A como entrada de pulsadores en A.0 y A.1
 Output PORTB                                   ' Puerto B como salida
 Input  PORTB.0                                 ' Puerto B.0 como entrada
 
 Symbol Triac = PORTB.1                         ' Salida triac en B.1
 
Declare LCD_DTPin  PORTB.4                      ' Puerto B salida datos B4 B5 B6 B7
Declare LCD_RSPin  PORTB.2                      ' Puerto B1 pin rs del lcd
Declare LCD_ENPin  PORTB.3                      ' Puerto B2 pin Enable del LCD
Declare LCD_Interface = 4                       ' Configuracion LCD
Declare LCD_Lines 2                             ' Configuracion LCD
Declare LCD_Type 0                              ' Configuracion LCD
 
 Dim Porcentaje As Byte
 Dim contador As Byte
 Dim PorcentajeV As Byte                         ' Valor antiguo de la variable para comparacion

 GoTo Inicio:                                   ' Ir a inicio
   Context Save                           
Interrupcion:   
          ' Context Save                        ' Interrupcion     
    If INTF = 1 Then                            ' Si se produjo la interrupcion de portb0
        Low    Triac                            ' Apago el triac
        INTE = 0                                ' Desabilito interrrupcion rb0
        INTF = 0                                ' Borro el flag de rb0
        contador = 100 - Porcentaje             ' Contador es una variable que se usa para
                                                'generar el retardo desde el punto cero hasta
                                                'el disparo es igual a porcentaje + 10 \'
                                                'ya que 10 es 1ms demora del transistor antes de cero
        TMR0 = 165                              ' El timer deberia ser de 100 pulsos cada vez osea
                                                '255- 100 + algunas instrucciones  que ya pasaron
        T0CS = 0                                ' El timer cuenta con el reloj interno comienza a contar
        T0IE = 1                                ' Abilito la interrupcion del timer
    ElseIf  T0IF = 1 Then                       ' Si se desbordo el timer
        T0IF = 0                                ' Borro el flag del timer
        TMR0 = TMR0 + 150                       ' Cargo Timer con el valor actual mas 150 que serian 100 instrucciones de resto
        Dec contador                            ' Decremento contador
        If contador = 0 Then                    ' Si contador = 0
           T0IE = 0                             ' Desabilito la interrupcion del timer
           INTE = 1                             ' Habilito la interrupcion RB0
           High   Triac                         ' Prendo el triac
        EndIf
     EndIf   
Context Restore                                 ' Restaurar variables y volver al lugar donde se detuvo

Inicio:
    Porcentaje = ERead 0                         ' Leo posicion 0 de eeprom
    GIE  = 1                                     ' Habilito interrupcion general
    INTE = 1                                     ' Habilito interrupcion RB0
  
programa:
 
   Print At 1,1, "Porcentaje "
      
program1:
   If Porcentaje <> PorcentajeV Then
     Print At 1,14, Dec2 Porcentaje
      PorcentajeV = Porcentaje
   EndIf
   DelayMS 100
If PORTA.1 = 1 And  Porcentaje < 99 Then
    Inc Porcentaje
    EWrite 0, [Porcentaje ]   
ElseIf PORTA.0 = 1 And Porcentaje > 1 Then
    Dec Porcentaje
    EWrite 0, [Porcentaje ]
End If
GoTo program1

End
 
Déjame ver cómo lo meto en algún pic de 8 pines para hacer algo bien chico y aprovechar el resto del hardware que viene en los dos motores... Prácticamente la tengo fácil, solo necesito controlar dos relay, leer dos switch y disparar el moc3022 que dispara el triac... La reforma mecánica es hacer una barrera vehicular, pero está complicado hacer los engranajes, así que voy a jugar con bajarle la velocidad lo más que pueda (hasta notar que pierde par motor) para ver si puedo moverlo 45grados
 

Adjuntos

  • IMG-20200923-WA0012.jpeg
    IMG-20200923-WA0012.jpeg
    155.8 KB · Visitas: 10
Atrás
Arriba