Curso de programación de PIC en PICBasic Pro

D@rio

Mi pregunta es la siguiente: puedo o no puedo generar una señal de 38khz con un pic16f628 con clock interno mediante la instruccion freqout???

Darío es mejor utilizar el CCP1CON y configúralo de la siguiente manera:

****** Coneccion pic 16f628a******
'B3(P9) - 38KHz de salida
'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
'B2(P8) SWup --> pull-up (to 5V) via 4,7K --> a GND si esta presionado

'******* Programa ******
CMCON=7 '
VRCON=0 'A/D voltage reference disabled
TRISB=%11110110 'B.3=PWM ssalida, B.0=Control o, B.1&2=pulsadores
PR2=25 'Seleccion PWM a 38KHz ciclo util
CCP1CON=%00001100 'PWM modo de seleccion PWM?ON/OFF
T2CON=%00000100 'Timer2 ON + 1:1 prescale

SWdown var PORTB.1 'para la generación de patrones de pulsos (SW = switch)
SWup var PORTB.2 'para la generación de los patrones de impulsos
Puesto con ello se genera una onda de 38 Khz precisa y por medio de registros del mismo PIC. Para mayor entendimiento te dejo un programa que emite por el pin B3 del pic 16f628A la frecuencia para utilización de sensores infrarrojos frecuencia ajustable por dos pulsadores ubicados en b1 y b2 respectivamente:
'****** Coneccion pic 16f628a******
'B3(P9) - 38KHz de salida
'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
'B2(P8) SWup --> pull-up (to 5V) via 4,7K --> a GND si esta presionado

'******* Programa ******
CMCON=7 '
VRCON=0 'A/D voltage reference disabled
TRISB=%11110110 'B.3=PWM ssalida, B.0=Control o, B.1&2=pulsadores
PR2=25 'Seleccion PWM a 38KHz ciclo util
CCP1CON=%00001100 'PWM modo de seleccion PWM?ON/OFF
T2CON=%00000100 'Timer2 ON + 1:1 prescale

SWdown var PORTB.1 'para la generación de patrones de pulsos (SW = switch)
SWup var PORTB.2 'para la generación de los patrones de impulsos



Start:
CCP1CON=12 '=%00001100 habilitar PWM
Keyin: 'Espere entrada de Swup y Swdown..
If SWdown=0 then Plspattern1
If SWup=0 then Plspattern2
Goto Keyin

Plspattern1:
Gosub w40msH
Gosub w3p5msL
Gosub w3p35msH
Gosub w0p85msH
Gosub w0p85msH
Gosub w0p85msH
Gosub w2p5msH
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w2p5msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w0p85msH '24

Goto Start

Plspattern2:
Gosub w40msH
Gosub w3p5msL
Gosub w3p35msH
Gosub w0p85msH
Gosub w0p85msH
Gosub w0p85msH
Gosub w2p5msH
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w0p85msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w2p5msH '24

Goto Start

'Subrutinas --- ?????????????????
w40msH:
CCP1CON=0
Low PORTB.3
Pause 40
CCP1CON=12
Return

w3p5msL:
CCP1CON=12
Pauseus 3500
Return

w3p35msH:
CCP1CON=0
Low PORTB.3
Pauseus 3350
CCP1CON=12
Pauseus 1000
Return

w0p85msH:
CCP1CON=0
Low PORTB.3
Pauseus 850
CCP1CON=12
Pauseus 1000
Return

w2p5msH:
CCP1CON=0
Low PORTB.3
Pauseus 2500
CCP1CON=12
Pauseus 1000
Return

End
'****** fin del programa******
'Nota
'FOSC – INTOSC_GPIO, WDTE – Enable, PWRTE – Disable, MCLRE – Internal, BODEN – Enable,
'LVP-RB4:GPIO, CPD – Not_Protect, CP – Not_Protect

Al final dejo como adjunto esquemático y evidencia del programa

