Curso de programación de PIC en PICBasic Pro

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
 
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
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.
 
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.
 
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.
 
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
 
Les dejo y comparto estás librerías para manejo de display i2C.
Observen que son dos archivos, uno corresponde para pbp2.6 y el otro para las versiones pbp3.0
Me estoy tomando el trabajo de buscar librerías para pbp de shield Arduino; Seria bueno ir acopiando con ejemplos para quien lo necesite
 

Adjuntos

  • IIC_LCD_PBP3.zip
    20.1 KB · Visitas: 15
  • PCF8574_LCD_PBP260.zip
    18.5 KB · Visitas: 21
Que tal buenas tardes, estoy trabajando con un sensor de temperatura y humedad amt1001, éste sensor cuenta con 2 cables de salida uno para humedad y el otro para temperatura, el de humedad trabaja con voltaje de salida mientras el de temperatura trabaja con un termistor ntc de 10k.
M
i problema es que no se como hacer funcionar el de temperatura, no se como va programado.
 
Puedes conectar una resistencia adicional como divisor de tension para que tu uC pueda leer el valor analógico.
Gracias, y en la programación como sería para que me de las lecturas en grados centígrados ?

E
n la hoja de datos me aparece ésto pero hasta aquí estoy atorado de como leer los datos.

Table 6: 10K NTC B.3435 temperature and resistance correspondence table

Temperature(℃)01020304050607080
Resistance(kΩ)27.9018.2212.128.315.804.123.002.211.66
 
Buen día.
El sensor que uso es el AMT1001 tiene temperatura por NTC 10K y humedad como salida máxima 3V.

Estuve trabajando con el código y tengo problemas, las lecturas están fluctuando mucho.
Alguien que de un vistazo y ver qué estoy haciendo mal.

Saludos y gracias.

Código:
TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA

ADCON1=14  ; DECLARAR QUE LAS ENTRADA ra0 son analogico

SENSAR VAR word
DIGITAL VAR WORD

SENSAR=0
DIGITAL=0

PORTA=0
PORTB=0
PORTC=0

INICIO:

ADCIN 0,DIGITAL
SENSAR=150* DIGITAL
SENSAR=SENSAR/100
PAUSE 500
LCDOUT $FE,1  
LCDOUT $FE,2,"Tem" 
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "C"
PAUSE 500


GOTO INICIO
 
Disculpa pero así no se entiende nada.

No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.

En la lógica de la matemática y sin entrar en mucho detalle multiplicas una variable por 150 y luego la divides por 100, pregunto no será mas rápido y eficiente que tú apliques algo de matemática básica y multipliques por 15 y dividas por 10 que no alterara el resultado?.

Si trabajas con sensores analógicos y sin respuesta lineal o de alguna formula estándar conocida, tienes dos alternativas que se me ocurre o trabajas con una tabla almacenada y comparas la entrada con la tabla o encuentras una formula matemática que defina la curva que represente a tu sensor en funcionamiento con la precisión que desees.
 
Disculpa pero así no se entiende nada.

No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.

En la lógica de la matemática y sin entrar en mucho detalle multiplicas una variable por 150 y luego la divides por 100, pregunto no será mas rápido y eficiente que tú apliques algo de matemática básica y multipliques por 15 y dividas por 10 que no alterara el resultado?.

Si trabajas con sensores analógicos y sin respuesta lineal o de alguna formula estándar conocida, tienes dos alternativas que se me ocurre o trabajas con una tabla almacenada y comparas la entrada con la tabla o encuentras una formula matemática que defina la curva que represente a tu sensor en funcionamiento con la precisión que desees.

Que tal perdón por no poder mas datos
Dejo los de mas datos que me faltan

utilizo un Pic 16f876A
El sensor de Humedad es lineal y trabaja con un voltaje de salida de 0 a 3V y Humedad de 0 a 100%

El pin del sensor lo coloco en el pin 2 de micro ADC

Tengo el siguiente problema:

tengo valores muy cercanos ya que estoy comprobando con un multtimetro de temperatura y humedad uni-t
pero me esta saltando mucho por ejemplo: esta en 18 y pasa al 22 después que esta en 22 baja a 15
Y no se mantiene estable sube o baja mucho

el código es el siguiente:

Código:
INCLUDE "MODEDEFS.BAS" ; LIBRERIA PARA OCUPAR LA COMUNICACIÓN SERIAL
define LOADER_USED 1
DEFINE OSC 20 ;DEFINIR EL OSCILADOR EN 20 MHz (HS)
DEFINE ADC_BIST 10  ;DEFINE LA RESOLUCION  DEL ADC
DEFINE ADC_CLOCK 3  ;1-LP 2-XT 3-HS
DEFINE ADC_SAMPLEUS 50 ;TIEMPO QUE TARDA LA SEÑAL EN CONVERTIR LA SEÑAL ANALOGICA A DIGITAL
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA

ADCON1=14 

SENSAR VAR word
DIGITAL VAR WORD

SENSAR=0
DIGITAL=0

PORTA=0
PORTB=0
PORTC=0

INICIO:

ADCIN 0,DIGITAL
SENSAR=299*DIGITAL  ; los 250 es sacando del sensor * 255 que nos da el digital 
SENSAR=SENSAR/250  ; los 250 dividido y me da la humedad
pause 1000
LCDOUT $FE,1   
LCDOUT $FE,2,"humedad" 
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "%"
PAUSE 1000


GOTO INICIO
 
Atrás
Arriba