Curso de programación de PIC en PICBasic Pro

hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo. :) a continuacion, el codigo.
saludosss

Código:
@ DEVICE MCLR_ON, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4
  cuenta var byte
  numero2 var word
  numero var word
  unid var byte
  dece var byte
  cent var byte
  mile var byte
  contar var porta.3
  encera var porta.2
  pausa var porta.1
  
  trisb=0
  cmcon=7
  cuenta=0
  numero=0
  numero2=0
     
OPTION_REG = %0000111   ' Configuración del Registro OPTION 
INTCON = %10100000    ' Configuración del Registro INTCON
ON INTERRUPT GOTO interrup
inicio:
cuenta=0
if contar=0 then display
goto display2
      
  display: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  gosub teclas
  goto display
  
  display2: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  goto inicio
  
  teclas:
      if pausa=0 then inicio
      return
      
    
  
;************** Handler de interrupciones para incrementar contador *************** 
DISABLE                 ;deshabilita interrupciones durante el proceso 
interrup: 
    cuenta = cuenta + 1        
 TMR0=65       
 
        IF cuenta < 20 THEN reset      
        cuenta = 0
        numero = numero + 1 
        IF numero >= 60 THEN 
            numero = 0 
            numero2 = numero2 + 1 
           IF numero2 >= 99 THEN 
            numero2 = 0  
            ENDIF 
            ENDIF
 reset:  
      INTCON.2 = 0           ;resetea la bandera de interrupción del TMR0 
 
      RESUME 
      END
 
hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo. :) a continuacion, el codigo.

Hola Dario, como andas... disculpame por no responder anteriormente, me perdi tu topico.
Che, mira, yo hice exactamente lo mismo con menos recursos y mas sencillo para un sistema experimental de carreras 1/4 milla... osea, con tan solo un 16f877, me arme el cronometro y el resto de los puertos los use para los semaforos y sensores...
Para no tomar muchas lineas de programacion en el ontrol de los display, implemente el CD4026, que es un array-driver de display led 7 segmentos, que funciona por pulsos... Osea, segun la cantidad de pulsos que le das a clock, tenes un numero dado en el display... lastima que no tengo a mano las cosas asi te muestro, pero con la hoja de datos te vas a dar cuenta que es muy basico el manejo, ya que son dos pines de control... uno que es el clock, y el otro que es el reset que lo pone a cero....
el comando que implemente es pulsout (y)
Igualmente, te felicito por tu trabajo
 
Por fa' ¿alguien sabe sí es posible controlar 2 LCD 2x16 con un 16f877a? y sí es así como lo puedo hacer como los controlo en el MCS para enviar mensajes distintos a cada uno de ellos? o como envio mensajes independientes a cada una de las 4 lineas? he estado tratando de muchas formas y no me ha sido posible por favor ayudenme con esto, y conseguir en el mercado de mi pais un LCD de 4 lineas es practicamente imposible, les agradezco su ayuda.
 
Última edición:
hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo. :) a continuacion, el codigo.
saludosss

Código:
@ DEVICE MCLR_ON, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4
  cuenta var byte
  numero2 var word
  numero var word
  unid var byte
  dece var byte
  cent var byte
  mile var byte
  contar var porta.3
  encera var porta.2
  pausa var porta.1
 
  trisb=0
  cmcon=7
  cuenta=0
  numero=0
  numero2=0
 
OPTION_REG = %0000111   ' Configuración del Registro OPTION 
INTCON = %10100000    ' Configuración del Registro INTCON
ON INTERRUPT GOTO interrup
inicio:
cuenta=0
if contar=0 then display
goto display2
 
  display: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  gosub teclas
  goto display
 
  display2: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  goto inicio
 
  teclas:
      if pausa=0 then inicio
      return
 
 
 
;************** Handler de interrupciones para incrementar contador *************** 
DISABLE                 ;deshabilita interrupciones durante el proceso 
interrup: 
    cuenta = cuenta + 1        
 TMR0=65       
 
        IF cuenta < 20 THEN reset      
        cuenta = 0
        numero = numero + 1 
        IF numero >= 60 THEN 
            numero = 0 
            numero2 = numero2 + 1 
           IF numero2 >= 99 THEN 
            numero2 = 0  
            ENDIF 
            ENDIF
 reset:  
      INTCON.2 = 0           ;resetea la bandera de interrupción del TMR0 
 
      RESUME 
      END