shura:

Como puedo hacer por medio de PIC16f877a o componentes hacer que leds...enciendan gradualmente y a pagen gradualmente??? cual seria el programita....diagrama....para realizar esto???

El proyecto se puede realizar de dos formas:

Con dos pulsadores aumentar y disminuir la frecuencia de parpadeo para ello se utiliza las instrucciones FOR NEXT ejemplo:

Bajar VAR portb.5
Subir VAR portb.4
Led VAR port.3
X VAR byte
Veces VAR byte
Veces= 50 ' carga con 50 a la variable veces

Inicio:
High led
Gosub timer
Low led
Cosub timer
Goto inicio

Timer:
If subir= 0 then gosub restar ' pregunta si se presiono subir
If bajar= 0 then gosub sumar 'pregunta si se presiono subir
For x = 1 to veces
Pause 5
Next
Return

Sumar:
If veces > 60 then return
Veces= veces +5
Return

Restar:

If veces > 10 then return
Veces= veces -5
Return

end

O a través de configuración del PWM:

CMCON = 7 ' PortA = digital I/O
VRCON = 0 '
TRISB = %11110000 ' B.3=PWM,B.0,B.1,B.2 ubicacion de LEDs
PR2 = 25 ' Seleccinar PWM a 38KHz
CCPR1L = 13 ' Seleccionar PWM ciclo util a 50%
CCP1CON = %00001100 ' modo de seleccion= PWM
T2CON = %00000100 ' Timer2 ON + 1:1 prescale

Inicio:
high PortB.0
pause 50
low PortB.0
pause 50
high PortB.1
pause 50
low PortB.1
pause 50
high PortB.2
pause 50
low PortB.2
pause 50
goto inicio


CHR

Si me podrían explicar como hacer estos cálculos o como usarlos para sacra la equivalencia en rpm.
Gracias por su ayuda de antemano

Si vas ha realizar el proyecto con el pic 16f877A lee esto primero:

Ver el archivo adjunto 36427



Nano24

Mi duda es si se pueden configurar para manejar las velocidades del servomotor con el circuito de control que ellos traen.

Lee esto por favor:

https://www.forosdeelectronica.com/posts/329102/

http://www.servomotor.cc/wp-content/uploads/2010/03/Tutorial-Servomotor.pdf


31587

Una consulta cuales son los códigos para hacer con más matrices de led haber si m das una ayuda me trabe en esa parte.


rascueso

ahora cuando se toca algún pulsador que encienda y que quede prendido. cuando pasa un minuto sin pulsar nada que se apague. es posible esto?? yo estaba tratando de usar la salida portc.7 pero la usa para otra cosa


dabopeyton

Buenas, expertos en la materia en programación necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7.

Sube el diagrama y con gusto te colaboro

Nano24


Buenas amigos alguien por favor me podría dar una idea de como programar un medidor de distancias con PICBASIC.
Ver aquí:

http://www.rentron.com/Micro-Bot/IR_Sonar.htm


javisknt

Mira veras nesesito hacer desplazar letras con leds al momento de hacer girar un motor y no tengo muxa experiencia programando mas o menos esta es la idea

Mira aqui:

https://www.forosdeelectronica.com/posts/445534/ #934
 
mecatrodatos no entendí la parte de tu respuesta dirigida a mi... sera que hiciste copy/paste sin responder o mi pregunta es muy bolud../delirante?
 
Cordial saludo perdona rascueso se me paso :oops:

Con referente a lo tuyo hay un led indicador de tareas en programa que comentas , Ubicado en portc.1 , puedes realizar lo que necesitas con TMR0 en el inicio del foro realice un contador hasta 5 minutos para poner a 1 seria de la siguiente manera:

' Define registros y bits del LCD ‘ esto sobra en el programa de tu clave ya que están establecido lo dejo para que comprendas si lo desea o ve al proyecto : https://www.forosdeelectronica.com/posts/166115/

Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

