• Martes 5 de Noviembre de 2024, 15:34

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - oldkami

Páginas: 1 [2]
26
Microcontroladores / Re: Codigo De Impresion
« en: Miércoles 15 de Junio de 2005, 20:53 »
basicamente lo que debes tener en cuenta es que las impresoras ,de comunicacion Paralela,   poseen un modo en comun de funcionamiento, siguiendo el protocolo Centronics de transmision de datos.  con ese protocolo puedes comunicarte con cualquier impresora.

existen 3 "puertos" en un dispositivo de comunicacion paralela, el primero lo llamamos data, el segundo control, y el tercero es un status.

Data = 8 bits (D0-D7) (ej Port B :))

Control = (del pic a la impresora)
Strobe
Autofeed
Initialize
SelectInput

Status = (de la impresora al pic)
Error
online
outpaper
acknowledge
busy

como es logico a cada pin del PIC le corresponde 1 de estos pines

*Strobe
– Un pulso cada vez que se envía un byte
– El periférico detecta que la información es estable.
* Data0Data7
– Cotienen el byte de datos.
*Acknowledge
– El periférico indica que ha recibido el byte.
* Busy
– El periférico indica que aún no está preparado para recibir otro byte.
* Paper End
– La impresora indica que se ha quedado sin papel.
* Select
– El periférico indica que se encuentra en línea.
*Auto Feed
– Permite conmutar entre
   Retorno de carro: Volver al comienzo de línea.
   Retorno de carro: Volver al comienzo de línea y añadir línea nueva.
* Error
– El periférico indica un error de hardware.
* Init
– El PIC inicializa el periférico.
* Select In
– El PIC coloca el periférico fuera de servicio.
* GND0GND7
– Tomas de tierra individuales para cada línea.

Visto asi es muy logico, primero seleccionas el dispositivo,inicializa el dispositivo, esperas la señal online y acknodledge, transmites autofeed,esperas acknowledge y online, colocas el dato en el puerto(ASCII), parpadea el strobe, acknodledge, luego el siguiente, y el siguiente etc..

la impresora posee un set de fuentes definidos y otros programables, siempre existe uno por defecto, y ese es con el que se imprimira de esta manera, esta forma de impresion se llama modo texto. Tratar de cambiar la fuente y el tamaño de la fuente ya se convierte en algo relativo a cada impresora y es un problema mucho mas complejo, es practicamente hacer un driver para la impresora y es necesario conocer profundamente los comandos de la misma.

Suerte

oldkami

27
Microcontroladores / Pic Y Trf2.4 Ghz Marca Laipac
« en: Miércoles 15 de Junio de 2005, 20:14 »
Estoy realizando un proyecto en donde se necesita monitorear las variables de vuelo de un aeromodelo(velocidad,altura,etc), para transmitir los datos desde el avion y ya que no tengo experiencia en RF opte por adquirir el modulo TRF2.4 ghz marca Laipac, pero tengo problemas en hacerlos funcionar, ¿alguien A trabajado con estos Modulos?  Agradezco toda la Informacion que me puedan suministrar.


Suerte

oldkami

28
Microcontroladores / Re: Problema Con 16f877
« en: Martes 29 de Marzo de 2005, 19:41 »
si lo que se quiere es mostrar el numero en 1 solo display no veo la necesidad de "multiplexar" simplemente envias el numero en binario y ya.

Ahora si se tienen más de 1 display y se quiere ahorrar la mayor cantidad de pines se puede hacer declarando un puerto para que ubique el numero y otro para seleccion del display.

la idea es que mientras se muestra un numero  en un display especifico los demas estan apagados. esto es sencillo de hacer si conectas el anodo o el catodo comun al pin del  puerto que se debe utilizar para hacer el barrido. obviamente todos los display reciben el mismo numero es decir, estan conectados al mismo 7447.

Si se desea escribir el numero "123" la secuencia seria la siguiente:
PORTA = puerto de barrido
PORTA.0= Unidades
PORTA.1= Decenas
PORTA.2= Centenas
PORTB = Puerto de numero (4 bits del puerto representan el numero)

1) se selecciona el pin de las unidades
2) se envia el numero "3".
3) se emplea un retardo para visualizar el numero
4) se cambia al pin de las decenas.
5) se envia el numero "2"
6) se emplea un retardo.
7) el pin de las centenas
8) envia "1"
9) retardo.
10) vuelve al paso 1 y realiza todo otra vez.

 En la mayoria de ocaciones es mejor utilizar una interrupcion mediante un temporizador (TICK)  para realizar los retardos. Algo asi como un servicio de visualización. el servicio se programa para que en cada interrupcion evalue su estado actual y según eso muestre el siguiente numero. cabe decir que para que para que el ojo humano no detecte parpadeos los display deben actualizarse al menos 30 veces por segundo. es ademas conveniente que el tiempo de retardo sea
suficientemente mayor al tiempo que demora el cambio de display (1 o 2 ciclos) ya que si no se deja un tiempo de retardo suficiente existe un instante en el que el display muestra al dato anterior mientras el puerto de datos cambia el valor, esto hace que el ojo no reconozca claramente el patron y el ojo "superpone" combinando el valor de los dos numeros en una figura poco reconocible. si el tiempo de retardo es suficientemente alto, el ojo no percibe que el valor anterior fue escrito en el display y portanto reconoce correctamente el numero actual.

