Curso de programación de PIC en PICBasic Pro

Yo creo que si estás haciendo algo mal, porque con un cristal de 4 MHz, se puede llagar hasta unos 83 KHz.
No en todos los casos vas a conseguir frecuencias exactas, pero si aproximadas.
Si lo estás haciendo con HPWM o por software, te recomiendo que mejor uses los registros.

:unsure: mira, ahi encontre un par de cosas que se me habian pasado por alto y ya las corregi, pero sigo con la misma falla...algo se me esta escapando y seguro que debe de ser una tontera :facepalm:

Código:
DEFINE OSC 4            

define ADC_BITS 10      
Define ADC_CLOCK 3       ;
DEFINE ADC_SAMPLEUS 50  
DEFINE CCP1_REG PORTC    
DEFINE CCP1_BIT 2        
DEFINE CCP2_REG PORTC    
DEFINE CCP2_BIT 1         

;****************************************************************
Dato1 var word       ; variable pot.duty ccp1
Dato2 var word       ; variable pot.duty ccp1
Dato3 var word       ; variable aux
Dato4 var word       ; variable pot.frecuencia
FRECUENCIA var word  ; variable aux.frecuencia
FREC1 var word
DUTY1 VAR WORD       ; variable aux.duty ccp1
DUTY2 VAR WORD       ; variable aux.duty ccp2
Dvar var word
Fvar var word
dato0 = 0
dato1 = 0
dato2 = 0
dato3 = 0
dato4 = 250

TRISA = %11111111   ;configuro todo el portA como entrada
TRISB = %00000011   ;configuro portB.0 portB.1 como entrada, el resto como salidas
TRISC = %00000000   ;configuro todo el portC como salidas
portc = %00000000   ;pongo en estado bajo todo el portC

ADCON1 =%10000000   ;configuro A/D 
;****************************************************************

MENU:
 IF PORTB.0 = 0 THEN 
  high portc.7
  goto PWM_ON     ;pulsador de encendido 
 endif
pause 50
GOTO MENU

Inicio:
 IF PORTB.1 = 0 THEN PWM_OFF    ;pulsador de apagado

adcin 1, dato1                 ;leemos el potenciometro del ADC2 para establecer duty CCP2-CCP1
 dato1 =( dato1 / 4)           ;arreglo matematico del valor obtenido por el ADC1

adcin 2, dato2                 ;leemos el potenciometro del ADC2 para establecer duty CCP2-CCP1
 dato2 =( dato2 / 4)           ;arreglo matematico del valor obtenido por el ADC1

adcin 3, dato4                 ;leemos el potenciometro del ADC3 para establecer frecuencia
 dato4 = (dato4 / 4)           ;arreglo matematico del valor obtenido por el ADC3

FRECUENCIA=62500/(dato4+1)    
      
 hpwm 2,DATO2,frecuencia       
 hpwm 1,DATO2,frecuencia        
goto inicio
;****************************************************************
PWM_ON:
 CCP1CON.2=1      ;ACTIVAMOS EL MODULO CCP1 (BIT2)
  CCP1CON.3=1     ;ACTIVAMOS EL MODULO CCP1 (BIT3)
 CCP2CON.2=1      ;ACTIVAMOS EL MODULO CCP2 (BIT2)
  CCP2CON.3=1     ;ACTIVAMOS EL MODULO CCP2 (BIT3)
goto Inicio
;****************************************************************
PWM_OFF: 
  CCP1CON.2=0       ;DESACTIVAMOS EL MODULO CCP1 (BIT2)
  CCP1CON.3=0       ;DESACTIVAMOS EL MODULO CCP1 (BIT3)
  CCP2CON.2=0       ;DESACTIVAMOS EL MODULO CCP2 (BIT2)
  CCP2CON.3=0       ;DESACTIVAMOS EL MODULO CCP2 (BIT3)
 low portc.7
goto menu
;****************************************************************
end
 
Es que para hacer lo que viene siendo un "Sweep" o barrido, tienen que estar en sincronía los demás registros.
HPWM no puede hacer un funcionamiento óptimo de esa forma.
Sería mejor que usaras una tabla y que actuaras en consecuencia sobre los registros, ya que por estar fuera de límites obtendrás saltos de frecuencia e inestabilidad.

Si no te interesa el ancho del pulso, puedes usar FreqOut, que genera un rango más estable, aunque no es muy elevada su frecuencia, me parece que hasta 32768 Hz.
 
