Curso de programación de PIC en PICBasic Pro

No pude implementar el software de SUKY... Dejo lo que tengo hasta ahora...tengo que modificar el prescaler para que en ves de trabajar cada 16.384 milisegundos, trabaje cada 240ms...
Una pregunta lubeck, Reimy o quien entienda....En ves de count, se podria hacer con la captura del CCP1? Por que si se puede llegr hacer, la captura y o conteo queda en segundo plano y se hace mucho mas agil el programa cuando quiera anexar la comparacion de las rpm obtenidas, con el valor previo fijado apra que me indique que llego a esas RPM...Acá dejo la idea de la implementacion del TMR0 para el tacometro...


Código:
 @ device HS_OSC  
DEFINE OSC 20 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
DEFINE LCD_DREG PORTD 
DEFINE LCD_BITS 4 
DEFINE LCD_DBIT 4 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2 
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 
DEFINE LCD_LINES 2 

revo var byte
ADCON1 = 7      ' PORTA y PORTE digital
Pause 100       
; Set TMR0 to interrupt every 16.384 milliseconds
OPTION_REG = $55        ' Set TMR0 configuration and enable PORTB pullups
INTCON = $a0            ' Enable TMR0 interrupts
On Interrupt Goto tickint

;*********** PROGRAMA ***********************
contador:
     count portc.0, 125, revo
       revo= (revo / 4)/2 * 240 
     GOTO contador 

Disable            ' Disable interrupts during interrupt handler

tickint:
  LCDOUT $FE,1,"RPM=",dec revo
   
tiexit: 
   INTCON.2 = 0    ' Reset timer interrupt flag
   Resume

   End
 
Hola gente, estoy programando un timer en display 7 seg. de cuenta regresiva de tres digitos en segundos con PBP y micro code , lo tengo funcionando pero no logro darle precision, he modificado valores hasta agregue pauseus, pero no doy con la tecla, tambien extrage el fragmento de la interrupcion y junto con la parte para mostrar en el display lo compile y lo simule con Pic simulador ide para ver el tiempo que tomaba en hacer el ciclo y si, se estiran los tiempos anteriormente lo realice en asembler y recuerdo que quedo muy exacto, les adjunto el basic a ver si me pueden dar una mano.

Otra cosa por que cuando quiero configurar los fuses como por ej.
@ DEVICE PIC16F877A
@ DEVICE HS_OSC,PROTECT_OFF,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF,CPD_OFF
me da error ilegal opcode
 

Adjuntos

  • Timer_ver1.rar
    1.8 KB · Visitas: 105
proyecto 3

Código:
;proyecto display 

;programa que presenta la palabra HOLA en 4 displays pic 16f84A con 
;despalzamiento de derecha a izquierda.

                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz

trisb=0                      ;puerto b como salidas
trisa=0                      ;puerto a como salidas
x var byte                   ;variable con capacidad de 255

texto:
for x=1 to 20                 ; repeticiones de estye segmento
porta=14:portb=8             ;formacion de la letra A en el dispaly
GOSUB TIEMPO                 ; ir a rutina tiempo
porta=13:portb=71            ;forma la letra L
gosub tiempo                 ; ir a rutina tiempo
porta=11:portb=64            ;forma la letra O
gosub tiempo                  ; ir a rutina tiempo
porta=7:portb=9               ;forma la letra H
gosub tiempo                   ; ir a rutina tiempo
next                          ; siguiente repeticion

for x=1 to 20
porta=14:portb=127            ;apaga el display
GOSUB TIEMPO                   ; ir a rutina tiempo
porta=13:portb=8              ;forma la letra A
gosub tiempo                  ; ir a rutina tiempo
porta=11:portb=71             ;forma la letra L
gosub tiempo                  ; ir a rutina tiempo
porta=7:portb=64               ;forma la letra O
gosub tiempo                  ; ir a rutina tiempo
next