Suerte...

Oldkami

29
Microcontroladores / Re: Como Soldar Smd's
« en: Viernes 11 de Febrero de 2005, 15:05 »
con una punta miniwave y un poco de flux es muy facil soldar smd.  puedes comprar alguna de cualquier fabricante y ajustarla a tu soldador. se obtiene muy buenos resultados siempre y cuando la pista este bien estañada. presionas con un poco de fuerza y en linea recta , la forma de la punta y el flux te añudan a que no se formen "grumos" y que el acabado sea uniforme.

Saludos

oldkami

30
Microcontroladores / Re: Problemas Al Iniciar Con Los Pic
« en: Lunes 29 de Noviembre de 2004, 22:52 »
Hola girasol, la respuesta a tu pregunta es muy sencilla , ¡es imposible que un pic capture con toda precision ese rango de frecuencia ¡ 400mhz es  40 veces mas rapido que el bus interno de un pic 18F (40mhz/4) que es uno de los PIC más rapidos.

como sabras la teoria nos dice que para tener un muestreo decente la razon de muestreo debe ser de almenos >2*f y en el caso de 400MHZ tendrias que muestrear a porlo menos 801MHz y tendrias resultados no muy satisfactorios.

no estoy muy seguro de la aplicación, pero tal vez necesites un conversor ADC de ultra velocidad, y seguramente un microprocesador o un dsp lo suficientemente rapido.

seguramente tendras que reevaluar el proyecto...


Saludos

oldkami

31
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Jueves 21 de Octubre de 2004, 23:07 »
Citar
no sé por qué no me deja empezar desde la direccion 5 que se supone que es la posicion libre inmediatamente despues del vector de interrupción.

además , he intentado añadir "pagesel" en el vector de interrupcion para saltar a la ISR y me dice que no cabe. No será pq sólo hay una palabra de espacio para el mapeo del vector de int. en la 04?


Ese sintoma... sip, tienes razon, no compila. Disculpas a todos  :hola: .  pero olvide mencionarlo, se debe precisamente a las restricciones que impone el script *.lkr que utiliza el linker . en la definicion del espacio de inicio (vectors), una de las posibles la soluciones la coloco a continuación:
Código: Text
  1.  
  2.     title "Ejemplo ISR"
  3.     list P=16F877
  4.     #include "P16F877.inc"
  5.  
  6.   UDATA_SHR
  7. irq_w        res d'1'
  8. irq_status  res d'1'
  9.  
  10. RESET_VEC  CODE  0x0000
  11.       pagesel  INICIO
  12.       goto       INICIO                     &#59;hasta aqui 3 instrucciones
  13.       nop
  14. INT_VEC    bcf      INTCON,GIE     &#59;vector de interrupcion 0x0004 y fin de
  15.                                                    &#59;seccion (vectors)
  16. ISR  code 0x0005                         &#59;colocar el ISR inmediatamente despues
  17. ISR:
  18.      btfsc      INTCON,GIE &#59;paranoia
  19.      goto    INT_VEC      &#59;o goto $-2
  20.  
  21.      movwf    irq_w
  22.      swapf      irq_w,F
  23.      movfw    STATUS
  24.      movwf    irq_status   &#59;cambio de contexto
  25.  
  26.      btfsc      INTCON,(mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  27.                                                   &#59;el tipo de interrupcion
  28.      goto     ATENDER                    &#59;atiende la interrupcion
  29.      goto     END_ISR                     &#59;sale del ISR
  30.  
  31. ATENDER
  32.   &#59;el codigo necesario
  33.  
  34.  
  35. END_ISR
  36.     movfw    irq_status   &#59;vuelve al contexto anterior
  37.     movwf    STATUS
  38.     swapf     irq_w,W
  39.     retfie                        &#59;esta instruccion coloca el GIE en ON
  40.  
  41.  
  42. INICIO
  43.   goto  $      &#59;mi codigo
  44. END
  45.  
  46.  
  47.  
  48.  

es lo mejor, ya que se atiende la interrupcion de la manera mas rapida posible (con pagesel + goto ISR se toma 4 instrucciones mas) y te permite compilar :).

 otra alternativa es modificar el archivo *.lkr para extender la seccion Vectors con el fin de colocar el codigo apropiado:

Código: Text
  1.  
  2.  
  3. ;ejemplo con 16F877.lkr
  4. ; codigo original
  5. CODEPAGE   NAME=vectors   START=0x0      END=0x4      PROTECTED
  6. CODEPAGE   NAME=page0     START=0x5      END=0x7FF
  7.  
  8. ; codigo modificado
  9. CODEPAGE   NAME=vectors   START=0x0      END=0x6      PROTECTED
  10. CODEPAGE   NAME=page0     START=0x7      END=0x7FF
  11.  
  12.  

con esto obtienes 2 palabras adicionales en la seccion STARTUP para ubicar
pagesel ISR  y goto ISR.