;variables de pines conectados al pic 16f877a

Symbol START_button = PORTA.0 ‘esto asemeja a tecla pulsada del teclado matrixal cuando se ingresa numero o se activa
Symbol LED = PORTA.3 ‘ led que mencionas para activacion de tecla que durara encendido 60 seg lo puedes colocar en este pin ya que no se esta utilizando en tu programa

;variables de almacenamiento de datos

Ticks VAR byte
'Minute VAR byte No es necesario
Second VAR byte
Disp VAR byte
TRISA = %00000001 ; PORTA 3 como salida de led recuerda que Porta.0 asemeja a todas las teclas conectadas a Portb en tu programa

PAUSE 500 ;0.5 seg para inicializar lcd ‘ es necesario ya que das este tiempo en tu programa

;limpieza de variables creadas

‘Minute = 0 no necesario ya que son 60 seg
Second = 0
Ticks = 0
Disp = 1 ; mustra en el LCD 00:00 al iniciar ‘ y deseas lo puedes dejar para mirar el comportamiento del contador

OPTION_REG = $05 ; prescaler = 64
ON INTERRUPT GOTO ISR ; ir a rutina ISR
LCDOUT $FE, 1 ‘ si deseas lo puedes dejar opcional


tiempo:

‘Minute = 0
Second = 0
Ticks = 0
led= 0
Disp = 1
goto tiempo ‘ en este caso es el inicio de tu programa principal
ENDIF

IF START_button = 0 THEN ‘rutina que debes llamar o ir cuando se pulsa tecla ejemplo: if c1=0 then numero=7:return :gosub tiempo ò if c1=0 then numero=7:return :call tiempo
high led
TMR0 = 0 ;inicializa registro TRMO
INTCON = $A0 ; habilita tiempo de interuupcion
Disp = 1 ; habilita LCD
ENDIF

IF Disp = 1 THEN ‘ opcional
LCDOUT $FE, 2
LCDOUT DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOP


DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
'Minute = Minute + 1 ‘opcional ya qu son 60 segundos
'IF Minute = 5 THEN
'Minute = 0
led=0
ENDIF

Disp = 1

NoUpdate:
INTCON.2 = 0 ; rehabilitainterrupciones del TRMO
Resume
ENABLE ;
END
END ; Fin del programa


Espero con ello haberte podido ayudar.:D

31587

Una consulta cuales son los códigos para hacer con más matrices de led haber si m das una ayuda me trabe en esa parte.

Ya que el proyecto difiere del integrado que utilices para realizar la comunicación del pic a la matriz de led cambia lo programación para los caracteres, si tienes algo súbelo por favor y con base a ello podemos trabajar.

electromario el codigo que subite se ve bien pero porque no subes el circuito debe haber algo con el hardware:unsure:

buenas, expertos en la materia en programacion necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7 segmento en el puerto C del pic, y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas es la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en proton. quien tenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo, :confused:

ir al tutorial de Proton
 
Última edición:
Aqui les dejo la simulacion completa del servodriver
Este ejemplo sirve para servomotores con encoder de 1 o 2 canales (1 canal RC5 salida, 2 canales RC5 entrada). utilizo el TMR0 como contador, ccp1 y ccp2 como HPWM, modulo USART para la comunicacion serie.
desde la PC se le envia la velocidad y la posicion ejem. 0102600*--> el "1" significa la velocidad y la posicion es SP=2600......otro ejm 0401456*--> el 4 es la velocidad y la posicion es SP=1456.....esto se lo pueden enviar por el hyperterminal van tecleando cada numero y cuando presionen "*" empieza el movimiento.....en el proteus pueden ver el set point y el valor real de posicion en un LCD