Si no te interesa el ancho del pulso, puedes usar FreqOut, que genera un rango más estable, aunque no es muy elevada su frecuencia, me parece que hasta 32768 Hz.

fue lo primero que `probe, pero en el osciloscopio sale deformada la señal con freqout...

Es que para hacer lo que viene siendo un "Sweep" o barrido, tienen que estar en sincronía los demás registros.
HPWM no puede hacer un funcionamiento óptimo de esa forma.
Sería mejor que usaras una tabla y que actuaras en consecuencia sobre los registros, ya que por estar fuera de límites obtendrás saltos de frecuencia e inestabilidad.

interesante dato que no tenia ni la mas palida idea... :unsure: ahi con la modificacion si configuro pr2 de 230hz hasta 5Khz funciona perfecto... si hago el calculo para 230hz hasta mas de 5Khz se descontrola... Ahora, si muevo el valor maximo de PR2 (que seria el minimo de frecuencia) y lo dejo para arrancar en 600Hz, lo llevo hasta 9Khz tranquilamente sin descontrol... Voy a mirar las variables detenidamente, quizas tenga que hacer un parchecito y pueda controlarlo... Esta la libreria de DT para pwm por hardware (16F87X), pero me quedo en la PC de escritorio que quedo en la que era mi casa... o sea, esa PC no la recupero mas :facepalm:
La busque nuevamente, pero no la encontre mas por uqe no esta mas la pagina de Darrel Taylor :rolleyes:
esta relativamente buena, por que con tan solo dos variables, controlabas el pwm por hardware.
vamos a ver como encaro este tema :)
 
fue lo primero que `probe, pero en el osciloscopio sale deformada la señal con freqout...



interesante dato que no tenia ni la mas palida idea... :unsure: ahi con la modificacion si configuro pr2 de 230hz hasta 5Khz funciona perfecto... si hago el calculo para 230hz hasta mas de 5Khz se descontrola... Ahora, si muevo el valor maximo de PR2 (que seria el minimo de frecuencia) y lo dejo para arrancar en 600Hz, lo llevo hasta 9Khz tranquilamente sin descontrol... Voy a mirar las variables detenidamente, quizas tenga que hacer un parchecito y pueda controlarlo... Esta la libreria de DT para pwm por hardware (16F87X), pero me quedo en la PC de escritorio que quedo en la que era mi casa... o sea, esa PC no la recupero mas :facepalm:
La busque nuevamente, pero no la encontre mas por uqe no esta mas la pagina de Darrel Taylor :rolleyes:
esta relativamente buena, por que con tan solo dos variables, controlabas el pwm por hardware.
vamos a ver como encaro este tema :)

Hola...torres.electronico¿Si entras acá no podes recuperar/obtener algo de la pagina que buscas?
Saludos.

Ric.
 
Buen día. Miren, éstos archivos de comunicación serial del PIC funcionan perfectamente, ya que cuando envío vía serial de visual studio 6.0, funciona, pero si envió de MatLab al PIC, no me funciona.
¿Por qué pasa ésto?

Gracias. Adjunto programación.

La programación en MatLab, es :
Código:
ps = serial('COM5');    %se crea un objeto que representa el puerto
set(ps,'Baudrate',9600);   % se fijan las caracteristicas del objeto (no es necesario, estas están por default)
set(ps,'DataBits',8);
set(ps,'Parity','none');
set(ps,'StopBits',1);
set(ps,'FlowControl','none');
fopen(ps);              % se abre el objeto para poder utilizarlo

    fprintf(ps,'%s','1')     % se envia un dato de tipo entero sin signo de 8 bits, por el objeto ps
  
fclose(ps);       % se cierra el objeto; si no se cierra y luego se intenta abrir de nuevo, este puerto se bloquea
delete(ps);
clear ps
 

Adjuntos

  • picmatlabvisual.rar
    19.5 KB · Visitas: 42
Última edición por un moderador:
Entre en una duda bastante grande...
Trabajando con el pwm por hardware del 16F876A, configuro la frecuencia de la siguientw manera:
Frecuencia=62500/(PR2+1)
El tema esta en qie de 250hz hasta 6Khz voene perfecto con un cristal de 4Mhz... si le pido mas frecuencia, se ve en la salida un pwm erroneo con saltos de 10-20-30khz- y hasta 60khz :eek:
Mi pregunta es si puede ser el cristal el problema :unsure: o se me esta pasando por alto algo...
Saludos


El follo de que varíe la frecuencia tiene que ser otra biblioteca que cargas y te varia el prescaler de tmr2