Código: Text
  1.  
  2.  
  3. RESET_VEC  CODE 0x0000
  4.         pagesel  MAIN
  5.         goto       MAIN   &#59;hasta aqui 3 instrucciones
  6.         nop
  7.  
  8. INT_VEC   code 0x0004
  9.         pagesel  ISR               &#59;aqui 0x0004 (vect Interrupt) y 0x0005
  10.         goto       ISR               &#59;0x0006 final de Vectors
  11.  
  12. ISR  CODE                &#59;donde sea... o asignado por el linker
  13.  
  14. ISR:
  15.      
  16.     &#59; Aqui mi ISR
  17.  
  18.  
  19.  



Aunque esta alternativa le quita portabilidad al codigo (tendrias que modificar cada *.lkr que necesites), aunque yo la utilice en el codigo que envie anteriormente :) extendiendo mucho la seccion vectors.

Con estos ejemplos creo que ya se pueden defender en la construccion de la seccion de interrupciones.


En cuanto a la segunda pregunta, deberias iniciar una nueva discusion y anexar el codigo para ser evaluado, ya que se sale un poco del tema de esta discusion que es el uso de interrupciones en pic 16f877, sin embargo te adelanto que no veo mayor problema en ese codigo, a menos que la subrutina "delay_1s" o alguna otra rutina sobreescriba el puerto. Dificil saberlo con la información que enviaste.


Saludos

Oldkami

32
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Domingo 17 de Octubre de 2004, 07:37 »
Errata 2:

uicchhh..

ISR:
     bcf         INTCON,GIE
     btfsc      INTCON,GIE  ;paranoia
     goto       ISR


tal vez ya esta muy tarde.. que duerman  -_-


Saludos

Oldkami

33
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Domingo 17 de Octubre de 2004, 07:31 »
erratas:
Código: Text
  1.  
  2.   btfsc      INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  3.                                                     &#59;el tipo de interrupcion
  4.   goto       ATENDER                       &#59;si el bit esta en set atiende
  5.   goto       END_ISR                        &#59;si es clear sale de la rutina (aunque si es asi
  6.                                                     &#59;alguna interrupcion no prevista se ejecuto)
  7.  
  8.  
  9.  

Creo que asi es mas claro :)

Saludos

Oldkami

34
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Domingo 17 de Octubre de 2004, 07:23 »
1- Desde que yo programo pics (hace ya casi unos 4 años) es la primera vez que escucho que el GIE en INTCON se desactiva con solo ejecutarse una interrupción. Esto definitivamente !no es verdad¡ es necesario desactivar el INTCON,GIE si se quiere atender la interrupción, de lo contrario se corre el riesgo que el programa se interrumpa continuamente,  y esto puede causar multiples consecuencias, desde desbordar el stack del micro y ocasionar reset del mismo, hasta alterar los datos en las variables de contexto y volver de la interrupcion con datos totalmente erroneos (W,STATUS,OPTION, PCLATH, etc). solo cuando se realiza algo complejo como interrupciones priorizadas se tendria en cuenta no apagar el GIE. lo que si es cierto es que al ejecutar RETFIE el bit GIE es activado automaticamente para permitir atender la siguiente interrupcion.

2- En el codigo de sinchip existen dos errores, uno fatal y el otro no muy obvio.

a-  ¿btfsc    INTCON,INTF?  ; yo creo que es mejor btfss        :)
       goto    noint               ; de lo contrario siempre va a noint

b- cuando se seleccionan las variables para hacer el cambio de contexto, lo mejor es definirlas en la seccion UDATA_SHR, con el fin de no cambiar el registro STATUS con la operacion "banksel"  ya que si se regresa de la interrupcion se puede llegar al programa principal con un banco no deseado. ademas, repito hace falta apagar el GIE en el servicio de interrupciones.  algo asi como:

Código: Text
  1.  
  2.  
  3.   UDATA_SHR
  4. irq_w        res d'1'
  5. irq_status  res d'1'
  6.  
  7. RESET_VEC  CODE  0x0000
  8.        pagesel  INICIO
  9.        goto       INICIO
  10.  
  11.  
  12. INT_VEC   code 0x0004
  13.        pagesel  ISR
  14.        goto       ISR
  15.  
  16.  
  17. ISR:
  18.       bcf         INTCON,GIE
  19.       btfsc      INTCON,GIE  &#59;paranoia
  20.  
  21.       movwf    irq_w
  22.       swapf      irq_w,F
  23.       movfw    STATUS
  24.       movwf    irq_status    &#59;cambio de contexto
  25.  
  26.       btfss      INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  27.                                                        &#59;el tipo de interrupcion
  28.       goto       ATENDER
  29.  
  30.  
  31. ATENDER
  32.     &#59;el codigo necesario
  33.  
  34.  
  35. END_ISR
  36.      movfw    irq_status    &#59;vuelve al contexto anterior
  37.      movwf    STATUS
  38.      swapf     irq_w,W
  39.      retfie                         &#59;esta instruccion coloca el GIE en ON
  40.  
  41.  
  42. INICIO
  43.                                  &#59;mi codigo
  44. END
  45.  
  46.  
  47.  




Saludos

Oldkami