Hola Dario,he cargado ese codigo y no me funciona.
Un saludo.
 
Por fa' ¿alguien sabe sí es posible controlar 2 LCD 2x16 con un 16f877a? y sí es así como lo puedo hacer como los controlo en el MCS para enviar mensajes distintos a cada uno de ellos? o como envio mensajes independientes a cada una de las 4 lineas? he estado tratando de muchas formas y no me ha sido posible por favor ayudenme con esto, y conseguir en el mercado de mi pais un LCD de 4 lineas es practicamente imposible, les agradezco su ayuda.
mi opinion es que trates de conseguir un lcd de 4 lineas, si de plano no puedes... entonces te sugiero que utilices 2 pic esclavos que controlen cada lcd(puede ser serial USART o I2C), porque otra alternativa con un solo pic seria utilizando ensamblador(el cual puede ser echo desde picbasic) ¿dificil?... Siiiii. creo :D
espero te sirva mi consejo...
 
Última edición:
Hola amigos pues por aca traigo un programita que estaba diseñando, se trata de un teclado alfabetico aunque tengo un problema que no puedo resolver, el programa se compone de 9 teclas para escribrir el abecedario completo funciona parecido al sistema de los celulares, bueno ahora el problema es que nose como hacer para que escriba en cualquier parte de la pantalla, me podrian ayudar amigos?
 

Adjuntos

  • TECLADO ALFABETICO.rar
    23.8 KB · Visitas: 122
Hola nano realice unas pruebas con tu circuito y lo mejore y modifique un tanto, ya puedes escribir en cualquier parte que te desplaces en la lcd, puedes bajar, subir, ir a la izquierda o la derecha y en cualquier punto que estes colocado puedes empezar a escribir, el teclado que coloque es uno matricial para simplificar el código un poco, aunque el teclado tiene las teclas A,B,C Y D , puedes seleccionar cualquier letra del abecedario con las teclas de arriba y abajo, dejándola pulsada por un tiempo se empiezan a desplazar todas las letras y los caracteres son 50 pueden ser mas con una pequeña modificacion en el comando LOOKUP, y el contador del mismo, dejo esto como aporte al foro en caso de que alguien mas lo necesite espero sirva como ejemplo aunque aun le falta bastante es un buen comienzo...saludosss:apreton:
 

Adjuntos

  • escribir2.rar
    49 KB · Visitas: 136
Hola nano realice unas pruebas con tu circuito y lo mejore y modifique un tanto, ya puedes escribir en cualquier parte que te desplaces en la lcd, puedes bajar, subir, ir a la izquierda o la derecha y en cualquier punto que estes colocado puedes empezar a escribir, el teclado que coloque es uno matricial para simplificar el código un poco, aunque el teclado tiene las teclas A,B,C Y D , puedes seleccionar cualquier letra del abecedario con las teclas de arriba y abajo, dejándola pulsada por un tiempo se empiezan a desplazar todas las letras y los caracteres son 50 pueden ser mas con una pequeña modificacion en el comando LOOKUP, y el contador del mismo, dejo esto como aporte al foro en caso de que alguien mas lo necesite espero sirva como ejemplo aunque aun le falta bastante es un buen comienzo...saludosss:apreton:

:D Muchas gracias amigo eso me va a ayudar mucho en otras ideas, te quedo super bien :aplauso: lo que pasa es que quiero guardar una serie de nombres en la memoria del PIC y al escribirlas el determine si es correcto y la muestre en la LCD
 
hola espere que me puedan ayudar

actualmente estoy usando en PBP y el pic18f4550

y cuando uso el envio de datos buffetout todo me va de maravilla

el problema es que cuando quiero recibir datos bufferin ya funciona bien

este es el codigo que tengo:

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

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 
Symbol USBON = PORTC.6 
Symbol USBOFF = PORTC.7  
Temp var word
DEFINE  ADC_BITS        8 