Tanto prescaler como pr2 son para ajustar la frecuenciia

Frecuencia = 1/(((fosc/4)/prescaler)/pr2)

Las ecuaciones suelen estar en la documentación del integrado en la sección de control pwm


Bueno igual ahora mismo equivoco ccpr1l ccpr1h con pr2.
Unos sirve para limitar el contador de 16bit 65535 y que cuente solo asta 100. Y pr2 modula pwm

Si quisieras para ajustar pwm para una frecuencia tendrías q jugar con el largo q cuenta tmr2 y una operación para ajustar el duty para que de ajuste el tiempo de pulso alto igual al bajo aun variando el limite del cotador tmr2.

Y puestos a meditar en tres cerveza y cerveza.

Para picbasic y poder ajustar rápido la frecuencia de salida con tmr2
Tendrías que definir una variable de 16bit (llamarla frecuenout, por un poner) creas dos alias de los 8 bit altos y los 8 bit bajos como constantes de ccpr1h ccpr1l.
Si no pasas de 2048 puedes ajustarla a pr2 con la instrucción de des lazar bit ala derecha (es igual a dividir entre dos) recuerda q pr2 pbp la interpreta como 16bit solo q al pasarla al pico solo maneja 10bit si el valor es mallor el pic se cuelga
Si la frecuencia es muy alta con prescaler 1:1 pasa a 4:1
Con un cristal de 4mrz tampoco vas a manejar un rango de frecuencia muy alto pero para 5khz creo q de sobra.

Otra cosa q hay q contar si se usa una biblioteca para el puerto PSI los baudios de comunicación están vinculados a tmr2 y modifican ccpr y el prescaler. El pos escales no creo q te interese manejarlo solo es otra reducción mas de la cantidad de veces allá terminado tmr2 en hacer un ciclo. Permite lecturas de comparación de comparación cada x ciclos pwm 1a16
Espero no averme esplallado mucho

Un saludo
 
Última edición:
No estoy usando otras librerias, pero ni bien me libere de mis bolonquis, retorno a la electronica.


los comandos especiales de pbp son subprogramas que ensambla pbp configurando ccp1con y demas rejustrios. hpwm es por hardward pero hay que definirlo al principio no ace palta tocar ccpcon solo definiro al principio ya ajusta el.
de la manera que intentaste hacer me gusta mas por poder manejar dorectamente el largo que cuenta tmr2 y el duti como bariables eso quiere decir que en 2 procesos puedes canviar un balor o ala hora de convinarlo solo vas ser dos procesos mas no la carga de una subrrutina entera que ocupe 180 instrucciones (por un poner)
la que si no me equivoco es por sofhtwad es pwm asecas (que yo recuerde)

otra cosa es que definir esto
CCP1CON.2=1 ;ACTIVAMOS EL MODULO CCP1 (BIT2)
CCP1CON.3=1 ;ACTIVAMOS EL MODULO CCP1 (BIT3)
pbp entiende que primero camvias el bit de memoria de ccp1con.2 que son 3 procesos
y despues cambias ccp1con.3 otros 3 procesos, los compiladores no suelen simplificar eso
si vas a ponerlo en marcha del tiron (yo octo por el binario por ser mas facil de contar y poner un 1 o 0) y seria poner ccp1con=%00001100. de esta manera solo seria cargar directamente la bariable ala ram ccp1con (es una ram de funciones o interrutores que enciendes y apagas dentro) esto compilado son solo 2 procesos de los 6 que pides al acerlo por separado.

esta bien el entralazado entre inicio y menu es buena idea. otra donde comes muchas instrucciones es en dividir entre 4. fastidia cuando hay que dividir entre 3, 5 o 7, pero cuando es dividir entre 2 o 4 se usa el comando >> (menudocomando) en una bariable lo que ace es desplazar los bit acia un lado o el otro como multiplicar entre dos o dividir la bariable entre dos.
ejemplo:
dato1=dato1>>2
pbp lo que ba acer es desplazar dos veces los bit de esa variable ala derecha como dividir entre 4. como es una instruccion propia del pic mover un paso los bit ala dereche come 2 procesos como cualquier bariable pero as poner que mueva dos veces lo que repite este proceso dos veces lo cual que comeria 4 procesos la instruccion (si pusiera 6 comeria 12 procesos) una division solo por tener que crear la matric de division te come unos 80 procesos