35
Microcontroladores / Re: Programador Para La Familia Dspic 30 F ?
« en: Domingo 10 de Octubre de 2004, 20:37 »
En mi opinion, guardar las esperanzas en que microchip saque al mercado el DSP que necesitas puede ser cuestion de muchisima "fe", es posible que demoren cualquier cantidad de tiempo en sacar ese producto...

Si el problema es relativo a poder de procesamiento principalmente por calculos como multiplicaciones no veo porque no puedas utilizar un pic 18F452 que posee esa operacion incluida en su "ALU" por lo que puedes realizar ese calculo con un par de instrucciones y se ejecuta en un ciclo, ademas creo que los 10 MIPS que posee ese microcontrolador te permite unas 400 instrucciones antes que se cumpla el tiempo de 40uS que requieres, ademas muchos quemadores son capaces de programar este dispositivo. por ejemplo, yo uso el programador WISP628 basicamente porque no me gusta mover el microcontrolador del protoboard y colocarlo en otro socket, y arriesgarme a que tarde o temprano se eche a perder uno de sus pines, hasta la fecha me ha funcionado muy bien..

wisp628

si ademas de eso tambien necesitas dividir, en mi opinion lo mejor que puedes hacer es cambiar de familia de microcontrolador. El motorola MC68HC908GP32 posee en su alu instrucciones de multiplicación y division implementados, y si no me equivoco te permite unos 8 MIPS, y es un poco mas caro que un 16f877 pero mas economico que un 18f452 :) . es cierto que necesitarias comenzar de cero al tratar de implementar todos los algoritmos para ese tipo de microcontrolador pero es algo mas factible que esperar la salida del dsp e igualmente implementar los algoritmos para el dicho dsp, buscar un quemador, etc..

saludos

Oldkami

36
Microcontroladores / Re: Problemas Con Picdem 2 Plus, Y 18f452 (adc)
« en: Domingo 3 de Octubre de 2004, 19:07 »
Si estas seguro que no es la configuración tal vez pueda ser debido a algúna clase de ruido que hace interferencia con la señal de entrada en el adc. los sistemas "sample and hold" pueden causar "rebotes" en la alimentación que redundan en lecturas erroneas. debido a que estos problemas son un tanto dificiles de detectar, te recomiendo 4 consejos:

1- por cada elemento activo que poseas en tu circuito, colocar un condensador de 0.1uF si la frec. de trabajo es menor o igual a 4 Mhz, o de 0.01uF si la frec. es mayor, este condensador se ubica lo mas cerca posible de los pines de alimentacion de dicho elemento.

2- para evitar las frequencias de niquist, tal vez necesites colocar un filtro pasabajos, bajate el filter lab de microchip, es gratis y te ayuda en el diseño de estos filtros.

3- trata de ubicar los elementos que trabajan a mayor frecuencia lo mas cerca posible de la fuente(microcontrolador y otros sistemas digitales) y los mas lentos o los analogos un poco mas lejos.

4- si continua el problema, tal vez debas disminuir la tasa de muestreo.

Si sigues estas recomendaciones es muy probable que soluciones los problemas del adc, aunque como todo, depende de la configuración especifica de tu sistema.

por ultimo, si nada de esto te funciona, talvez debas realizar una rutina que promedie los datos (por ejemplo tomas 256 lecturas, las vas sumando en un numero de 2 bytes y al final el byte alto te mostrara un resultado muy similar al promedio de las lecturas.), es algo asi como una especie de "filtrado digital", aunque cualquier otra tecnica de filtrado digital te puede dar buenos resultados.


Saludos.

Oldkami

37
Microcontroladores / Re: Necesito Ejemplo Tmr0 Pic16f84a
« en: Sábado 2 de Octubre de 2004, 00:31 »
Bueno, lo primero que debes saber es que el TMR0 se configura en el registro OPTION.

si el OPTION_REG,T0CS = 0 se configura el TMR0 en modo "timer" es decir, se incrementa al ritmo del ciclo de instrucciones (Fosc/4).
si OPTION_REG,T0CS = 1 se asigna como contador, es decir, cuenta dependiendo de los pulsos de entrada en RA4.

Imagino que te refieres a como usar el TMR0 en el modo "Timer"

El TMR0 comienza a contar "inmediatamente" se le asigna un modo, por ejemplo, asumiendo que el valor del OPTION_REG,T0CS =0 al iniciar despues de un reset, el Timer0 se coloca en modo "timer" y comienza a contar inmediatamente despues de dicho reset. Una vez el contador alcanza su valor maximo (8 bits) se activa la bandera de desborde INTCON,T0IF = 1. si tienes activada la interrupcion INTCON,T0IE el apuntador de programa (PC) se dirige al vector de interrupción en el momento que INTCON,T0IF =1, que en el caso del 16f84A es el 0x0004.

Por tanto, si quieres comenzar unconteo en modo "timer" lo mejor es inicializar el valor de TMR0 (por ejemplo: clrf TMR0). al escribir el TMR0, este se coloca en "Espera" por dos ciclos, es decir que posees un tiempo de dos ciclos antes que el timer comience su operación normal. durante este tiempo es conveniente borrar la bandera de desborde INTCON,T0IF , la cual es la que consultamos si queremos saber si ya se acabo el conteo.

