|
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
26
« 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
« 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
« 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
« 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
« 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
« en: Jueves 21 de Octubre de 2004, 23:07 »
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 . 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: title "Ejemplo ISR" list P=16F877 #include "P16F877.inc" UDATA_SHR irq_w res d'1' irq_status res d'1' RESET_VEC CODE 0x0000 pagesel INICIO goto INICIO ;hasta aqui 3 instrucciones nop INT_VEC bcf INTCON,GIE ;vector de interrupcion 0x0004 y fin de ;seccion (vectors) ISR code 0x0005 ;colocar el ISR inmediatamente despues ISR: btfsc INTCON,GIE ;paranoia goto INT_VEC ;o goto $-2 movwf irq_w swapf irq_w,F movfw STATUS movwf irq_status ;cambio de contexto btfsc INTCON,(mi interrupcion);[PIR1,(mi interrupcion)]probar aqui ;el tipo de interrupcion goto ATENDER ;atiende la interrupcion goto END_ISR ;sale del ISR ATENDER ;el codigo necesario END_ISR movfw irq_status ;vuelve al contexto anterior movwf STATUS swapf irq_w,W retfie ;esta instruccion coloca el GIE en ON INICIO goto $ ;mi codigo END
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: ;ejemplo con 16F877.lkr ; codigo original CODEPAGE NAME=vectors START=0x0 END=0x4 PROTECTED CODEPAGE NAME=page0 START=0x5 END=0x7FF ; codigo modificado CODEPAGE NAME=vectors START=0x0 END=0x6 PROTECTED CODEPAGE NAME=page0 START=0x7 END=0x7FF
con esto obtienes 2 palabras adicionales en la seccion STARTUP para ubicar pagesel ISR y goto ISR. RESET_VEC CODE 0x0000 pagesel MAIN goto MAIN ;hasta aqui 3 instrucciones nop INT_VEC code 0x0004 pagesel ISR ;aqui 0x0004 (vect Interrupt) y 0x0005 goto ISR ;0x0006 final de Vectors ISR CODE ;donde sea... o asignado por el linker ISR: ; Aqui mi ISR
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
« 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
« en: Domingo 17 de Octubre de 2004, 07:31 »
erratas: btfsc INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui ;el tipo de interrupcion goto ATENDER ;si el bit esta en set atiende goto END_ISR ;si es clear sale de la rutina (aunque si es asi ;alguna interrupcion no prevista se ejecuto)
Creo que asi es mas claro Saludos Oldkami
34
« 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: UDATA_SHR irq_w res d'1' irq_status res d'1' RESET_VEC CODE 0x0000 pagesel INICIO goto INICIO INT_VEC code 0x0004 pagesel ISR goto ISR ISR: bcf INTCON,GIE btfsc INTCON,GIE ;paranoia movwf irq_w swapf irq_w,F movfw STATUS movwf irq_status ;cambio de contexto btfss INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui ;el tipo de interrupcion goto ATENDER ATENDER ;el codigo necesario END_ISR movfw irq_status ;vuelve al contexto anterior movwf STATUS swapf irq_w,W retfie ;esta instruccion coloca el GIE en ON INICIO ;mi codigo END
Saludos Oldkami
35
« 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.. wisp628si 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
« 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
« 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: banksel OPTION_REG movlw X ; Asignas el preescaler, (revisa el valor adecuado en movwf OPTION_REG ; el pdf del PIC) banksel TMR0 movlw d'255'-d'100' ; inicializamos con el valor de desborde que es 255 y le ; restamos el valor que queremos contar movwf TMR0 ; a partir de aqui contamos con 2 ciclos bcf INTCON,T0IF ; borramos la bandera ya que no sabemos si ya ; se desbordo el timer nop ; desde aqui comienza a contar ¡¡ btfss INTCON,T0IF; evaluamos si el timer ya realizo su labor. goto $-1 ;esperar... CODIGO_QUE_SIGUE ; ya acabo de contar, y continua el programa.
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
« 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. ;transmite serialmente a 9600bps con un xtal de 4MHz ;se deben definir las siguientes variables: ; RXport ; RXtris ; TXport ; TXtris ; RS_TEMP1 ; RS_TEMP2 ; RXD ; TXD ; RB0, ES LA SEÑAL DE RX #define RXport PORTB,0 #define RXtris TRISB,0 #define TXport PORTB,1 #define TXtris TRISB,1 CONSTANT LF = d'10' CONSTANT CR = d'13' CONSTANT TAB = d'9' CONSTANT BS = d'8' UDATA_SHR RS_TEMP1 RES 1 RS_TEMP2 RES 1 RXD RES 1 TXD RES 1 ;MACROS RS232init macro call RS_init endm SEND macro S_String movlw S_String call SENDsub endm SENDw macro call SENDsub endm RECEIVE macro call RECsub endm ;subrutinas ;RS_init inicializa RS_init bsf TXport banksel OPTION_REG clrf OPTION_REG bcf TXtris bsf RXtris banksel TXport bsf TXport ;movlw INTCON RETURN ;RECsub recibe el dato serial RECsub call RS_Wait btfsc RXport ; goto REENTRY ; movlw 0x08 movwf RS_TEMP1 goto RECa RECa call R_Wait btfss RXport goto RECb bsf RXD,0x07 goto RECc RECb bcf RXD,0x07 RECc decfsz RS_TEMP1,0 rrf RXD,1 decfsz RS_TEMP1,1 goto RECa call R_Wait btfss RXport clrf RXD retlw 0x01 ;REENTRY limpia RXD en caso de malentendido REENTRY clrf RXD movlw 0x0F movwf RXD retlw 0x01 ;SENDsub transmite un dato almacenado en W SENDsub movwf TXD bcf TXport movlw 0x08 movwf RS_TEMP1 call S_Wait SENDa btfsc TXD,0 goto SENDb bcf TXport goto SENDc SENDb bsf TXport SENDc rrf TXD,1 call S_Wait decfsz RS_TEMP1,1 goto SENDa goto SENDd SENDd bsf TXport call S_Wait call S_Wait bsf TXport RETURN ;rutinas de espera: deben ser cambiadas segun el xtal usado ;y la tasa de baudios. S_Wait movlw 0x1E movwf RS_TEMP2 goto X_Wait RS_Wait movlw 0x0C movwf RS_TEMP2 goto X_Wait R_Wait movlw 0x1D movwf RS_TEMP2 goto X_Wait X_Wait decfsz RS_TEMP2,1 goto X_Wait RETURN
Saludos Oldkami
40
« 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.htmEs 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
« 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
« 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
« en: Lunes 6 de Septiembre de 2004, 23:22 »
44
« 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" ;{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ ; Función TABLA_DE_RUTINAS ; Metodo de llamado ; movlw NumMiRutina ; movwf TablaOffset ; pagesel TABLA_DE_RUTINAS ; call TABLA_DE_RUTINAS ; Descripción; Ejecuta una rutina segun una tabla ; Detalle: Se utiliza una tabla para realizar un llamado a rutina. ; estas rutinas deben terminar en Return para la correcta ; Ejecución. ; Salida: goto miRutina. ;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} TABLA_DE_RUTINAS: movlw HIGH T_RUTINAS movwf PCLATH banksel TablaOffset movlw LOW T_RUTINAS addwf TablaOffset,W btfsc STATUS,C ;se cruzo la pagina? incf PCLATH,F movwf PCL T_RUTINAS goto CMD_A goto CMD_B goto CMD_C goto CMD_D goto CMD_E goto CMD_F CMD_A ;...Codigo de A Return CMD_B ;Codigo de B Return etc...
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
« 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
« en: Miércoles 25 de Agosto de 2004, 17:43 »
en que exactamente necesitas ayuda?
47
« 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
« 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
« 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
« 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.
|
|
|