los procesos es algo que se nota al compilar el pic. pongamos si la memoria de un pic es de 1024 instruciones de comando o procesos de comando (puedo estar en errata esplicandome) de esos 1024 x se usan para configuracion de intcon, tmr1con ccp1con y todas las demas instruciones de configuracion, esas ya simplemente ocupan asi que de 1024 quizas solo tengas 990 para las instruciones que le añadas tu desde el compilador (instrucciones o procesos como quieras llamarlo)

la cuestion que cuanto mas depures el programa mas rapido correra mas espacio de codigo te sobrara para menus obciones etc. lo que interesa de tener el programa bien depurado en el pic es que pueda dar su resultado de insofacto como mucho contar con unas millonesimas de rertaso y algunas veces casi no puedes contar con eso y te quedas en unas nanonesimas de segundo y por eso aveces se suben los osciladores a 16 y muchos mas Mhz. aunque para algo sencillo a 4 o 8mhz esta de sobra y se consume menos corriente

un saludo, y aver lo que me suelta algun corrector de estos :p
 
Hola amigazo, estoy construyendo mi casa y lobque va a ser la nueva ofi, laboratorio y taller; Tu aporte merece el 100% demi atencion, prometo que ni bien me libere de mis cosas vuelvo al tema y lo re leo. Muchas gracias por tu aporte
 
yo tampoco es que sea un filirhranas con la programacion y aveces ago buenos garimatias

esto que voy a pasar seria el principio e un regulador de luz por PWM de los comunes ue suelo montar con el 12f683 que es un modelo pequeño y barato (o porque melo tope barato)

Código:
contador var word
tiempo var word
infra var contador.byte0
estado Var byte
m1 var estado.bit0
m2 var estado.bit1
errorp var estado.bit2
tiempos var estado.bit3
enc0 var estado.bit4
enc1 var estado.bit5
encm var estado.bit6
enca var estado.bit7
luz var ccpr1l
parada var byte
retraso var byte
temp1 var byte
temp2 var byte
temp3 var byte
temp4 var byte
temp5 var byte
indica var byte
luztemp var byte
reten var byte
pulso var byte
boton var byte
casilla var byte
codigos var byte [12]
codigo var byte [7]
'
' alias de pin's
'
port_piloto var gpio.5 ' bit conectado al led, indicaciones
port_pulsar var gpio.4 ' bit usado para el pulsador independiente
port_ir var gpio.3 ' bit usado para el re eptor infrarrojo
port_encoderA var gpio.1 ' encoder pin desplazamiento A
port_encoderB var gpio.0 ' encoder pin desplazamiento B
'
' registro configuracion inicial
' 
status=%00000000
option_reg=%00000110 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%00000000 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000001 ' configuracion del encendido
eecon1=%00000000 ' configuracion de etado de la eepron
osctune=%00000000 ' configuracion calibrado fino del oscilador
osccon=%01110000 ' configuracion del oscilador
t1con=%00100001 ' conpiguracion temporizador 1, TMR1
t2con=%00000000 ' configuracion temporizador 2, TMR2
cmcon1=%00000000 ' configuracion del comparador por TMR1
ccp1con=%00111100 ' configuracion del registro de control ccp1
cmcon0=%00000111 ' configuracion del comparador operacional
vrcon=%00000000 ' configuracion del voltage de referencia del comparadoronfiguracion del comparador operacional
adcon0=%00000000 ' configuracion de las entradas analogicas
ansel=%00000000 ' ajuste de las entradas analogicas
'
'eedat=0 ' bariable que lertura o guardado de la eepron
'eeadr=0 ' direccion donde se almacena en la eepron maximo 255
'
' definicion de puertos inicial
'
trisio=%010011 ' define los bit del puerto entrada o salida
gpio=%010011 ' define los bit del puerto
wpu=%010011 ' define los pull up del puerto
ioc=%000000 ' define como marca de interruccion los bit del puerto
'
pr2=40 ' maximo del contador timer2
'
'ON INTERRUPT GOTO interrucciones 
'
tiempo=0
casilla=0
estado=0
retraso=0
'
' carga los valores de control de la eepron y vefifica q sean correctos
'
read 10, luz
gosub cargarcodigoIR
ccp1con=%00111100 ' activamos PWM
t2con=%00000100 '
'if codigos[0]=0 or codigos[0]=255 then gosub almacena_infra
'
' bucle programa
'
programa:
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if pir1.0=1 then 
    gosub temporizadores ' retrasos  y contador tiempo
    gosub pulsador ' pulsador
endif
if port_encoderA=0 then ' lectura encoder rotativo
    if port_encoderb=0 then gosub encoderrota 