ej queremos contar 100 ciclos:
Código: Text
  1.  
  2.      banksel  OPTION_REG
  3.      movlw    X                  &#59; Asignas el preescaler, (revisa el valor adecuado en
  4.      movwf    OPTION_REG &#59; el pdf del PIC)
  5.  
  6.      banksel TMR0
  7.      movlw   d'255'-d'100'   &#59; inicializamos con el valor de desborde que es 255 y le
  8.                                        &#59; restamos el valor que queremos contar
  9.      movwf   TMR0             &#59; a partir de aqui contamos con 2 ciclos
  10.      bcf         INTCON,T0IF &#59; borramos la bandera ya que no sabemos si ya
  11.                                       &#59; se desbordo el timer
  12.      nop                           &#59; desde aqui comienza a contar ¡¡
  13.  
  14.      btfss       INTCON,T0IF&#59; evaluamos si el timer ya realizo su labor.
  15.      goto        $-1              &#59;esperar...
  16.  
  17. CODIGO_QUE_SIGUE
  18.                                      &#59; ya acabo de contar, y continua el programa.
  19.  
  20.  

el preescaler es simplemente el numero de ciclos que deseas que transcurran antes que se incremente el TMR0, con esto logras tiempos mas largos. estos valores los encuentras en el pdf del PIC.  

Espero te haya servido de algo...


Saludos

Oldkami

38
Microcontroladores / Re: Rutina De Tx Y Rx Con Pic 16f870
« en: Lunes 27 de Septiembre de 2004, 23:01 »
No recuerdo muy bien donde encontre estas rutinas, sirven para configurar un rs232 por software.   espero que te sean de ayuda.


Código: Text
  1.  
  2. ;transmite serialmente a 9600bps con un xtal de 4MHz
  3. ;se deben definir las siguientes variables:
  4. ;  RXport  
  5. ;  RXtris
  6. ;  TXport
  7. ;  TXtris
  8. ;  RS_TEMP1
  9. ;  RS_TEMP2
  10. ;  RXD
  11. ;  TXD
  12. ;  RB0, ES LA SEÑAL DE RX
  13.  
  14.  
  15.   #define  RXport  PORTB,0
  16.   #define  RXtris  TRISB,0
  17.   #define  TXport  PORTB,1
  18.   #define  TXtris  TRISB,1
  19.  
  20.   CONSTANT  LF   = d'10'
  21.   CONSTANT  CR = d'13'
  22.   CONSTANT  TAB = d'9'
  23.   CONSTANT  BS   = d'8'
  24.  
  25.   UDATA_SHR
  26. RS_TEMP1  RES  1
  27. RS_TEMP2  RES  1
  28. RXD    RES  1
  29. TXD    RES  1
  30.  
  31.  
  32.  
  33. ;MACROS
  34.  
  35. RS232init  macro
  36.   call  RS_init
  37.   endm
  38.  
  39. SEND  macro  S_String
  40.   movlw  S_String
  41.   call  SENDsub
  42.   endm
  43.  
  44. SENDw  macro
  45.   call  SENDsub
  46.   endm
  47.  
  48. RECEIVE  macro
  49.   call  RECsub
  50.   endm
  51.  
  52. ;subrutinas
  53. ;RS_init inicializa
  54. RS_init  bsf  TXport    
  55.   banksel  OPTION_REG
  56.   clrf  OPTION_REG
  57.   bcf  TXtris
  58.   bsf  RXtris
  59.   banksel  TXport
  60.   bsf  TXport
  61. &#59;movlw  INTCON
  62.   RETURN
  63.  
  64. ;RECsub  recibe el dato serial  
  65. RECsub  call  RS_Wait
  66.   btfsc  RXport  &#59;
  67.   goto  REENTRY  &#59;
  68.   movlw  0x08
  69.   movwf  RS_TEMP1
  70.   goto  RECa
  71. RECa  call  R_Wait
  72.   btfss  RXport
  73.   goto  RECb
  74.   bsf  RXD,0x07
  75.   goto  RECc
  76. RECb  bcf  RXD,0x07
  77. RECc  decfsz  RS_TEMP1,0
  78.   rrf  RXD,1
  79.   decfsz  RS_TEMP1,1
  80.   goto  RECa
  81.   call  R_Wait
  82.   btfss  RXport
  83.   clrf  RXD
  84.   retlw  0x01
  85.  
  86. ;REENTRY limpia RXD en caso de malentendido
  87. REENTRY  
  88.   clrf  RXD
  89.   movlw  0x0F
  90.   movwf  RXD
  91.   retlw  0x01
  92.  
  93. ;SENDsub transmite un dato almacenado en W
  94. SENDsub  movwf  TXD
  95.   bcf  TXport
  96.   movlw  0x08
  97.   movwf  RS_TEMP1
  98.   call  S_Wait
  99. SENDa  btfsc  TXD,0
  100.   goto  SENDb
  101.   bcf  TXport
  102.   goto  SENDc
  103. SENDb  bsf  TXport
  104. SENDc  rrf  TXD,1
  105.   call  S_Wait
  106.   decfsz  RS_TEMP1,1
  107.   goto  SENDa
  108.   goto  SENDd
  109. SENDd  bsf  TXport
  110.   call  S_Wait
  111.   call  S_Wait
  112.   bsf  TXport
  113.   RETURN
  114.  
  115. ;rutinas de espera: deben ser cambiadas segun el xtal usado
  116. ;y la tasa de baudios.
  117.  
  118. S_Wait  movlw  0x1E
  119.   movwf  RS_TEMP2
  120.   goto  X_Wait
  121. RS_Wait  movlw  0x0C
  122.   movwf  RS_TEMP2
  123.   goto  X_Wait
  124. R_Wait  movlw  0x1D
  125.   movwf  RS_TEMP2
  126.   goto  X_Wait
  127. X_Wait  decfsz  RS_TEMP2,1
  128.   goto  X_Wait
  129.   RETURN
  130.  
  131.  