para poder simularlo en la PC necesitan un emulador de puerto serie aqui les dejo la pag. del que estoy utilizando Como no cumplo las Políticas del Foro. Me editaron el mensaje.
el Virtual Serial Ports Emulator trabaja muy bien lo configure en dispositivo "Pair"........si tienen visual basic aqui les dejo un programa que baje de la web del programador, con este programa en el cuadro de texto le envio toda la informacion en un click. tambien les dejo un archivo para registrar el MSCOMM para VB6

Este proyecto es un driver para controlar la posicion de robots, le falta agregar el control PID y la comunicacion con otros drivers por el puerto I2C...

gracias a este foro y a la ayuda de Mecatrodatos (este hilo y muchos ejemplos), Autotronico (ejemplos avanzados de los modulos del pic), esavalla (ideas para leer el encoder), chico3001(ideas generales y de electronica), lubek (ejemplos proteus y comunicacion ) SOY ING. INDUSTRIAL y pude realizar este proyecto. SI SE PUEDE...

HABLANDO DE CONOCIMIENTO: Todos tenemos la misma capacidad, pero no todos tenemos la misma actitud para adquirirlo (AUC)

P.D. el servomotor de un canal se lo quite a una copiadora
 

Adjuntos

  • ctrl_POS_3_2.rar
    8.2 KB · Visitas: 193
  • mscommLWDP.zip
    2.6 KB · Visitas: 151
  • REGISTRAR MSCOM32.txt
    640 bytes · Visitas: 142
  • servodriverAUC_DSN.rar
    25.7 KB · Visitas: 163
Última edición por un moderador:
hola que tal:

quiero hacer un medidor de distancia con el SENSOR ULTRASONICO PING de paralax que solo tiene tres pin el de GND, 5V y sig, lo que no entiendo es como programarlo en el pic no se si este sensor genere por si solo el disparo de 40 khz, tengo este codigo hecho pero no se que tenga que configurarsele aun más o corregirle para mostrar el tiempo de ancho de pulso por ejemplo, creo que la formula para mostrar la distancia es (tiempo de ancho de pulso * 340(que sería la velocidad del sonido a 20°C)/2

codigo:

tiempo VAR Word

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

TRISA=%1
ADCON1=%00001110

INICIO:

PULSIN PORTD.0, 1,tiempo
lcdout $fe,$80, "Tiempo = ", DEC5 tiempo

pause 500

GOTO INICIO

END
========================
les agradecería mucho si me pudieran ayudar, gracias saludos.
 
Holanda, el PING de parallax no tienes mandar 40KHz, sino que tienes que mandar un pulso (pulsout) por el mismo pin que el pulsin, recuerda que después de la instrucción pulsout el pin automáticamente se vuelve entrada, no necesitas usar ADC espero pasarte el código pronto. saludos

Acá te mando el código para el ping parallax


Código:
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
DEFINE osc 4
inicio:
Ping var portb.0 

Trigger  VAR word                               '10 uS Pulso de disparo 
Scale    var word                               'raw x 10.00 =uS 
RawToIn  var WORD                               '1/73.746 (ancho**) 
RawToCm  var word                               '1/29.034(ancho**) 
IsHigh   var word                               'para PULSOUT 
IsLow    var word 
Trigger = 1 
Scale = 10 
RawToIn = 889 
RawTocm = 2257 
IsHigh = 1 
IsLow = 0  

rawDist  var word                          
inches   var word 
cm       var word 

init:
 Goto Get_Sonar                               'leer el valor del sensor 
 after_Get_Sonar:                                                              
  inches = rawDist ** RawToIn                  'convertir a pulgadas 
  cm = rawDist ** RawToCm                      'convertir a centimetros 

Lcdout $fe, 1
Lcdout $fe, 2  
Pause 100   ' Esperar 0.5 segundos
Lcdout "Tiempo ",DEC rawDist  ' mostrar tiempo"
Lcdout $fe, $c0, "Distancia ", DEC cm, " cm"  'Mover a la linea 2 y mostrar distancia
Pause 300       ' Esperar 0.5 segundos
GOTO init 
Get_Sonar: 
LOW Ping                               'hacer el disparo 0-1-0 
PULSOUT  Ping, Trigger                 'activar sensor 
PULSIN  Ping, Ishigh, rawDist          'medir el eco del pulso 
rawDist = rawDist * Scale              'convertir a uS 
rawDist = rawDist / 2                          
goto after_Get_Sonar
 
Última edición por un moderador:
hola electromario

muchas gracias por tu ayuda, ya me puse a estudiar tu código y esta muy bien explicado, solo me queda una duda en la parte donde pones

LOW Ping 'hacer el disparo 0-1-0
PULSOUT Ping, Trigger 'activar sensor

entiendo que cuando pones LOW es que mandas un 0 lógico pero en el comentario pones que hace un disparo de 0-1-0 no entiendo muy bien esa parte del disparo es que apenas empece a estudiar la función pulsout y pulsin, disculpa mi ignorancia jejeje y gracias por tu aporte, saludos.
 
holanda, entiendo tu duda, te explico:
low hace que el pin se ponga en cero (0)
luego atravez de la instruccion PULSOUT se manda un pulso (1)
enviado el pulso el mismo pin (portb.0) se transforma en entrada atraves de la instruccion PULSIN recibiendo el eco de pulso. (0)
 
hola mecatrodatos, puedes darme una breve explicacion de los siguientes comandos,

PULSIN
PULSOUT
HPWM
SERVO
INKEY

Soy buevo en esto y tengo muchas dudas, tambien me gustaria saber, si cuando trabajo en proton los comandon siempre son iguales? o no. ya que veo que unos guardan en ,psp. .asm o .bas. y su diferencia amigos. gracias de atemanos
 
mecatrodatos muchas gracias por tu tiempo.. te cuento soy aficinado a la electronica. me gusta mucho el tema de los pic por eso el interes en aprender pero... lo estoy haciendo por mi propia cuenta ando con el manual pbp que subiste a pleno. se que no voy a aprender de un dia para otro y para colmo se me esta haciendo mucho lio ya que el codigo que tengo es largo y tmb el que me pasaste vos y 31587 pero bue... voy a seguir intentando un poco mas sino la otra que se me esta ocurriendo es usar el port1 con un 555 para que amplié el tiempo. de alguna forma va a salir. saludos y una vez mas gracias
 
mecatrodatos una pregunta. En el post 1144 le contestaste a D@rio sobre la configuración de el modo pwm
Y colocaste:
Al final dejo como adjunto esquemático y evidencia del programa.
Ya busque en el mismo post pero no la encuentro,

Tengo una duda, ¿cómo es que seleccionas en la subrutina hacia la que debes de ir, pues no ubico como es que se van a ir incrementando los gosub?
Gracias por tu respuesta.

Código:
SWdown=0 then Plspattern1
If SWup=0 then Plspattern2
Goto Keyin

Plspattern1: 
Gosub w40msH 
Gosub w3p5msL 
Gosub w3p35msH
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w2p5msH 
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w2p5msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w0p85msH '24

Goto Start

Plspattern2: 
Gosub w40msH 
Gosub w3p5msL 
Gosub w3p35msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w2p5msH 
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w0p85msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w2p5msH '24

Goto Start

'Subrutinas --- ?????????????????
w40msH: 
CCP1CON=0 
Low PORTB.3 
Pause 40
CCP1CON=12 
Return

w3p5msL: 
CCP1CON=12 
Pauseus 3500
Return

w3p35msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 3350
CCP1CON=12 
Pauseus 1000 
Return

w0p85msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 850
CCP1CON=12 
Pauseus 1000 
Return

w2p5msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 2500
CCP1CON=12 
Pauseus 1000 
Return
 
Última edición por un moderador:
Atrás
Arriba