endif
if boton>0 then gosub tecla ' acciones
goto programa


--- un descuido arranco la configuracon pwm despues de la carga de la eepron por el ruido que pueda generar la portadora pwm al estar funcionando y mas con cargas de 2 a 6A y fallen los condensadores por uso. (permite una carga correcta al arrancar)

que al final estuve biendolo ahora y ccpr1h ccpr1l se encargan del contadorpara disparar el pulso pwm y pr2 el que lo arma de nuevo o limita el contador tmr2 para no contar hasta 65535 en mi caso contar solo asta 40, para conseguir una portadora de 50khz configurando el oscilador a 8Mhz.

lo que me imagino que tendras que hacer seria esto. (o algo asi)

Código:
frecuenciaout VAR word
ccpr1h CON frecuenciaout.byte1
ccpr1l CON frecuenciaout.byte0
pr2 CON frecuenciaout>>1

que tampoco se muy bien si funcionara de esta manera. si no, una rutina para modificar ccpr1h ccpr1l y pr2 que seria la mitad, esto cada vez que modifiques el valor de frecuencia.
no creo que sea necesario parar el modulo tmr2 para cambiar de frecuencia sin parar. porlomenos yo no suelo parar nada al cambiar el largo de pulso de 3 a 37.

un saludo
 
Última edición:
y reflexionandolo hoy creo entender porque quedan mejor la rutina de interruciones definida al principio y el bucle de programa abajo.. si entra por una falla o desvordamiendo y no detecta la linea de donde salto saldria de la subrrutina interrucion de seguido no volveria sino que se terminaria, de esta manera pasaria a entrar directamente en el bucle programa.

pongamos que esto sucederia en interruciones por perdida de energia o el perro de guardia que tambien te devolveria a programa.
la verdad que es una cosa que nunca seme dio por acer. las interruciones siempre las ponia al final de todo el programa, es mejor definirlo todo cargar las bariables de arranque o lo que sea y un salto de linea a main o programa o como sete antoge llamarlo, la cuestion que cuando el compilador le eche el guante compile al principio la rutina de interrucciones o el programa por interruciones de hardwar.
pensar que las interruciones es una linea de proceso que incrmenta cala x procesos que sea la instruccion que usemos eso agranda mucho el programa.
pongamos que electronicamente una interrucion es un comando que compara si el bit final de interruciones esta auno y si es asi guarda la linea en la que estaba y salta ala linea asignada para despues retornar ala linea guardada y proseguir el programa por donde iba, entonces tambien se puede jugar con ella en basic o c para desastibar ese comando en una o barias instrucciones.. aunque electricamente por x o por b porde fallar.. por eso el de poner interruciones primero y programa despues. al no aver almacenado el partido o estar a cero prosigue de largo y entraria en el bucle programa.

un saludo. espero que alguien detalle mejor eso :)
 
:LOL:Hola gente!!! gracias don moderador por el baneo!!! para empezar, queria contarle que no venia a que nadie me haga las cosas sin tener que hacer yo ningun esfuerzo de mi parte, esa no es mi costumbre y ud lo sabe. solo pregunte si alguien tenia una idea de como se hacia y compartiera su comentario, no TRABAJO. pero dejando de lado a nuestro impulsivo moderador, (n) les cuento que estuve quemandome los cesos y las cejas buscando informacion, leyendo mis libros de programacion y ya encontre la forma de hacer lo que pregunte utilizando pbp para programar. a los que no saben porque no vieron mi pregunta anterior, les cuento que estaba intentando hacer un circuito con pic, que grabara los movimientos de un servomotor y despues los reprodujera automaticamente, algo como el video que les dejo abajo. ese trabajo fue hecho con arduino, sistema de programacion que detesto, pero aqui les dejo un demo de mi trabajo con el codigo y una simulacion en proteus 8.1 hecho con un pic16f628a programado en pbp. bueno, les cuento que cuando termine mi trabajo, lo voy a compartir aqui para que sea una solucion mas, flotando en el mar de post´s sin solucines que es este foro... bueno, como siempre les digo, muchas gracias y a esperar un poquito, en breve estara completo.
Saludos don moderador, no borre este post, tiene un aporte importante!!! ;)(y)

Código:
                                              'configuracion de fuses
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 4 
CMCON = 7   
TrisA = %11111111             'todo el port A como entrada
TrisB = %00000000               'todo el port B como salida
PORTA = %11111111             'todo el port A en 1
PORTB = %00000000           'todo el port B en 0