Saludos

Oldkami

39
Microcontroladores / Re: Manejo De Lcd 1602c Con 4 Bits
« en: Viernes 17 de Septiembre de 2004, 06:18 »
http://www.crystalfontz.com/products/1602c...1602CYYHJPV.pdf

aqui esta el set de instrucciones y un algoritmo de inicializacion.

http://www.geocities.com/dinceraydin/lcd/index.html

aqui se que explica el manejo de lcd en general.

Saludos

Oldkami

40
Microcontroladores / Re: Aprendiendo Desde Cero
« en: Viernes 17 de Septiembre de 2004, 05:52 »
Si te consideras totalmente muy "verde" todavia para el proyecto, entonces tal vez necesites leer algunos de estos tutoriales:

http://www.todorobot.com.ar/informacion/informacion.htm

o cualquier otra información relacionada.. principalmente con el manejo de motores Paso a Paso,Servomotores y sensores en general.


Si ya leiste los manuales de link del mensaje anterior ya tienes bases para comenzar a planear el programa.
Hecho esto debes pensar cuantas salidas y entradas necesitas, y de que naturaleza (digitales o analogas) con el fin de controlar los motores, sensar la luz, detectar el carro etc.. de aqui seleccionas el microcontrolador mas apropiado. para esto tal vez se necesario revisar el catalogo de Microchip. es muy util para seleccionar adecuadamente el PIC a usar. es bueno enterarse que Pics es capaz de "quemar" el programador que posees antes de ir a comprarlo. por lo general para el desarrollo de prototipos es importante poder quemar el pic varias veces, por eso fijate de no adquirir un PIC OTP ¡¡ (solo por si acaso :)), cualquier pic que posea una "F" te asegura que no es OTP (ejemplo 16F873).


de todas formas si sabes algo de ingles te recomiendo este ebook

http://www.mikroelektronika.co.yu/english/...ook/picbook.htm

Es muy bueno y explica con suficiente detalle varias cosas con respecto a los PIC

los brazos mecanicos pueden costarte algun trabajo, tal vez sea lo mas complicado, aunque no es nada que una transmision apropiada no pueda solucionar, se puede hacer el brazo de varias formas a saber neumatico, hidraulico, electrico, y hasta solamente mecanico,  ya aqui interviene más la imaginacion que cualquier ejemplo que se pueda mostrar, para seleccionar el sistema de acuerdo a los recursos que se tienen y los requerimientos de la aplicacion (dinero, herramientas, conocimiento, etc.). como idea, y si el carro no es muy pesado, uno o dos servomotores ubicados firmemente en una superficie fija y una transmision directa con un tornillo que mueve una plataforma, puede ser suficiente como sistema de elevacion para una maqueta pequeña.


es muy util e importante realizar el algoritmo para el sistema de control. casi todos los principiantes alguna vez pasan por alto este paso, en mi opinion, es mejor demorarse en aqui y pensar muy cuidadosamente todo lo que debe hacer el sistema y como se debe hacer,  con el fin de evitar errores de Logica, los cuales son realmente dificiles de trazar en un programa hecho en Assembler (o en cualquier lenguaje),y ademas ganas tiempo, ya que posees una estructura definida de como va el programa y asi es mas facil traducir a codigo.

para lo anterior puedes realizar un diagrama de flujo normal, o cualquier tecnica de programacion que conozcas.  tal vez quieras introducirte en el manejo de diagramas grafcet,  estos son una buena aproximacion inicial en el desarrollo de cualquier automatismo, para tener idea de como va:

http://edison.upc.es/curs/grafcet/

Aunque de seguro en el google puedes encontrar muchas mas..

para lo demas, (rutinas para manejo de motores paso paso o servos, montajes para sensores, etc.)  creo que es lo de menos de que preocuparse, ya que existen muchas paginas con ejemplos y codigo.

No estoy seguro si todo esto sea de alguna ayuda, o si ya lo sabias y te has quedado dormido leyendo este mensaje, pero bueno, yo creo que si la pregunta era como estructurar el proyecto, ya te habras hecho una idea...

Saludos

oldkami

41
Microcontroladores / Re: Integración De Voz
« en: Lunes 6 de Septiembre de 2004, 23:42 »
La idea es bastante complicada de hacer.. mira la nota de aplicacion de TCP IP con pic 18Fx en la pagina de Microchip, con eso te haces a la idea de lo complejo que llegar a ser.  El termometro Rf tal vez sea algo mas facil de llevar a feliz termino, pese a las dificultades del tamaño, ya existen bastantes elementos de montaje superficial y de bajo consumo que te podria facilitar el proceso.

