Curso de programación de PIC en PICBasic Pro

torres.electronico

Well-known-Alfil
Hace un tiempo alguien compartió en este tópico un dimmer. Lo estoy buscando y no lo encuentro. Alguien se acuerda quien lo compartió?
 

torres.electronico

Well-known-Alfil
Solo me acuerdo que tenía dos versiones, con potenciómetro o con pulsadores; La idea es verlo y modificarlo para reciclar dos motores de portón que tiene un bta16-600
 
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
 

torres.electronico

Well-known-Alfil
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: 7
Justiniano para un PIC de 8 pines....2 de los relay, mas dos de los switch, mas disparo triac, mas entrada de detección cruce por cero, mas dos de alimentación igual 8 pines.

Si no hay necesidad de impresión/salida display, el programa en sí en el compilador Proton lleva unas 373 palabras como esta, entrara en uno de 8 pines tranquilamente.
 

torres.electronico

Well-known-Alfil
Recién saque humito del triac; grabé una prueba sencilla con tres estados o intencidades y al parecer debo de haber borrado la calibración del osc por qué sacó humo :cry: ... Lo probé en un 16f628 y osc externo y anda lo más bien ese mini programa. Voy a ver si me hago de un tiempo para colectar más info y hacer todo directamente en el pic de18 pines. Termino y comparto
 
Hace un tiempo alguien compartió en este tópico un dimmer. Lo estoy buscando y no lo encuentro. Alguien se acuerda quien lo compartió?

Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.

El archivo de simulacion esta en proteus 8.5 SP0.

Ya mi proximo reto es hacerlo para variar motores a 220V AC.

Cordial saludo.

Juan Camilo Cardona

Hola torres!
Yo postee este dimmer hace algún tiempo.
 

torres.electronico

Well-known-Alfil
Hola Juan, gracias. Ayer arme un dimmer convencional con triac y diac para sacarme la duda y no logré modificar la velocidad. Probé algunas ideas de 2M pero justo no tenía un capacitor de 10u para ponerlo en serie... Probé con uno de 2.5 y el motor hacía ruido de que quería más morro, pero estoy pensando en hacer una especie de rampa para simular el control de velocidad; Al ser una carga inductiva, tengo un tiempo dado en que el bobinado mantiene la energía.... Quizás haciendo un tren de pulsos dentro de la zona de conducción me haga un fenómeno similar al que quiero replicar
 
Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
Este es mi programa:
Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'tacometro LCD y pic 16f628a                                    '

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

CMCON = 7                               'Comparadores Apagados

TRISB = %00000000

PORTB = 0

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


@ DEVICE pic16F628A, LVP_OFF

@ DEVICE pic16F628A, PWRT_ON

@ DEVICE pic16F628A, BOD_ON

@ DEVICE pic16F628A, CPD_OFF

@ DEVICE pic16F628A, PROTECT_OFF

@ DEVICE pic16F628A, WDT_ON

@ DEVICE XT_OSC     

define osc 4       


' DEFINICIÓN DE REGISTROS PARA EL LCD

Define LCD_DREG PORTB

Define LCD_DBIT 4 

Define LCD_RSREG PORTB

Define LCD_RSBIT 0

Define LCD_EREG PORTB

Define LCD_EBIT 1 



TRISB=0                       

                    

taco var word                 


PAUSE 100                     


tacometro:                       

count porta.1,1000,taco       

taco=(taco*60)                 

lcdout $fe,1, "    SPINDLE     "

lcdout $fe,$c2,dec taco       

lcdout $fe,$c9,"R.P.M."       


pos var byte

cont var byte

servo1 var porta.1

potein var porta.0


pote:

Pot potein, 255,pos

for cont = 0 to 50

pulsout servo1,pos

pause 15

next cont

goto pote


GOTO tacometro                   

end
A ver si me pueden ayudar.
Les agradezco de antemano.
 

torres.electronico

Well-known-Alfil
Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
Este es mi programa:
Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'tacometro LCD y pic 16f628a                                    '

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

CMCON = 7                               'Comparadores Apagados

TRISB = %00000000

PORTB = 0

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


@ DEVICE pic16F628A, LVP_OFF

@ DEVICE pic16F628A, PWRT_ON

@ DEVICE pic16F628A, BOD_ON

@ DEVICE pic16F628A, CPD_OFF

@ DEVICE pic16F628A, PROTECT_OFF

@ DEVICE pic16F628A, WDT_ON

@ DEVICE XT_OSC    

define osc 4      


' DEFINICIÓN DE REGISTROS PARA EL LCD

Define LCD_DREG PORTB

Define LCD_DBIT 4

Define LCD_RSREG PORTB

Define LCD_RSBIT 0

Define LCD_EREG PORTB

Define LCD_EBIT 1



TRISB=0                      

                   

taco var word                


PAUSE 100                    


tacometro:                      

count porta.1,1000,taco      

taco=(taco*60)                

lcdout $fe,1, "    SPINDLE     "

lcdout $fe,$c2,dec taco      

lcdout $fe,$c9,"R.P.M."      


pos var byte

cont var byte

servo1 var porta.1

potein var porta.0


pote:

Pot potein, 255,pos

for cont = 0 to 50

pulsout servo1,pos

pause 15

next cont

goto pote


GOTO tacometro                  

end
A ver si me pueden ayudar.
Les agradezco de antemano.
En este mismo tema compartieron hace un tiempo un ejemplo de contador con TOKI
 
Arriba