for x=1 to 20
porta=14:portb=9               ;forma la letra H
GOSUB TIEMPO                   ; ir a rutina tiempo
porta=13:portb=127             ;apaga el display
gosub tiempo
porta=11:portb=8                ;forma la letra A
gosub tiempo
porta=7:portb=71                ;forma la letra L
gosub tiempo
next

for x=1 to 20
porta=14:portb=64            ;forma la letra O
GOSUB TIEMPO
porta=13:portb=9              ;forma la letra H
gosub tiempo
porta=11:portb=127             ;apaga el display
gosub tiempo
porta=7:portb=8                 ;forma la letra A
gosub tiempo
next

for x=1 to 20                   ;forma la letra L
porta=14:portb=71
GOSUB TIEMPO
porta=13:portb=64                ;forma la letra O
gosub tiempo
porta=11:portb=9                ;forma la letra H
gosub tiempo
porta=7:portb=127               ;apaga el display
gosub tiempo
next
goto texto                      ;IR A TEXTO

TIEMPO:
PAUSE 5                        ;espera5mls
RETURN                         ;returna al gosub que la llamo 
end                             ;fin deel programa

con este programa de aprende a utilizar el multiplexado para manejar varios displays

Me podrían decir que significa esto y con respecto a la capacidad
, x var byte ;variable con capacidad de 255
 
creo que ya le entendi....:D demasiado tarde con el ejemplo:LOL:

lo que hace esa cosa del capture es que el tmr1 tiene un contador word(16bits), y cada que sucede una caida o subida del RB3, se graba el dato en el registro word del capture.... y se efectua la interrupcion...

entonces que pex... crees que te sirve ... tu ciclo maximo sera de 240ms???
 
hola de nuevo por acá, les comento estuve leyendo en una revista y revisando otros archivos, los módulos capture y compare, según entiendo el capture pues como indica el amigo lubeck escanea una frecuencia y con el compare, pues compara otra frecuencia de referencia. Ahora lo noto complicado e incluso mas difícil que por una simple interrupción externa, yo para asegurar incluso usaría un pic eneano solo para el conteo y otro pic para tomar el tiempo del conteo ya que en uno solo me resulta difícil, no digo que no sea posible la cuestión esta en que tan preciso puede llegar hacer y que otras cosas puede hacer el pic aparte de medir las rpm, poniendo que se interrumpe por cada pulso de entrada y por cada desbordamiento del tmr0, los pulsos de entrada son los del motor y seria para el contador, el tmr0 lo utilizaría como temporizador osea cuanto duro cada pulso, tendría que calcular cada pulso en función a eso llevarlo a rpm, algo así mas o menos, tengo una idea pero aun no muy clara, voy a seguir investigando a ver que mas encuentro por alli saludos...:apreton:
 
lo que hace esa cosa del capture es que el tmr1 tiene un contador word(16bits), y cada que sucede una caida o subida del RB3, se graba el dato en el registro word del capture.... y se efectua la interrupcion...
entonces que pex... crees que te sirve ... tu ciclo maximo sera de 240ms???

Excelente, entonces cae como anillo al dedo, ya que al tener en segundo plano el conteo, ya ganamos tiempo de ejecucion de la rutina principal...

...les comento estuve leyendo en una revista y revisando otros archivos, los módulos capture y compare, según entiendo el capture pues como indica el amigo lubeck escanea una frecuencia y con el compare, pues compara otra frecuencia de referencia....

