Curso de programación de PIC en PICBasic Pro

Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ... :cry: saludosss :D(y)

SERVO.jpg

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida' 
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000

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

'DECLARACION DE VARIABLES
SERVO1 VAR PORTB.0
X     VAR BYTE
'***************************************************************
'****************************************************************
ACCION:
FOR X = 100 TO 200 STEP 1
PULSOUT SERVO1,X
pause 20
NEXT
FOR X = 200 TO 100 STEP-1
PULSOUT SERVO1,X
pause 20
NEXT
GOTO ACCION
END
 
Última edición:
Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ... :cry: saludosss :D(y)

Ver el archivo adjunto 155487

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida' 
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000

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

'DECLARACION DE VARIABLES
SERVO1 VAR PORTB.0
X     VAR BYTE
'***************************************************************
'****************************************************************
ACCION:
FOR X = 100 TO 200 STEP 1
PULSOUT SERVO1,X
pause 20
NEXT
FOR X = 200 TO 100 STEP-1
PULSOUT SERVO1,X
pause 20
NEXT
GOTO ACCION
END

La resolución de pulsout es dependiente del valor del cristal, o mejor dicho, del valor que le decimos en la programación. Para 4Mhz, tenemos un tiempo de 10us, en 20Mhz, el tiempo es de 2us.
En tu ejemplo, supongamos que tengamos en un momento dado los siguientes valores

X=100
PULSOUT SERVO1,X

tenemos que 100x2 = 200, o sea, 200us... Hagámoslo al revés... supongamos que queremos calcular el valor para un ancho del pulso a mandar de 1,8ms... tenemos entonces que:
1,8ms = 1800us
1800/2=900

PULSOUT SERVO1,900
 
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
 

Adjuntos

  • Variador.rar
    28.9 KB · Visitas: 62
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 Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
saludos
 
Hola Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
saludos

Hola torres, te cuento que el archivo esta guardado en proteus 8.5 SP0, te coloco el esquemático en PDF, los archivos que me da el proteus, y los archivos PBP3.

Y muchas gracias por tu colaboración :apreton:.
 

Adjuntos

  • Variador.rar
    101.4 KB · Visitas: 48
  • VARIADOR DE VELOCIDAD Final con LCD y RS232-PRO8V.1.jpg
    VARIADOR DE VELOCIDAD Final con LCD y RS232-PRO8V.1.jpg
    160.2 KB · Visitas: 64
no, porque de esa forma todas las variables contendrán lo que en el momento de la interrupción tenga el primer byte del buffer.
Lo correcto sería hacer uso de un único hserin, de ésta forma:
hserin paritylabel, timeout, label, [a, b, c, d, e]
así recibes de una sola vez cada byte del buffer en las variables.

Paritylabel, timeout y label, son parámetros opcionales.
La conversión con "dec x" la puedes hacer posteriormente.

me podria dar un ejemplo de esa convercion "dec x"
 
"DecX " es igual que "#" y sirve para mostrar y enviar números como texto, pero con DecX se puede dar un formato con ceros.
Me parece que pueden ser hasta 5 ceros, no recuerdo cuantos se permiten.

Por ejemplo:
Variable = 12
LCDOut $FE, 1, Dec4 Variable
Se mostrará: 0012
 
"DecX " es igual que "#" y sirve para mostrar y enviar números como texto, pero con DecX se puede dar un formato con ceros.
Me parece que pueden ser hasta 5 ceros, no recuerdo cuantos se permiten.

Por ejemplo:
Variable = 12
LCDOut $FE, 1, Dec4 Variable
Se mostrará: 0012

lo que quiero es mostrar lo que ingreso por serial desde pc a mis displays pero por interrupción
que sea una sola trama un solo hserin , pero al parecer tengo que convertir lo que ingreso a decimal le adjunto un block de notas con la diferencia. y quisiera saber el problema ?
 

Adjuntos

  • SERIAL.txt
    935 bytes · Visitas: 25
No entiendo para qué estás usando la tabla con LookUp y el envío de datos seriales con ShiftOut.
Lo que si sé, es que si ya recibiste los datos, sólo tienes que mostrarlos usando # o Dec.

O sea, así:
LCDOut $FE, 1, #D0, #D1, #D2, #D3
O así:
LCDOut $FE, 1 Dec D0, Dec D1, Dec D2, Dec D3

Lo que quiero es mostrar lo que ingreso por serial desde la PC a mis displays
¿Qué tipo de displays estás usando?
 
No entiendo para qué estás usando la tabla con LookUp y el envío de datos seriales con ShiftOut.
Lo que si sé, es que si ya recibiste los datos, sólo tienes que mostrarlos usando # o Dec.

O sea, así:
LCDOut $FE, 1, #D0, #D1, #D2, #D3
O así:
LCDOut $FE, 1 Dec D0, Dec D1, Dec D2, Dec D3


¿Qué tipo de displays estás usando?

bueno te explico mi circuito esta conformado con con shift register CD4094 todos en cascada y cada uno su salida paralela va aun display de 7 segmentos son 28 display todos estos deben ser controlados por pc mediante puerto serial pero necesito que sea un solo hserin.
desde pic se controlan las señales como clock,data,strobe y enable alguna idea.
 
Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.