touch  var porta.0
knob   var porta.1
play   var porta.2
stp    var porta.3
servo  var portb.0
vpot   var byte
memo   var word(20)

clear

inicio:
if stp = 0 then inicio
gosub leepot
pulsout servo,vpot
if touch = 0 then graba1
if play  = 0 then reprod
goto inicio

graba1:
gosub rebote
gosub leepot
memo(1)=vpot
pulsout servo,memo(1)
if stp = 0 then graba2
goto graba1

graba2:
gosub rebote
gosub leepot
memo(2)=vpot
pulsout servo,memo(2)
if stp = 0 then graba3
goto graba2

graba3: 
gosub rebote
gosub leepot
memo(3)=vpot
pulsout servo,memo(3)
if stp = 0 then inicio
goto graba3

reprod:
if stp = 0 then inicio
gosub rebote
pulsout servo,memo(1)
gosub pausa
pulsout servo,memo(2)
gosub pausa
pulsout servo,memo(3)
gosub pausa
goto reprod

pausa:
pause 1000
return

leepot:
pot knob,127,vpot
vpot = vpot /3+100
return

rebote:
if touch = 0 then rebote
if play = 0 then rebote
if stp = 0 then rebote
return
end

 

Adjuntos

  • pic memo.rar
    18.7 KB · Visitas: 51
Última edición:
al principio cuando empece con el picbasic solia tirar de esos comandos de esos muy elaborados (pero siempre terminan dando unas pucetas a largos plazos) para salir del paso aveces estan bien.

al final acia un bucle coo el de la interruccion que para dos servos y un cristal de 4mhz me daba una resolucion de posiciones curiosas y si no un oscilador de 8 o 10mhz.
aun asi si no recuerdo mal creo que a 4mhz no desbordaba de 248 el servo en su maxima posicion contando los 500uS que necesita antes de medir el largo del pulso..

mi idea (seme ocurrio ahora) es usar tmr0 como mandato para el pulso de los servos. se ajusta para que tarde 600uS +- para que despues salte automaticamente por interruccion tmr0 y quede parado el programa mientras da el largo de los pulsos, esto permitiria que el programa solo se detuviera 1000 microsegundos uS cada vez que quiero que el servo se verifique, los interbalos de tiempo entre barrido y barrido a los servos minio uos 70hez. poco mas de 10mS aunque seguro que los puedes acer as frecuentes. usa si eso timer 1 para ajustar la frecuencia de reueo de puertos A/D y servo todo en una creo que lo aria.

piensa que al usar el comando pot (tambien lo usaba al rincipio asta darme cuenta que no...mas si el integrado tiene entradas a/d) el comando pot es un comando elaborado. constaria de un contador donde descarga un condensador y se pone a cargarlo mientras cuenta cuanto tiempo tarda en dar un bit 1.
vamos que no estas usando el puerto a/d del 16f628a (recuerda que este pic su puerto a del 0 al 4 son solo entradas no entregan corriente para dar un pulso al servo como salida)

Código:
status=%00000000
option_reg=%00000000 ' tmr0 ajustado para los largos de pulso de los sevos
intcon=%10010000 ' 



programa:


if portb.7=0 then
    'esto se añadiria en algun momento del programa
    'para dar la orden de iniciado de losservos
    '
    portb=portb & %01110000 ' se ponen los pines de los servos a uno
    tmr0=10 ' ajustamos como tiempo del pulso minimo el servo
    intcon.5=1 ' se actiba la interruccion tmr0
    '    
    ' lo puse como un pulsador por poner, si usas esto no mezcles pause
    ' ni instrucciones especiales de picbasic
endif
goto programa


'
' 
' control de interrucciones
'
'
DISABLE
interrucciones:
if intcon.2=1 then ' de esta manera para no alterar otras interrucciones
    for temp1=0 to 255 ' ajustar para el largo el pulso del servo (maximo)
        if servo1=temp1 then low portb.4
        if servo2=temp1 then low portb.5
        if servo3=temp1 then low portb.6
' añadir un pauseus si el tiempo desborda de 8bit no se mueve gran cosa
    next temp1
    intcon=intcon | %00100010 ' boramos bandera tmr0 y la interruccion
endif

y bueo esta asi un poco echo alo chapuza. aun asi la parte del for next de los servos puedes acerla en una subrrutina aparte no como puse en plan interruccion (yo porlomenos en antao la tengo echa asi) pero esta fue una ocurrencia para ahorrar de esperar esos 600mS y estar con otras instrucciones )aunque quizas no merezca la pena malgastar tmr0 para ello y esperar ese tiempo..