Saludos

Oldkami

42
Microcontroladores / Re: Controlar Mi Pc Desde Un Movil
« en: Lunes 6 de Septiembre de 2004, 23:32 »
si utilizas el celular y deseas usar la linea telefonica de la casa y activar un controlador, no necesitas el PC, con un circuito detector basado en DTMF puedes realizar esta labor. el circuito decodifica los tonos del telefono (marcados desde el celular) y los convierte a binario (el dtmf MT8870 por ejemplo) desde hay, con el programa adecuado para el pic, puedes controlar tantas salidas como quieras. por google puedes encontrar muchisimas aplicaciones con este integrado.


Saludos


Oldkami

43
Microcontroladores / Re: Manejo De Menues
« en: Lunes 6 de Septiembre de 2004, 23:22 »
:D

44
Microcontroladores / Re: Manejo De Menues
« en: Jueves 2 de Septiembre de 2004, 21:39 »
Te recomiendo la siguiente tecnica, en ella mueves un numero equivalente a la rutina y llamas una "tabla de rutinas" esta tabla realiza un goto a la rutina deseada
y desde cada una realizas un "Return"


Código: Text
  1.  
  2.  
  3.  
  4.  
  5. ;{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
  6. ; Función    TABLA_DE_RUTINAS
  7.  
  8. ; Metodo de llamado
  9.  
  10. ;  movlw  NumMiRutina
  11. ;  movwf  TablaOffset
  12. ;  pagesel  TABLA_DE_RUTINAS  
  13. ;  call  TABLA_DE_RUTINAS
  14.  
  15. ; Descripción;  Ejecuta una rutina segun una tabla
  16. ; Detalle:    Se utiliza una tabla para realizar un llamado a rutina.
  17. ;    estas rutinas deben terminar en Return para la correcta
  18. ;    Ejecución.
  19. ; Salida:    goto  miRutina.
  20. ;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  21.  
  22. TABLA_DE_RUTINAS:
  23.   movlw  HIGH T_RUTINAS
  24.   movwf  PCLATH
  25.   banksel  TablaOffset
  26.   movlw  LOW T_RUTINAS
  27.   addwf  TablaOffset,W
  28.   btfsc  STATUS,C  &#59;se cruzo la pagina?
  29.   incf  PCLATH,F
  30.   movwf  PCL
  31.  
  32. T_RUTINAS
  33.   goto  CMD_A
  34.   goto  CMD_B
  35.   goto  CMD_C
  36.   goto  CMD_D
  37.   goto  CMD_E
  38.   goto  CMD_F
  39.  
  40.  
  41. CMD_A
  42.  
  43. &#59;...Codigo de A
  44.  
  45.   Return
  46.  
  47. CMD_B
  48. &#59;Codigo de B
  49.  
  50.   Return
  51.  
  52. etc...
  53.  
  54.  
  55.  

La salida de reloj es mejor hacerla mediante el pwm del PIC, con eso mientras se atiende el teclado puedes desentenderte del reloj.

Saludos...

Oldkami

45
Microcontroladores / Re: Instrucciones De La Programacion Del Pic 16f84
« en: Lunes 30 de Agosto de 2004, 17:55 »
Hola..

Te recomiendo leer completamente las ayudas que vienen con el compilador MPLAB para que aprendas más sobre lo relacionado a la programacion.

goto $-1 realiza un salto a la operación inmediatamente anterior.

Aunque este y muchos programas de ejemplo vienen en codigo Absoluto, no te recomiendo  te acostumbres mucho a este estilo de programación, ya que tiende a ser un gran "generador de errores" de dificil solucion ademas de ser demorado de desarrollar.  Cosas como

BSF STATUS,RP0  para seleccionar el banco del registro TRISA, es eficiente en codigo pero creeme, tarde o temprano te equivocas en programas extensos y luego no encuentras el error. utiliza por ejemplo

banksel TRISA
clrf TRISA

con eso no solo estas seguro de  que seleccionaste el banco adecuado, sino que no necesitas consultar en todo momento el manual para saber el banco adecuado.

   Aprende a programar haciendo modulos (Relocatable modules) que te permite hacer tus programas mucho más legibles, y faciles de portar de un pic a otro. y utiliza macros para hacer secciones de codigo similares (DRIVE 2, DRIVE4, DRIVE6).  de esa forma es más facil leer lo que hace el programa. te recomiendo empieces a hacerlo con este mismo programa. con eso  no solo tu, sino varias personas aprenden a programar de esta manera.

Saludos..

oldkami

46
Microcontroladores / Re: Termopar Al Pic
« en: Miércoles 25 de Agosto de 2004, 17:43 »
en que exactamente necesitas ayuda?

47
Microcontroladores / Re: Pic16f876a
« en: Martes 10 de Agosto de 2004, 00:41 »
mira el AN544 "Math Utility Routines" que esta en la pagina de microchip.
en la sección ARITH.ASM hay un ejemplo para "double precision square root"

Suerte

48
Microcontroladores / Re: Convertir Valores Binarios A Decimales
« en: Martes 10 de Agosto de 2004, 00:32 »
mira el AN554 "math routines" de microchip existe una seccion que se llama BCD. asm en donde hay rutinas para convertir un numero binario a uno decimal

49
Microcontroladores / Re: Retardo En 16f84
« en: Martes 10 de Agosto de 2004, 00:20 »
El retardo mas facil y comun es el que se hace mediante bucles anidados. un ejemplo sencillo:


   cblock  0x20
   CONT1
   endc

    movlw      k
   movwf      CONT1
Bucle:
   decfsz      CONT1,F
   goto         Bucle
   .
   .
   .
   END

para calcular el tiempo del retardo entonces:


operacion                             num ciclos

movlw   k                              1
movwf                                   1
decfsz  CONT1,F                     k-1     (mientras CONT1 no llegue a 0)
decfsz  CONT1,F                     2        (por el salto al llegar CONT1 a 0)
goto     Bucle                         2*(k-1)

total                                     (3*k) + 1  ciclos

cada ciclo maquina toma 1 microsegundo si el XTAL es de 4mhz.
como k no puede ser mayor que 255 el numero obtendras un maximo de
766 microsegundos con este retardo basico.

 para 1 segundo se necesitan 1 millon de ciclos, asi que se debe anidar este retardo a su maximo en uno mayor entonces:

   cblock  0x20
   CONT1
   CONT2
   endc


   movlw      k2
   movwf      CONT2
Bucle_2:
   movlw      k1          
   movwf      CONT1
Bucle:
   decfsz      CONT1,F
   goto         Bucle
   
   decfsz      CONT2,F
   goto         Bucle_2
   .
   .
   .
   END

asi

operaciones                          ciclos

 movlw k2                               1
 movwf CONT2                        1
 movlw  k1                             k2-1    
 movwf  CONT1                      k2-1
 decfsz   CONT1,F                   (k2-1)*(k1-1) (mientras no llegue a 0)
 decfsz   CONT1,F                   2 * (k2-1)        (al llegar a 0)
 goto      Bucle                       2 * (K2-1)*(k1-1)
 decfsz   CONT2,F                   k2-1            (mientras no llegue a 0)
 decfsz   CONT2,F                   2                   (al llegar a 0)
 goto      Bucle_2                    2* (k2-1)


TOTAL                                  4 + ((k2-1)*(4 + 3k1))  ciclos

si reemplazamos k1 =255 y k2 =255 tenemos  un total de 195330 microsegundos, aproximadamente 0.2 segundos, sera necesario hacer un 3 bucle.

Bien, siguiendo este ejemplo yo creo que ya podras acabar 3 el bucle tu mismo para completar el de 1, 2 o tantos segundos como quieras.


por otro lado cabe aclarar que el "perro guardian" se usa como medida de seguridad, ya que por X o Y circunstancia el programa de nuestro PIC puede dejar de operar (por ejemplo entrar en un bucle infinito), esto seria catastrofico en un sistema de control. al usar el perro guardian se le configura un tiempo de acción, despues del tiempo programado, el "Perro guardian" realiza un "Reset" del programa. para evitar que el perro guardian reinicie nuestro programa a cada instante,  hay que "patearlo" (kick the dog) es decir colocar en segmentos del codigo la funcion "clrwdt" para que se ejecute y no permita que el contador del perro guardian alcance el limite.

espero que esto te sea de alguna ayuda.

50
Microcontroladores / Re: Como Realizar Esta Ecu. 1/x
« en: Lunes 9 de Agosto de 2004, 23:03 »
puedes utilizar las "math Routines" de la pagina de microchip y copiar el codigo para realizar una division de un numero de 24 bits con uno de 16 bits (sin signo).

pero tendrias que convertir el numero de 3 bytes (200) a una palabra de 2 bytes almacenando el dato en hexadecimal. ej:

200 (3 bytes) -> 0x00C8 (HEX 2bytes)

generalmente el dato del periodo (T) se obtiene de  algún contador (TMR0 u otro), para obtener el dato de la frecuencia, estos contadores son de 8 o 16 bits, lo que permite hacer el calculo de la frecuencia con la formula:

F = 1/T

siendo T  es un valor entero  que varia entre 0 y 65535 (0xFFFF) donde cada unidad representa microsegundos (asumiendo un XTAL de 4Mhz y un preescaler  1:1) se puede "convertir" el calculo de frecuencia f=1/T de la siguiente forma:

F = 1/ (1e-6 Seg)* TMR0   es lo mismo que decir
F = 10 /(1e-5 Seg) *TMR0 y es lo mismo que decir
F = 1000000/TMR0

con los valores de ejemplo:

5000 = 1/(0.0002 Seg)  = 1000000 / 200uS

como 1 millon necesita al menos 20 bits para representarlo (0xF4240) se puede elegir alguna rutina de division de las "Math Routines" para colocar el numerador = 0xF4240 y el denominador = T (en microsegundos).

F= 0xF4240 / (T en uS)

Este metodo lo utilicé en un contador de Rpms y funciona bastante bien, yo elegi la rutina de division de 24bit/16bit sin signo, pero se puede elegir otra de acuerdo al mismo principio.

Páginas: 1 [2]