Con este dato, se me esta cerrando la idea mucho mejor formada que la que tenia desde un principio... El tema es ahora sentarme y pesarla bien como armar :rolleyes: ...
Miren, y comenten si me entienden y es viable lo que se me pasa por la sabiola (cabeza)...
implementamos el modulo capture para contar los pulsos, seteamos el prescaler del tmr0 en 1/4 de segundo, salta la interrupcion del TMR0 y en la rutina de la interrupcion, tomamos el numero de pulsos que conto el modulo capture, lo dividimos por 4 y ahí tenemos una vuelta del motor en lo que fue 1/4 de segundo.... a ese resultado, lo multiplicamos para sacar un minuto, y ahi obtendriamos las RPM finales...
No entendi muy bien lo del modulo comparador...osea, como trabajarlo... esta seria la herramienta indicada para programar un numero de RPM determinadas, en las cuales nosotros despues querramos encender un LED para avisarnos que llego o paso esas RPM programadas (a esto comunmente se lo llama Shift Light)...
Les comento un detalle extra que es para entender como es el ciclo de las RPM en un motor de 4 tiempos...
cada ciclo finalizado del motor, el distribuidor o en otros casos, el sensor de leva y cigueñal, envia un pulso al tacometro que despues de una cuenta matematica calcula las RPM; Al tratarse de un motor de 4 tiempos, son 4 los pulsos que obtenemos al dar una vuelta completa el cigueñal (osea, al pasar por todos los pasos)
4-Stroke-Engine.gif
Ciclo_de_cuatro_tiempos.png


Si bien, gran parte del proyecto se basa en programacion, no hayque dejar de lado el diseño del hardware, ya que si no protegemos la entrada del microcontrolador, esta se podria quemar; Pero el otro gran detalle, es que si aplicamos un supresor cualquiera, corremos el riesgo de que se deformen y o pierdan pulsos a determinadas frecuencias... Entre hoy y mañana, les subo el diagrama del circuito asi ya lo vamos teniendo todo completito :aplauso:
Gracias amigo por la voluntad y la ayuda (y)

 
hola torres, te cuento que estoy un poco mareado con esto del tmr0 y demas :confused: siempre me lleve mal con las interrupciones... :D me voy a poner a repasar el funcionamiento de las interrupciones y eso del modulo capture y compare. saludosss
 
Hola amigos, la verdad que quiero actualizarme un poco y empezar a hacer las conexiones del PIC a la PC por medio del USB :D

La cosa es que he estado buscando información por Internet y encontré que el Easy HID genera el código en PBP y VB para empezar a hacer nuestros proyectos, ok hasta ahí todo va bien, la cosa es que no entiendo que mas tengo que hacer con el código generado, hay que compilarlo con PicBasic? Porque hay esta mi duda, cuando le doy compilar me genera un montón de errores y no es exactamente por el MPASM porque eso ya lo resolví.

Vean este es un ejemplo, generando código en Pibasic con MPASM para PIC18F4550 para que vean que no genera error ahi, pero vean la otra imagen que es del codigo Easy HID y me da esos errores para ver que respuesta me pueden dar de como solucionar ese problema.

El codigo generado por Easy HID:

DEFINE OSC 48
DEFINE LOADER_USED 1

USBBufferSizeMax con 8 ' maximum buffer size
USBBufferSizeTX con 8 ' input
USBBufferSizeRX con 8 ' output

' the USB buffer...
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte

' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBService every couple *
' * of milliseconds or so... *
' ************************************************************
usbinit ' initialise USB...
ProgramStart:
gosub DoUSBIn
gosub DoUSBOut
goto ProgramStart

' ************************************************************
' * receive data from the USB bus *
' ************************************************************
DoUSBIn:
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available
return

' ************************************************************
' * wait for USB interface to attach *
' ************************************************************
DoUSBOut:
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
return

No entiendo cual es el error al compilar :confused::rolleyes:
 

Adjuntos

  • ejemplo.JPG
    ejemplo.JPG
    72.6 KB · Visitas: 26
  • El_Error.JPG
    El_Error.JPG
    136.5 KB · Visitas: 25
Hola amigos, la verdad que quiero actualizarme un poco y empezar a hacer las conexiones del PIC a la PC por medio del USB :D

La cosa es que he estado buscando información por Internet y encontré que el Easy HID genera el código en PBP y VB para empezar a hacer nuestros proyectos, ok hasta ahí todo va bien, la cosa es que no entiendo que mas tengo que hacer con el código generado, hay que compilarlo con PicBasic? Porque hay esta mi duda, cuando le doy compilar me genera un montón de errores y no es exactamente por el MPASM porque eso ya lo resolví.

Vean este es un ejemplo, generando código en Pibasic con MPASM para PIC18F4550 para que vean que no genera error ahi, pero vean la otra imagen que es del codigo Easy HID y me da esos errores para ver que respuesta me pueden dar de como solucionar ese problema.