CD4094 RS-232.jpg

Nota: Por ser simulación, no usé resistencias para los displays.
 

Adjuntos

  • 16F648A CD4094 DSP 7 segs.rar
    63.2 KB · Visitas: 38
Última edición:
Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.

Ver el archivo adjunto 156609

Nota: Por ser simulación, no usé resistencias para los displays.

exelente ,quisiera controlar el enable con un timer 400 milisegundos para hacer parpader a todos los display y al cambiar datos por serial cambie y siga con su parpadeo y tambien detener el parpadeo en cuatro displays si ingreso un 1 por serial sria posible, estoy intentando con interrupcion de prioridad pero no se como acomodar mi programa si tienes un ejemplo seria excelente ..
 
Lo que expones es demasiado sencillo y no requiere de ejemplos, simplemente de noción.
Y si no sabes cómo realizar el programa, vas por muy mal camino.
 
Bueno, sólo necesito un ejemplo de prioridades de interrupción, ya que es la primera vez que programo interrupciones de prioridad.
Mejor aún que sea de interrupción usart e interrupción timer.
No en todos los PIC se pueden tener interrupciones de alta prioridad.
Esto es mas de la familia PIC18 y superiores.

Para saber si el microcontrolador tiene esta opción, debes mirar sus características especiales.
Special Microcontroller Features.jpg

Establecer la prioridad de las interrupciones no requiere de ejemplos, sino de leer la hoja de datos.
Interrupt Registers.jpg
En la sección "INTERRUPTS" podrás ver los registros involucrados con las interrupciones.


Si miras el registro IPR1, encontrarás que el bit 5 (RCIP) es el que activa la alta prioridad de interrupción para la recepción del módulo EUSART.
IPR1.jpg

Como verás, basta con poner en 1 el bit 5 para establecer la alta prioridad de interrupción.
Igualmente con los Timers y otros periféricos.

 
hola a todos en el grupo, saben necesitaba realizar un proyecto de comunicación por RF pues lo hice con los famosos HT12E - HT12E pero, el problema es el siguiente que solo se puede trasmitir 4 bits y yo necesito 8 o 12 si se pudiera, en fin trate de hacerlo con PIC específicamente los 16F628A, también lo conseguí, uno trabaja como trasmisor y el otro como receptor junto con los módulos RF, que por cierto lo probé hasta 50 metros de distancia sin obstáculos y funciona de maravilla el tema es el siguiente:

1. la programación lo realice en microcode studio
2. uso baterías recargables tanto como en el emisor y el receptor, típicamente las de 9V
3. en el emisor uso un regulador de voltaje 7805 y en el receptor una fuente para protoboard
de 3.3 - 5v - 700 ma esas que van insertadas en el protoboard con entrada jack y usb
4. en el receptor solo uso leds por ahora para visualizar los datos de trasmisión.

El problema es que me consume demasiada batería, solo me dura un día, no sé si el problema está en el circuito o en la programación, ya que siempre está trasmitiendo aunque no tenga nada pulsado.

Adjunto lo necesario si alguien pudiera mejorar el proyecto en la programación les agradecería, tal vez allá una forma de hacer que ahorre batería cuando este sin nada pulsado, la programación la hice ayudándome en lo poco que se de pics.
 

Adjuntos

  • RF 4 bits probado.rar
    82 KB · Visitas: 36
Última edición:
Necesito realizar un proyecto de comunicación por R.F.
Pues lo hice con los famosos HT12E - HT12E, pero el problema es el siguiente, que sólo se puede trasmitir 4 bits y yo necesito 8 o 12 si se pudiera.
Usa un algoritmo como el Manchester, por ejemplo, que luego se decodificará en el receptor.

Puedes ver algo sobre el tema, por aquí:
PIC12F675 y módulo de R.F, no recibe datos
El problema es que me consume demasiada batería, sólo me dura un día.
No sé si el problema está en el circuito o en la programación, ya que siempre está trasmitiendo aunque no tenga nada pulsado.
El problema del transmisor se puede resolver fácilmente si únicamente transmites cuando sea presionado un pulsador.
Aquí puedes usar las interrupciones por cambio de estado en el puerto B. (RB4<>B7)
Ponerlo en modo de bajo consumo, (Sleep) y se pondrá en modo activo tras una interrupción.
O sea, cuando se presione un botón.

Y para el receptor, prácticamente sería lo mismo, pero usando la interrupción externa por RB0.

Con eso tendrías el problema de consumo solucionado, aunque siempre habrá, pero será mucho menor.
 
Sobre este mismo tema puedes encontrar varios ejemplos sobre el uso de interrupciones.
Lo más conveniente en el receptor sería el uso de la interrupción por recepción del módulo USART.
Lee la hoja de datos del PIC16F628A y encontrarás todo lo referente a su uso.

Y sobre lo de mejorar el código, ya te mencioné algunas cosas que puedes hacer.
 
Atrás
Arriba