piensa que un servo o casi todos mas o menos (no es que vengan ala gran perfeccion calibrados relacion tiempo 500 microsegundos seria el largo de pulso para aceptarlo y despues el serbo se posiciona de ocquierda o derecha en un largo de un pulso de 1000microsegundos o 1milisegundo (que es lo mismo) pero que no tiene que ser exacto exacto. vamos topar algo tan exacto seria un milagrio alo de mas nos adactamos.

lo que se que usando esas instrucciones que son pila practicas tardas mucho entre lecturas y barridos. aparte en el video el programa de memorizado descartaba movimientos pequeños slo almacenaba donde paraba un tiempo.. (abria que acer algo para simplificar o comprimir la informacionde movimiento)

lo otro que para memorizar muchos movimientos y reproducirlos necesitarias mejor una eepron externa.

si te dgo la verdad ver en el video como simula las posiciones quele mandas directamente (aunque con algo de reraso entre ecturas y barridos) la verdad ue mola. jejejeje

si tienes algun circuito de practicas con lcd o display te aconsejaba practicar a manejar la entradas analogicas del pic.

pero no me paree que te allas calentado mucho las pestañas para hacer eso, jejejeje

un saludo



y digo que daria tiempo a acerlo todo en una. por que e los - de 600 milisegundos de pulso minimo que contaria tmr0 daria tiempo hacer las lecturas de las tres entradas analogicas y mas con un cristal de 10mhz. o eso creo..
 
Última edición:
Tranqui Dario con el foro; Si crees que hay mejores foros, ya sabes a donde teclear para ir a esos foros... Aca no hay un mar de temas sin solucionar; Pasa que no todos tenemos tu mismo tiempo y ya que vamos al caso, si re lees tu anterior topico, no compartis nada y solamente pedís que te den una mano... Si vamos a las normas de participación, el moderador trabajo dentro de reglamento y no lo veo impulsivo su actuar...
Respecto al tema de los servos, hay in hilo con ejemplo en este tema al respecto de Reymi



.

piensa que al usar el comando pot (tambien lo usaba al rincipio asta darme cuenta que no...mas si el integrado tiene entradas a/d) el comando pot es un comando elaborado. constaria de un contador donde descarga un condensador y se pone a cargarlo mientras cuenta cuanto tiempo tarda en dar un bit 1.
vamos que no estas usando el puerto a/d del 16f628a (recuerda que este pic su puerto a del 0 al 4 son solo entradas no entregan corriente para dar un pulso al servo como salida)
...

:rolleyes: el 16f628 no tiene CAD :unsure:
 
Última edición:
yo si vi el mensaje de dario el que supongo moderaron o banearon, pero no comente nada porque es un tema supervisto, no hay mas que leer tres potenciometros e igualar al servo, cuando cambia el valor de dos potenciometros o tres se guarda en memoria del primero para que se reproduzca en forma automatica.

ese proyecto es mas practica que utilidad puesto que los servos son bastante imprecisos con respecto a un motor de pasos el que pudiera tener encoders y bla bla bla,

asi que yo tampoco creo que el moderador fuera impulsivo y mas bien el tema esta un poco fuera de lugar, pero en fin comento esto no con animo de agraviar a nadie, mas bien que seamos un poco mas tolerantes con eso de que nos moderen, a mi en realidad no me importa que me manden un mensaje a moderacion.
 
Buena compañeros un cordial saludos a todos, mucho tiempo sin comentar por aca por crecimiento personal y profecional. Ya teniendo tiempo empezare de nuevo compartiendo de a poco con ustedes mis aportes y conocimientos sobre PBP y buscando apoyo como antes. De momento quería referir a mi amigo D@rio el aporte que realice hace un tiempo años ya a tras sobre un sistema que implemente sobre un brazo con servo motores donde dejo incluso un vídeo y archivos de simulación y código. Seguramente no se recordó mucho al respecto debido al tiempo fue en el 2012 y no recuerdo si fue muy relevante en ese momento en fin amigo te dejo el mensaje y aunque no esta del todo completo o depurado el proyecto me gustaría retomarlo para depurarlo en conjunto ya que es bien interesante llegar al nivel del vídeo o incluso mas alla...Bueno por ahora esto Saludos y éxitos :apreton:

https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index83.html#post612027

Un poco de inspiracion...:eek:

 
Última edición:
Hola! consulta que no me doy cuenta porque no anda, estoy aprendiendo en basic y este voltimetro no me funciona, si me pueden indicar porque , saludos
 

Adjuntos

  • programas en basic.rar
    44.8 KB · Visitas: 42
hola ,bueno soy nuevo en esto de la programacion en pbp,quisiera una ayuda ,estoy en la implementacion de un programa que me permite cambiar desde pc numeros decimales de 4 digitos y aparescan en 4 displays de 7 segmententos estoy usando el modulo usart de pic
18f2550. el problema es que hay una nueva entrada decimal que tengo que agregar para controlar el parpadeo de de los 4 digitos en el los display , con 1 parpadean y con 0 regresan a su estado normal osea se detiene parpadeo ,y cuando estan parpadeando los display asu vez cambien si yo envio denuevo otros digitos por pc .
al parecer creo que etngo qu ehacer interrupciones con usart . sime podrian ayudar con alguna informacion o algun ejemplo les estaria agradecido .


espero su respuesta
 
Estoy en la implementación de un programa que me permite cambiar desde la PC, números decimales de 4 dígitos y aparezcan en 4 displays de 7 segmentos.
Estoy usando el modulo USART de PIC18F2550.

El problema es que hay una nueva entrada decimal que tengo que agregar para controlar el parpadeo de de los 4 dígitos en el los display, con 1 parpadean y con 0 regresan a su estado normal.
O sea, se detiene parpadeo y cuando están parpadeando los display, a su vez cambien si yo envío de nuevo otros dígitos por la PC.
Al parecer, creo que tengo que hacer interrupciones con USART.
Si me podrían ayudar con alguna información o algún ejemplo, les estaría agradecido.
Busca en la hoja de datos sobre los registros que debes usar para la interrupción por recepción.
Para recibir los datos puedes usar la instrucción "HSerIn", porque te permite usar varias variables.
 
¿Cómo está, D@rkbytes?
He revisado lo que me indicó sobre los registros de interrupción y pues no tengo muy claro el registro PIR1.5, que es el bit RCIF (Flag de recepción por USART)
No sé cómo acomodarlo en mi programa.

Estoy haciendo un pequeño programa con un solo display de 7 segmentos.
Este programa envía 2 dígitos por el puerto serial, el primer dígito es el del dato que se va a mostrar por el display y el segundo es el del parpadeo.
Si es 1 parpadea y si es 0 deja de parpadear.

Lo que no puedo lograr, es que cuando esté parpadeando cambie el dato si le envío uno nuevo por serial, ya que se queda en el bucle del parpadeo.

Quisiera que me ayude en la distribución de los comandos como el On interrupt, Disable, Resume y Enable, y por supuesto el flag de recepción que no lo tengo muy claro.

Le adjunto el programa para que lo revise y me pueda ayudar, y si tiene alguna información para leer y comprender todo lo referido, sería genial.
PHP:
DEFINE OSC 20
DEFINE LOADER_USED 1 
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h      ' add TXSTA value, high speed
DEFINE HSER_SPBRG 32       ' add SPBRG value
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1

RCSTA = %10010000          ;CONFIGURACION DE LA USART, 
TXSTA = %00100000 

INTCON = %11000000         'CONFIGURACION DE LA INTERRUPCION USART 
PIE1   = %00100000
SYMBOL RECEP  = PIR1.5     'FLAG DE RECEPCION USART
on interrupt goto INICIO

HIGH PORTC.2               'enable 
HIGH PORTC.4               'strobe
DAT   VAR PORTC.0          'data
CLK   VAR PORTC.1          'clook

DS1  VAR BYTE
A    VAR BYTE
UNO  VAR BYTE


 
RECEP = 0
DISABLE
INICIO:
HSERIN [DEC1 DS1]
HSERIN [DEC1 uno]

IF UNO = 1 THEN   INTERMITENTE
IF UNO = 0 THEN    MUESTRA 
CONVERTIR:
eeprom 0,[0]
LOOKUP DS1,[191,134,219,207,230,237,252,135,255,231,0],A
write 0,a
read  0,a
SHIFTout DAT,CLK,1,[A]
GOTO INICIO 

INTERMITENTE:
read  0,a
SHIFTout DAT,CLK,1,[A]
pause 200
low 300
pause  200
high 300
pause 200
GOTO INTERMITENTE

MUESTRA:
read  0,a
SHIFTout DAT,CLK,1,[A]
GOTO CONVERTIR 
RESUME 
ENABLE
 

Adjuntos

  • serienelloza.rar
    19.7 KB · Visitas: 32
Última edición por un moderador:
Atrás
Arriba