No entiendo cual es el error al compilar :confused::rolleyes:

Saludos Nano24
Por acá resolvimos ese problema hace poco.

Suerte.
 
:aplauso::aplauso: mil gracias amigo, sin dudas me funciono pudo generar el archivo hex, pero aun soy novato en esto y quisiera saber que hacer cuando genero el archivo hex como puedo empezar desde algo sencillo como encender un LED por USB desde la pc?
 
hola al mandar 5V el triac se dispara y enciende la carga pero cuando se pone en 0V el triac sige conduciendo ¿alguien puede darme una idea de como lo hago funcionar como interruptor?
 

Adjuntos

  • 01-06-12_123201.jpg
    01-06-12_123201.jpg
    53.8 KB · Visitas: 64
hola al mandar 5V el triac se dispara y enciende la carga pero cuando se pone en 0V el triac sige conduciendo ¿alguien puede darme una idea de como lo hago funcionar como interruptor?

:D:D Para arrancar, eso no es un triac, eso es un scr :D:D:D
Pero suponiendo que lo estas haciendo en un PCb con un verdadero TRIAC, seria bueno ver cual estas implementando, ya que hay dos tipos de triac y si bien son similares, algunas cosas cmabian ;) ... Saludos
 
:aplauso::aplauso: mil gracias amigo, sin dudas me funciono pudo generar el archivo hex, pero aun soy novato en esto y quisiera saber que hacer cuando genero el archivo hex como puedo empezar desde algo sencillo como encender un LED por USB desde la pc?
En el ejemplo USB_Test.rar que adjunte viene como hacer eso.
El programa que se adjunta en VB6 es la interfaz, y el diseño de prueba es el *.DSN de PROTEUS.

Suerte.
 
Interesante, observare para informarme.
Saludos, JuanKa.-

:rolleyes: tenes el triac que hace un par de topic atras distes catedra... y Tenes con deteccion por cruce de cero automatico, que si miras la hoja de datos, te das cuenta que tenemos algunas caracteristicas nuevas ideales para estos proyectos...
Los bugs que vi en el diseño del hardware son que no tienes una R limitadora de corriente para ingresar en el puerto del pic que sera el encargado de saber cuando se produce el pasaje por cero, sintetizando, directamente no estas haciendo eso por que no se ve en el diagrama que subiste... El otro error, es que no esta desacoplado correctamente el pic, de la seccion de control de potencia... Posibles soluciones... sencillo, para no tener que requerir del sensado por pasaje por cero, podes implementar en la salida un triac activo (no pasivo como el BT139) y solo con una señal puedes controlarlo... la otra, es la implementacion de un opto triac (con modulo deteccion por pasaje de cero) como auxiliar de disparo en tu BT139... con esta ultima, desacoplas micro con etapa de potencia y te olvidas de dolores de cabezas...
 
Última edición:
:oops: perdon pero lo que busco es que desde el pic active el triac sin ningun opto, :unsure: pense que con ponerlo en alto se encenderia el foco y en cero se apagaria eso es lo que busco, pero tengo dudas sobre como puedo detectar el cruce por cero mediante el pic, ademas es cierto:cry: cuando apagaba el foco por un interruptor separado, se reinicia el pic; la cuestion es que como podria hacer que prenda y apague una carga sin opto y que no me reinicie el pic;)

por cierto como es eso de triac activo :confused:
 
Última edición:
En el ejemplo USB_Test.rar que adjunte viene como hacer eso.
El programa que se adjunta en VB6 es la interfaz, y el diseño de prueba es el *.DSN de PROTEUS.

Suerte.

Muchas gracias Darkbytes, tendré que ojear muy bien el proyecto de prueba que adjuntaste porque la verdad para ser el inicio lo hiciste muy complejo, no lo entiendo nada pero bueno te agradezco mucho el aporte porque por fin pude solucionar el problema para compilar. :apreton::aplauso:
 
Atrás
Arriba