TRISD= 0
PORTD= 0
TRISC.7= 0
TRISC.6= 0
USBON=0
USBOFF=0
TRISA=1
ADCON0=%00100011
ADCON1=%00000000
ADCON2=%00001000 
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit
ProgramStart: 
 
   USBOFF = 0
   USBON = 1
   ADCIN 0,Temp
   usbservice
   USBBuffer[7]=Temp 
   gosub DoUSBOut
   gosub dousbin
   PORTD= USBBuffer[1]
   goto ProgramStart  
' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
  If PORTC.0 = 0 Then FUERA2 'CONTROLO SI SE DESCONECTÓ DE USB
   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:
  If PORTC.0 = 0 Then FUERA2 'CONTROLO SI SE DESCONECTÓ DE USB
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
   
'sin usb 
   FUERA2:                               'COMIENZO LAZO CERRADO HASTA                                        'VOLVER A CONECTAR A USB
   USBOFF = 1
   USBON = 0


   If PORTC.0 = 1 Then programStart     'CONTROLO SI SE CONECTÓ A USB
   GoTo FUERA2	                         'CIERRO EL LAZO EJEMPLO DE ACTIVIDADES QUE

Gracias
 
Última edición:
pregunta alguien
ha manejado el modulo QEI del 18f2431

Quien pregunto???

suena interesante ese modulo :D

va de lujo para este tipo de encoders no?
Rotary_Encoder.jpg
 
Esta muy bueno el proyecto, me encanta ver esos robots...

con respecto al 18f2431... estoy tratando de simularlo pero hasta ahorita no lo logro :cry: lo estaba haciendo en el simulator ide pero no me incrementa el registro de la posicion ni la interrupcion... lo voy a intentar con el proteus....

si me sale algo te paso lo que he conseguido... hasta pronto...:D
 
Esta muy bueno el proyecto, me encanta ver esos robots...

con respecto al 18f2431... estoy tratando de simularlo pero hasta ahorita no lo logro :cry: lo estaba haciendo en el simulator ide pero no me incrementa el registro de la posicion ni la interrupcion... lo voy a intentar con el proteus....

si me sale algo te paso lo que he conseguido... hasta pronto...:D

este es un ejemplo que publico autotronico en la pag. 55 post #1096

ejemplo de autotronico

es el 18f4331
 
ya no entendi...


lo que tu buscas es saber si alguien ha tenido una experiencia fisica con el QEI,?
porque en ese ejemplo esta como se configura... no?

pd.. por cierto yo no puedo simular el ejemplo de proteus tu si?
 
Última edición:
ya no entendi...


lo que tu buscas es saber si alguien ha tenido una experiencia fisica con el QEI,?

siii, no he tenido tiempo para entrarle a un 18F

porque en ese ejemplo esta como se configura... no?

creo que si.


pd.. por cierto yo no puedo simular el ejemplo de proteus tu si?

Si lo puedo simular
pero puedo variar el PWM y en el display cambia
per la posicion no cambia...

espero dentro de 2 semanas poder empezar a trabajar con un 18F2431
lo que avances para controlar un servomotor con encoder incremental de 2 canales
seria excelente lubeck...

del video anterior donde el robot es de acrilico, ya tenemos la mayor parte de aluminio
faltan algunas bases, pero lo mejor es que ya tengo unos motores de 24v con un
reductor de velocidad de 1:25 y tambien unos encoder de 500 pulsos/rev
para armar ese mismo robot pero ahora mas rapido, rigido, preciso, fuerte, etc., etc., etc.
por eso me interesa mucho hacer el driver con el micro adecuado y no con el 16f877
que actualmente tengo...
 
Última edición:
Si lo puedo simular
pero puedo variar el PWM y en el display cambia
per la posicion no cambia...

ya tambien lo pude simular tenia un problema mi proteus :oops:

si tu encoder es incremental y genera un patron como el siguiente....
Increment.jpg

(el index si lo tiene puedes o no usarlo)

entonces es asi para simularlo y el codigo del amigo autotronico es correcto...
en el video estoy incrementándolo y decrementandolo según las pulsaciones...

lo que no entendi es porque con el pic simulator IDE no se puede, pero bueno, quizas es un error de ese simulador... ya que tengas el pic no olvides comentar los avances...:D

pd..Revisando las cualidades de este pic me doy cuenta que tiene conversores AD simultaneos :eek:, en un tema alguien necesitaba uno de estos, pero no me acuerdo donde...:LOL:
 
Última edición:
Atrás
Arriba