|
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 - jgpeiro
1
« en: Jueves 10 de Noviembre de 2005, 02:25 »
Aqui os dejo un programa que valida y muestra en una pantalla el numero primo entre 0 y 2^32.
;1-Inicio Div=3, Dis=2. ;divsqrt=SQUARE_ROOT(DIV) ;2-Ejecutar Div/Dis. ;3-¿Res==0? ; 3Si-Div NO es primo, Div=Div+2, Dis=2, ld=0, Ir a calcsqrt. ; 3No-¿Dis>DivSqrt? ; 3NoSi-Div SI es primo, Tabla[sv]=Div ,sv++ ,ld=0 ,Div=Div+2, Dis=2, Ir a calcsqrt. ; 3NoNo-Dis=Tabla[ld], ld++ Ir a 2. ;sv apunta en la Tabla a la direccion que hay que salvar. ;Cuando se detecta un numero primo de mas de 14 bits ya no se almacenan mas, ni se incrementa sv. ;ld apunta en la Tabla a la direccion que hay que cargar. ;Cuando ld supera el valor de sv (dis>16384) no carga mas primos de la tabla e incrementa Dis de dos en dos.
Si alguien lo quiere tb puedo poner el include necesario xa enviar datos al LCD y los archivos para el Proteus ISIS.
2
« en: Jueves 22 de Septiembre de 2005, 12:44 »
mmmm, yo me inicien en el mundo de los microccontroladores con la serie 68hc11 de motorola, conoci los 68hc12, 68k y mpc555...pero me pase a los microchip porque habia mucha mas gente q los usaba y podia darme informacion, proporcionarme codigo, esquemas, programadores, software...ahora trabajo con los dsPIC son bastante mas potentes y programco cn C++. Ten en cuenta tambien las herramientas de desarrollo, ademas ATMEL creo q tambien tiene micros q valen la pena. En fin, no puedo responder exactamente a tu pregunta , habira q hacer un test con un programa concreto y hacerlo rular en los distintos micros, pero....eso no debe de ser tan facil....bueno, a lo mejor lo de las herramientas de desarrollo t ayuda a decidirte.Ah, no se si al final seran mas potentes o no, pero la serie de microcontroladores de 8 bits de atmel tienen 130 intrucciones, mientras q los pic16 tienen 34...
3
« en: Jueves 18 de Agosto de 2005, 16:37 »
Por cierto, se puede hacer un programa que mida el numero de veces que permite ser grabada la FLASH de un PIC....
Haces que borre y escriba en la direccion que quieras el dato 0xAA y una vez escrito lo lees y compruebas si el dato es correcto. Si lo es borras ,incrementas un contador de 32bits y escribes 0x55. Compruebas, borras, incrementas el contador...asi hasta que la el dato no se grabe correctamente.
No es algo util, xq con saber que esta entre 10000 y 100000 sobra xa lo que kiero, pero weno, es una manera de hacerlo....
Por cierto, sigue sin gustarme el tener que hacer que cada rutina ocupe un tamaño maximo de 4Kintrucciones, es que yo estoy empezando a programar los dsPIC en C++, y con nada de programa ya ocupo todo eso. Lo que puedo hacer es que el micro tenga restringidas el numero de veces que puede reescribir el buffer para las rutinas a 30 veces al dia. , Tambien obligar al micro a que, despues de escribir una rutina en su flash, la campare con la de la memoria esterna e indique si hay errores... Por cierto, ahi va el PCB, cree los esquemas con el PROTEL DxP y pcb tb, aunke no conseguia routearlo adecuadamente. Despues utilice el router de PADS, un programa de mentor graphics, y lo hizo todo el solito, recomiendo que todos los usuarios de protel le echen un vistazo.
4
« en: Jueves 18 de Agosto de 2005, 00:02 »
10,000 erase/write cycle (min.) for industrial temperature range, 100K (typical)
Eso me obliga a plantearmelo todo de una manera un poco distinta, ya no me puedo permitir que el micro este renovando sus rutinas constantemente...Quizas reserve una parte de 4Kinstructions o algo asi para rutinas almacenadaas en la EEPROM. De esta manera el tamaño tendria que ser siempre de un maximo de 4, pero no tengo que partirlas ni por supuesto puedo permitir que una ISR(rutina de servicio a la interrupcion) cambia la rutina, pero me ahorro tb la pila stack... Bueno, gracias por el dato, era algo bastante importante.
Lo que yo kiero hacer es un aparato al que luego todo el mundo pueda introducirle sus propias aplicaciones, por eso lo de la EEPROM externa con mas memoria. Yo hago el programa principal con un pequeño menu y un par de aplicaciones de ejemplo, y luego ya cada uno que kiera que le de el uso qeu desee.
El aparato es un circuito de 36x48mm con dsPIC30F4013, una RAM-FLASH (AT45DB321C)de 32Mb, un conector de TRANSFLASH o miniSD, un sensor de acceleracion de 3 ejes, un LCD de nokia a color, 3 leds, un boton, un microfono, un conversor DAC para audio y un coenctor mini-jack.
Me gustaria hacerle un programa principal que permita ver que aplicaciones tiene(una agenda, un reloj, un grabador de voz, juegos...) y q luego permita que cada uno pueda hacer la aplicacion que kiera (grabandola en la RAM-FLASH).
Si solo cada vez que el usuario accede a una nueva aplicacion, esta se graba en la flash, esto puede dar una vida de...¿tres años?(cambiando treinta veces al dia de aplicacion)
5
« en: Miércoles 17 de Agosto de 2005, 21:46 »
Pues eso, estoy diseñando un circuito con un PIC conectado a una EEPROM.
Mi intencion es almacenar el programa principal (configuraciones, ISR...)en la flash del PIC y las rutinas en la EEPROM y que el PIC las copie a su flash ,cuando el programa principal las solicite, para ejecutarlas.
-¿que soluciones hay para esto? parece facil pensar que simplemente compilo la rutina como si empezase en la linea del programa 800(x ejemplo)y cada vez que se necesita se carga en la flash y ya ta. -¿Pero que ocurre si esta rutina ocupa mas de lo que cabe en el PIC? podria hacer que el propio PIC la partiese en cachos y se fuese copiando y ejecutando los cachos? -¿Que ocurre si durante la ejecucion de un cacho de rutina, este llama a un cacho de rutina que no ha sido cargado xq no cabia? -¿Que ocurre si durante la ejecucion de una rutina,se genera una interrupcion y esta misma necesita cargar de la EEPROM otra rutina distinta?
Llevo un par de dias y creo que he encontrado una solucion algo complicada y probablemente irrealizable. Estos serian los pasos a seguir: 1 Que el propio PIC parta las rutinas en cachos que quepan dentro del PIC. 2 leyendo instruccion a instruccion el cacho de rutina a cargar y modificando todos los brach, call y goto que ayan. 3 Ademas creando una PILA STACK para las rutinas que se van llamando y cargando., y que cada vez que se genera una IRQ durante la ejecucionde una rutina se guarde el "nombre" de la rutina q estaba ejecutandose.
No existen soluciones mas sencillas para esto? A mi me mosquea un poco que un PIC tenga una memoria de programa de 48Kbytes y un ProgramCounter de 24bits...
Por cierto, tengo en cuenta que el tiempo de escritura de un byte de flash (x ejemplo 2mS), pero creo que puede ser despreciable xq he pensado que en 1000 lineas de programa (2segundos en cargarse) se puede meter un programa que tarde mucho mas en ejecutarse.
En unos dias are un dibujo de como pienso que se podria solucionar.
6
« en: Sábado 16 de Julio de 2005, 14:24 »
///EL GATO EN EL SOMBRERO////////////////////////////////////////////// float gatosA, gatosL, gatosNA , gatosS, gatosNGAct, gatosAct, gatosAi, gatosAT ,gatosnT; // gatosA=0 Altura de nuestro gato // gatosL=0 Gatos que limpian(altura 1)
//gatos por sombrero // gatosNA=0 Numero de Alturas de gatos // gatosS=0 Gatos por sombrero en funcion de un numero de alturas.
//gatos Altura // gatosNGAct=0 Es el numero de gatos que hay con una altura // gatosAct=0 Es el numero de Altura de gatosa en el que estamos // gatosAi=0 Incremento // gatosAT=0 Altura total de los gatos
//gatos NO trabajan //gatosnT=0 Numero total de gatos(lo gatos que limipan no se suman
gatosA=64; //Declaracion de la Altura de nuestro gato. gatosL=27; //Declaracion del Numero de gatos que limpian. //Gatos numero alturas for (gatosNA=1 ; gatosA!=pow(gatosS+1,gatosNA-1) ; gatosNA++)//Calculamos UN numero de alturas y validamos alturas y sombreros. {//gatos por sombrero gatosS=pow(gatosL,1/(gatosNA));//Calculamos UN numero de gatos por sombrero en funcion de las alturas que tenemos }
for ( gatosAi=1, gatosAct=gatosA ,gatosAT=gatosA+gatosL , gatosnT=1; gatosNA>gatosAi+1 ; gatosAi++ ) {//gatos Altura gatosAct=gatosAct/(gatosS+1);//Calculamos la altura de los gatos gatosNGAct=gatosL/pow(gatosS,gatosNA-gatosAi-1);//Calculamos el numero de gatos que hay en esa altura gatosAT=gatosAT+(gatosAct*gatosNGAct);//multiplicamos la altura de los gatos por el numero de gatos, y lo acumulamos //gatos NO trabajan gatosnT=gatosnT+gatosNGAct;//calculamos el numero de gatos que no trabajn en la altura y acumulamos } gatosnT=gatosnT; //Devuelve el numero de gatos que no trabajan. gatosAT=gatosAT; //Devuelve la suma de las alturas de todos los gatos.
float FIN_GATO=0; } //1 //1885 //17 //1 //3 //1 //31 //13 // //Devuelve el numero de gatos que no trabajan. //25 //122461 //817 //5 //2 //9 //671 //175 // //Devuelve la suma de las alturas de todos los gatos.
//13 //28561 //289 //3 //5 //9 //216 //64 //Declaracion de la Altura de nuestro gato. //12 //20736 //256 //2 //4 //4 //125 //27 //Declaracion del Numero de gatos que limpian.
//FIN de gato sombrero
7
« en: Martes 12 de Julio de 2005, 23:49 »
///EL GATO EN EL SOMBRERO////////////////////////////////////////////// float gatosA=0, gatosL=0,gatosNAi=0 , gatosS=0, gatosSi=0, gatosNGAct=0, gatosAct=0, gatosAi=0, gatosAT=0 ,gatosnT=0; // gatosA=0 Altura de nuestro gato // gatosL=0 Gatos que limpian(altura 1)
//gatos por sombrero // gatosNA=0 Numero de Alturas de gatos // gatosNAi=0 Incremento // gatosS=0 Gatos por sombrero , o mejor dicho posibles sombreros // gatosSi=0 Incremento
//gatos Altura // gatosNGAct=0 Es el numero de gatos que hay con una altura // gatosAct=0 Es el numero de Altura de gatosa en el que estamos // gatosAi=0 Incremento // gatosAT=0 Altura total de los gatos
//gatos NO trabajan //gatosnT=0 Numero total de gatos(lo gatos que limipan no se suman
gatosA=64;//13//28561//289//3//5//9//216//64 //Declaracion de la Altura de nuestro gato. gatosL=27;//12//20736//256//2//4//4//125//27 //Declaracion del Numero de gatos que limpian.
//Gatos numero alturas for (gatosNAi=0 ; gatosA!=pow(gatosSi+1,gatosNAi) ; gatosNAi++) {//Calculamos UN numero de alturas por sombrero y validamos alturas y sombreros. //gatos por sombrero for (gatosSi=1 ,gatosS=1 ; gatosL>pow(gatosSi,gatosNAi+1) ; gatosSi++, gatosS++) {//Calculamos UN numero de gatos por sombrero } } //gatos Altura//gatos NO trabajan for ( gatosAi=1, gatosAct=gatosA ,gatosAT=gatosA , gatosnT=0; gatosNAi>=gatosAi ; gatosAi++ ) { gatosAct=gatosAct/(gatosSi+1);//Calculamos la altura de los gatos gatosNGAct=gatosL/pow(gatosSi,gatosNAi-gatosAi);//Calculamos el numero de gatos que hay en esa altura gatosAT=gatosAT+(gatosAct*gatosNGAct);//multiplicamos la altura de los gatos por el numero de gatos, y lo acumulamos gatosnT=gatosnT+gatosNGAct;//calculamos el numero de gatos que no trabajn en la altura y acumulamos }
gatosnT=gatosnT;//1//1885//17//1//3//1//3 //31 //13 //Devuelve el numero de gatos que no trabajan. gatosAT=gatosAT;//25//122461//817//5//2//9//19//671//175 //Devuelve la suma de las alturas de todos los gatos.
float FIN_GATO=0; } //1 //1885 //272 //1 //3 //1 //3 //31 //13 //Devuelve el numero de gatos que no trabajan. //25 //122461 //817 //5 //2 //9 //19 //671 //175 //Devuelve la suma de las alturas de todos los gatos.
//13 //28561 //289 //3 //5 //9 //216 //64 //Declaracion de la Altura de nuestro gato. //12 //20736 //256 //2 //4 //4 //125 //27 //Declaracion del Numero de gatos que limpian.
//FIN de gato sombrero
8
« en: Martes 12 de Julio de 2005, 02:54 »
Solo so ocupa de realizar los calculos, no se permite introducir ni extraer datos en el archivo ejecutable, ni sikiera esta listo para ejecutar, pero se puede insertar en cualquier codigo fuente con cortar y pegar y se pueden variar los valores de entrada antes de compilar... Lo realiza con un compilador para microchips, asi que no se si sera compatible con los compiladores mas utilizados para c++... bueno, ahi va: Ley ayer el problema del gato, y no e mirado por supuesto ninguna solucion en mensajes anteriores(salvo el dibujo con los gatos de junk) y e tardado unas horas en resolverlo....he comprobado con unos cuantos codigos y me funciona...
///EL GATO EN EL SOMBRERO////////////////////////////////////////////// float gatosA=0, gatosL=0; // gatosA=0 Altura de nuestro gato // gatosL=0 Gatos que limpian(altura 1) gatosA=9;//3//5//9//216//64 //Declaracion de la Altura de nuestro gato. gatosL=4;//2//4//4//125//27 //Declaracion del Numero de gatos que limpian
//gatos por sombrero float gatosNA=0, gatosNAi=0 , gatosS=0, gatosSi=0; // gatosNA=0 Numero de Alturas de gatos // gatosNAi=0 Incremento // gatosS=0 Gatos por sombrero , o mejor dicho posibles sombreros // gatosSi=0 Incremento //gatos Altura float gatosAct=0, gatosActT=0, gatosAi=0, gatosAnt=0, gatosAT=0;//Altura total de los gatos // gatosAct=0 Es el numero de Altura de gatosa en el que estamos // gatosActT=0 El la suma de las alturas de todos los gatos de el numero de altura en el que estamos // gatosAi=0 Incremento // gatosAnt=0 Altura del gato anterior // gatosAT=0 Altura total de los gatos
////Comprobar si Concuerda con la altura de nuestro gato gatosNA=0; gatosNAi=0;//gatosNA no es usada for (gatosNA=0 ; 1!=gatosAct ; gatosNAi++) { //gatos por sombrero gatosS=0; gatosSi=0; for (gatosSi=0 ; gatosL>gatosS ; gatosSi++) { gatosS=pow(gatosSi+1,gatosNAi+1); } //gatos Altura gatosAct=0; gatosActT=0; gatosAi=0; gatosAnt=0; gatosAT=0; for ( gatosAi=0, gatosAct=gatosA ,gatosAT=gatosA ; gatosNAi>=gatosAi ; gatosAi++) { gatosAnt=gatosAct; gatosAct=gatosAnt*1/(gatosSi+1); gatosActT=gatosAct*(gatosS/(pow(gatosSi,gatosNAi-gatosAi))); gatosAT=gatosAT+gatosActT; } }
//gatos NO trabajan float gatosnT=0, gatosnTi=0; //gatosnT=0 Numero total de gatos //gatosnTi=0 Incremento for (gatosnTi=0 ; gatosNAi>gatosnTi ; gatosnTi++) { gatosnT=gatosnT+(gatosS/(pow(gatosSi,(gatosNAi-gatosnTi)))); } //gatosnT=gatosnT-gatosL;
gatosnT=gatosnT;//Devuelve el numero de gatos que no trabajan gatosAT=gatosAT;//Devuelve la suma de las alturas de todos los gatos
float FIN_GATO=0; } //FIN de gato sombrero
9
« en: Martes 7 de Septiembre de 2004, 20:07 »
He intalado este paquete de soft. concretamente IAR.Embedded.Workbench.for.Microchip.PIC.v2.21A.FULL-YgH que me baje con el emule para probarlo a ver que tal....a primera vista no me e aclarado para nada, parece que tambien permite crear diagramas de flujo com el niple, aunque de una manera mas complicada...no se, si alguien en este foro tiene experiencia con este soft...espero me digais vuestras impresiones...
10
« en: Jueves 26 de Agosto de 2004, 15:21 »
por cierto, en que aparatito estas utilizando el 16F88?soo curiosidad, a lo mejor t puedo ayudar con algun problema que te encuentres mas adelante....
11
« en: Jueves 26 de Agosto de 2004, 15:16 »
Yo los he utilizado en algun proyecto mio, se progranman mediante ICSP, los pnes son identicos a los de un 16F84, el hardware que tengo es un TE-20,(mas sencillo que el tuyo creo) y el software que encontre tras unos dias de buscar se llama winpic, que se puede bajar de esta aqui http://www.qsl.net/dl4yhf/winpic/winpicpr.zip y aqui hay info del programa http://www.qsl.net/dl4yhf/winpicpr.html . Supongo que tendras el datasheet del 16F88....si no, t recomiendo enormemente que t lo bajes de www.microchip.com ...
12
« en: Viernes 23 de Julio de 2004, 14:48 »
Pues eso, me estoy planteando las ventajas de utilizar un sistema operativo para mi TDB, peor no se las ventajas que tienen ni como funcionan exactamente ni los requisitos de hardware ni apenas nada de nada. Me gustaria que fuese un linux o algo asi , con el que luego poder utilizar aplicaciones bajadas de la red, o juegos para mobiles o yo q se...bueno, si alguien tiene experiencia en la utilizacion de sistemas operativos en tiempo real con micros y me puede dar alguna info o consejo le estare my agradecido.
13
« en: Sábado 26 de Junio de 2004, 18:40 »
por si alguien esta interesado en realizar este aparato conmigo aqui dejo los archivos con el codigo y demas para simularlo con el MPLAB v6.51. tb voy a colgar un esquema y si alguien quiere puedo meter tambien los PCBs.
14
« en: Lunes 14 de Junio de 2004, 12:56 »
aqui va el esquema del programa que e escrito en ASM, por cierto, son unas 380 instrucciones....
15
« en: Lunes 14 de Junio de 2004, 00:16 »
Por fin termine 3 de las 4 rutinas para controlar el hardware, con sus interrupciones y su codigo optimizado para permitir ocupar el tiempo minimo al micro. Segun unos calclos aproximados el micro permanece libre aproximadamente un 90% del tiempo, es decir, la mayor parte del tiempo esta esperando a que se desborde un timmer o a q le devuelvan un dato del exterior. El micro se arranca y configura los registros de todos los perifericos, busca la procendencia de las interupciones, salva y carga los registros mas importantes durante las interrupciones, lee datos analogicos de un ADXL 311 cada periodo de 3mS y toma el valormedio de cada 16 medidas. Comprueba e estado de la bateria cada 3mS. Envia datos a un LCD LPH7366 utilizando el periferico SSP y sus interrupciones, informa al usuario mediante 2 LEDs(rojo y verde) que tb van con IRQ...bueno, si alguien quiere el codigo en ASM que me lo pida, tb realice algunso cambios en el esquema, pero no son importantes. De mometo pienso eliminar el 74LVC07, el regulador de 5V y alimentar todo el circuito a 3.3V o 3.0V, pero no es nada demasiado importante.... Me queda realizar una rutina para leer y escribir en las EEPROM. Primero voy a hacer un diagrama de flujo del codigo que e escrito....en unos dias lo pondre.
16
« en: Jueves 10 de Junio de 2004, 16:08 »
ok, todo solucionado, una vez mas los programas y los datasheets demuestran no tener erratas y ser yo quien se equivoca. Cuando escribimos con el MPLAB la intruccion MOVWF o MOVFW parece que son dos variantes de la misma instruccion y que ninguna de las dos afecta al bit Z. La instruccion MOVFW, es transformada por el MPLAB en MOVF, y por eso el codigo funciona perfectamente salvo esta pequña variacion. En fin, tendre que hacer algun apaño en mi codigo.
17
« en: Jueves 10 de Junio de 2004, 13:22 »
pues resulta que cuando ejecuto una instruccion de MOVFW y el valor del regitstro W es 0, se pone a 1 el bit Z del status, cuando en el datasheet de PIC pone clarisimamente que estas instyrucciones no afectan a los bits de estado. Que ocurre aqui? es un fallo del MPLAB? alguien sabe si es q estoy coemtiendo algun error?
18
« en: Domingo 30 de Mayo de 2004, 14:29 »
mmm, el SSPSR es un registro interno no accesible directamente para el usuario de los PICs que incorporan el modulo SSP. Se supone que el MPLAB permite ver el estado de este registro en la ventana de SPRs(eso dice en el help), pero no o veo. alguien sabe dnd puedo encontrasr este registro?
19
« en: Miércoles 26 de Mayo de 2004, 17:27 »
no veo necesario convertirla a una señal digital. Probablemente sea mucho mas sencillo transmitir la señal de video compuesto en AM. No necesitaras muchos integrados, pero si muhcos discretos. de todas formas existen muchos circuitos de este tipo y supongo que en internet podras encontrar esquemas y demas que te sirvan como ejemplo. El TFT puede interpretar la señal de video compuesto?
20
« en: Martes 18 de Mayo de 2004, 17:24 »
#include <p16f88.inc>
ledRreg equ 021H ledGreg equ 022H ledcount equ 023H chanelreg equ 024H ADchanel2outC equ 025H ADchanel3outC equ 026H ADchanel4outC equ 027H ;050H-05FH,0D0H-0DFH Accx Buffer ;060H-06FH,0E0H-0EFH Accy Buffer
init nop nop nop nop ;BuscarFlAG, ejecutar subrutina, retfie. btfsc INTCON,TMR0IF goto TMR0overflow btfsc PIR1,SSPIF goto SSPcompleteTR btfsc PIR1,TMR2IF goto TMR2toPR2match btfsc PIR1,TMR1IF goto TMR1overflow btfsc PIR2,EEIF goto EEPROMwritecompleted ;Internal EEPROM
CONFIGDEV ;CONFIG DEVICE(I/O PORTS, A/D, clock, SPI, IRQs,TIMERs, WDT) ;OSCILLATOR CONFIGURATIONS INTO2 8MHZ,whit I/O on RA6,RA7 bsf STATUS,RP0 movwf B'00000000' movwf OSCTUNE movlw B'01110010' movwf OSCCON bcf STATUS,RP0 ;INTERRUPTS TMR0,TMR1,TMR2,SSP bsf STATUS,RP0 movlw B'10000010' movwf OPTION_REG bsf STATUS,RP0 movlw B'11100000' movwf INTCON movlw B'00000000' movwf PIR1 movlw B'00000000' movwf PIR2 bsf STATUS,RP0 movlw B'00001001' movwf PIE1 movlw B'00010000' movwf PIE2 bcf STATUS,RP0 ;I/O PORTS ;PORTA movlw B'00000000' movwf PORTA bsf STATUS,RP0 movlw B'01011100' movwf TRISA bcf STATUS,RP0 ;PORTB movlw B'00000000' movwf PORTB ;PORTB7-0 outputs bsf STATUS,RP0 movlw B'00100010' movwf TRISB bcf STATUS,RP0 ;SSP configurado en modo SPI Master movlw B'00000000' movwf SSPBUF ;b7-0 movlw B'00100000' movwf SSPCON ;b7-0 bsf STATUS,RP0 movlw B'11000000' movwf SSPSTAT ;b7-6,1 bcf STATUS,RP0 ;A/D movlw B'00000000' movwf ADRESH ;b7-0 movlw B'01000001' movwf ADCON0 ;b7-2,0 bsf STATUS,RP0 movlw B'0' movwf ADRESL ;b7-0 movlw B'11000000' movwf ADCON1 ;b7-4 movlw B'00011100' movwf ANSEL ;b6-0 bcf STATUS,RP0
;TIMER0 MODULE movlw B'00000000' movwf TMR0 ;TIMER1 MODULE ;TMR1L ;TMR1H ;T1CON ;TIMER2 MODULE ;TMR2 ;T2CON ;PR2 ;DATA EEPROM ;WDT bsf STATUS,RP0 movlw B'00011110' movwf WDTCON bcf STATUS,RP0
;CCP MODULE OFF ;USART OFF ;COMPARATOR MODULE OFF ;COMPARATOR VOLTAGE REFERENCE MODULE OFF
CONFIGREGS movlw 050H movwf ADchanel2outC movlw 060H movwf ADchanel3outC movlw B'00000100' movwf chanelreg movlw B'10101010' movwf SSPBUF movlw B'00100000' movwf SSPCON
ledlevel ;como cambiar LedXreg desde cada subrutina? movlw B'10101010' movwf ledRreg movlw B'10000000' movwf ledGreg movlw 0B0H movwf ledcount
loop ;el programa inicial despues de un ReSET un configurar el uC
nop goto loop nop
TMR0overflow ;(interrupt); bcf INTCON,TMR0IF ADnoend btfsc ADCON0,GO_DONE ;esperar en caso de q el AD no haya terminado goto ADnoend btfsc chanelreg,2 ;comprobar que canal se ha leido goto ADchanel2out btfsc chanelreg,3 goto ADchanel3out btfsc chanelreg,4 goto ADchanel4out
ADchanel2out bcf STATUS,RP0 movfw ADchanel2outC ;guardar los datos de la conversion en un buffer mediante indf movwf FSR movfw ADRESH movwf INDF bsf STATUS,RP0 bsf FSR,7 movfw ADRESL movwf INDF bcf FSR,7 bcf STATUS,RP0 incf ADchanel2outC,f movfw ADchanel2outC sublw 060H btfss STATUS,Z goto ADchanelselect movlw 050H movwf ADchanel2outC ;indicar que el buffer Accx(050H-05FH,0D0H-0DFH)esta completo.El buffer Accy aun le queda un dato por almacenar goto ADchanelselect
ADchanel3out bcf STATUS,RP0 movfw ADchanel3outC ;guardar los datos de la conversion en un buffer mediante indf movwf FSR movfw ADRESH movwf INDF bsf STATUS,RP0 bsf FSR,7 movfw ADRESL movwf INDF bcf FSR,7 bcf STATUS,RP0 incf ADchanel3outC,f movfw ADchanel3outC sublw 070H btfss STATUS,Z goto ADchanelselect movlw 060H movwf ADchanel3outC ;indicar que el buffer Accy(060H-06FH,0E0H-0EFH)esta completo. Los buffers Accx y Accy estan llenos ;desactivar interrupciones por AD? goto ADchanelselect
ADchanel4out ;solo comprobar que las tensiones son adecuadas comparandolo con una referencia goto ADchanelselect ADchanelselect ;change chanel to read in next AD obtain(2,3,4) bcf STATUS,C rlf chanelreg,f btfsc STATUS,C bsf chanelreg,0
btfsc chanelreg,2 goto chanel2 ;el AccX btfsc chanelreg,3 goto chanel3 ;el AccY btfsc chanelreg,4 goto chanel4 ;el Vbat movlw B'00000100' movwf chanelreg goto chanel2 ;;; xq es el proximo que se debe leer!!! chanel2 movlw B'00010000' ;seleccionar canal 2 (010) iorwf ADCON0,f movlw B'11010111' ;seleccionar canal 2 (010) andwf ADCON0,f goto ADstart chanel3 movlw B'00011000' ;seleccionar canal 3 (011) iorwf ADCON0,f movlw B'11011111' ;seleccionar canal 3 (011) andwf ADCON0,f goto ADstart chanel4 movlw B'00100000' ;seleccionar canal 4 (100) iorwf ADCON0,f movlw B'11100111' ;seleccionar canal 4 (100) andwf ADCON0,f goto ADstart
ADstart bsf ADCON0,GO_DONE goto rotateLEDs rotateLEDs incfsz ledcount,f ;esperar varias IRQ por TMR0 para rotar los LEDs retfie rrf ledGreg,f ;rotar y mostar LEDGREEN btfsc STATUS,C bsf ledGreg,7 bcf STATUS,C btfss ledGreg,0 bsf PORTB,6 btfsc ledGreg,0 bcf PORTB,6 rrf ledRreg,f ;rotar y mostar LEDRED btfsc STATUS,C bsf ledRreg,7 bcf STATUS,C btfss ledRreg,0 bsf PORTB,7 btfsc ledRreg,0 bcf PORTB,7 movlw 0B0H movwf ledcount retfie ;FIN DE LA INTERRUPCION ;Datos AD obtenidos y guardados en buffer, LEDs rotados.
SSPcompleteTR bcf PIR1,SSPIF ; subrutine retfie TMR2toPR2match bcf PIR1,TMR2IF ; subrutine retfie TMR1overflow bcf PIR1,TMR1IF ; subrutine retfie EEPROMwritecompleted bcf PIR2,EEIF ; subrutine retfie
END
21
« en: Martes 18 de Mayo de 2004, 14:17 »
estoy simulando un 16F88 con el MPLAB, y no se como hacer que el modulo SSP en modo SPI funcione. Alguien tiene experiencia con este modulo? alguien tiene algun .asm en el que se utilice este modulo?
22
« en: Miércoles 28 de Abril de 2004, 21:43 »
lo que debe suceder es que exista una diferencia de potencial entre la masa del PC y la masa del circuito que proporciona señal de muestra.
Teniendo los 3 circuitos por separado y midiendo con el polimetro entre la masa del PIC y del PC no debe haber diferencia de potencial(creo), pero si debe haber una diferencia de potencial entre la masa del PC y la masa del circuito que proporciona señal de muestra.
El PIC lleva una alimentacion aislada de la red mediante un transformador, lo cual permite que sepueda conectar al PC o a la circuito que proporciona señal de muestra. Pero el circuito que proporciona la señal de muestra no esta aislado de la red, y si t ocurre ese corto creo que la masa del PC tampoco estara aislada de la red(aunque las fuentes deberian aislarlo pero.....kizas la que tu tienes no....)en fin, no se si sera esta la causa del problema, pero lo mas sencillo que se me ocurre es colocar un circuito que aisle el circuito que proporciona señal de muestra del PIC como por ejempl un octocoplador(si se llama asi) que es un integrado que dentro tiene un emisor y un recptor de luz. Ahm, otra cosa, debes colocar alguna resistencia para descargar el condensador xq supongo q solo con el divisor resistivo no sera suficiente...
bueno, espero aportarte alguna idea nueva en el proximo post...ejjeje
23
« en: Viernes 16 de Abril de 2004, 14:39 »
Este codigo lo he generado en 1 minuto con el niple. Te permite escoger algunas opciones, pero yo he puesto lo mas estandar, que todos los valores de entrada y salida de la rutina esten en registor de la RAM....bueno, espero t sirva esta rutina.
;------------------------------------------------------------ ; Código assembler generado por Niple. ; Nombre del Proyecto: tdbprototipo ; Autor: Desarrollo Niple. ; Fecha: 14/04/2004 ; PIC: 16F84 ; Velocidad de reloj: 4 Mhz ; Descripcion: crear las rutinas basicas para un 16f84a para comprobar el hard. del prototipo del tdb ;------------------------------------------------------------
LIST P=PIC16F84
;------------------------------------------------------------ ; Declaración de Registros ;------------------------------------------------------------ w equ 00h status equ 0x03 porta equ 0x05 _np_temp1 equ 0x0c regalto equ 0x0d multiplicando bajo regbajo equ 0x0e multiplicando alto rmultiplicadoralto equ 0x0f multiplicador alto multiplicadorbajo equ 0x10 multiplicador bajo res3 equ 0x11 resultado res2 equ 0x12 resultado res1 equ 0x13 resultado res0 equ 0x14 resultado _np_temp2 equ 0x15 _np_temp3 equ 0x16 _np_temp4 equ 0x17 _np_temp5 equ 0x18 _np_temp6 equ 0x19 _np_temp7 equ 0x1a _np_temp8 equ 0x1b _np_temp9 equ 0x1c
;------------------------------------------------------------ ; Declaración de Bits ;------------------------------------------------------------ c equ 0 ;carry / borrow bit rp0 equ 5 ;registrer banck select bit
;------------------------------------------------------------ ; Inicio ;------------------------------------------------------------
reset org 0 goto paso2
;------------------------------------------------------------ ; programa principal ;------------------------------------------------------------ paso2 ;multiplicar a 16 bits (res0,res1,res2,res3 = regalto,regbajo * rmultiplicadoralto,multiplicadorbajo) bcf status,rp0 ;cambiar a pagina 0 movf regbajo,w movwf _np_temp2 movf regalto,w movwf _np_temp1 movf multiplicadorbajo,w movwf _np_temp2 movf rmultiplicadoralto,w movwf _np_temp1 call multiplicacion_16 movf _np_temp3,w movwf res0 movf _np_temp4,w movwf res1 movf _np_temp5,w movwf res2 movf _np_temp6,w movwf res3 "aqui el resto del programaaaaa""
;------------------------------------------------------------ ; Declaración de Subrutinas ;------------------------------------------------------------
multiplicacion_16 ;calculo matematico multiplicacion a 16 bits movlw 0x10 bcf status,rp0 ;cambiar a pagina 0 movwf _np_temp9 movf _np_temp4,w movwf _np_temp8 movf _np_temp3,w movwf _np_temp7 clrf _np_temp4 clrf _np_temp3 multiplicacion_16_1 rrf _np_temp8,f rrf _np_temp7,f btfss status,c goto multiplicacion_16_2 movf _np_temp1,w addwf _np_temp3,f btfsc status,c incf _np_temp4,f movf _np_temp2,w addwf _np_temp4,f multiplicacion_16_2 rrf _np_temp4,f rrf _np_temp3,f rrf _np_temp6,f rrf _np_temp5,f decfsz _np_temp9,1 goto multiplicacion_16_1 return
End
24
« en: Domingo 4 de Abril de 2004, 01:50 »
mmmmmmm, leyendo tu post se me ha ocurrido una idea que cn la que tal vez todos salgamos beneficiados. Desde siempre he tenido e inconveniente de ser un poco vago a la hora de llevar mis proyectos a la practica. Me gusta mucho darle al coco y desarrollarlos, pero a la hora de montar placas e ir depurando el hard. y sobretodo el soft. me da mucha pereza seguir cn cualquier proyecto y siempre inicio en otro nuevo. Se me ocurre que yo podria ir diseñando todo el proyecto a condicion de que tu vayas indicandome exactamente todas las funciones que este debe cumplir asi como montarlo y verifincar el hard. y el soft. Me dan vacaciones la semana que viene, dispondre de mas tiempo para escribir en el foro o comunicarme contigo via msn. jgpeiro@hotmail.com, (si alguien mas esta interesado en este metodo de trabajo que me agrege a su msn).
25
« en: Sábado 28 de Febrero de 2004, 10:47 »
Pues me gustaria saber que ventajas e inconvenientes tiene utilizar un sistema operativo , o un sistema operativo en tiempo real en un microcontrolador PIC.
Tambien me gustaria saber un poco como se realiza un programa para que funcione bajo ese SO, empresas que los ofrezcan(los SO) y... no se, quisiera que alguien me comentase un poco su experiencia.
|
|
|