SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: jgpeiro en Sábado 27 de Diciembre de 2003, 16:12
-
Estoy trabajando en el diseño de un aparato electrónico y me gustaría que alguien con experiencia en el diseño de pequeños aparatos electrónicos me diese su opinión.
El aparato consiste en un controlador de LCD grafico, capaz de leer los datos de una EEPROM serie ,elaborar el texto y sacarlo a través del LCD. Se controla a traves de movimientos que capta con un accelerometro de dos ejes.
El circuito consta de un LCD de un nokia 5110, un PIC 16f84, dos EEPROM serie 24fc515, y un acceñerometro ADXL210E
el controlador del LCD mide 34x40x15mm(con el display y las baterias incluidas).
Al LCD se le puede kitar una lamina de plastico superior y que solo se pueda leer mirando a través de esta.
El consumo del circuito debe ser muy muy pequeño. La grabación de los datos se realiza utilizando un acoplador y a través de un TE-20.
El circuito permanece siempre encendido,en modo bajo consumo, y pasa a modo usuario, cuando se realizan unos movimientos determinados.
Tengo que realizar las rutinas que me permitan comunicar el PIC con las EEPROM, con el LCD, e interpretar los datos del accelerometro. El problema es que me gustaria escribirlas en C, pero no su compatibilizar el PICCLITE ocn el MPLAB...
Pienso que si este circuito tuviese éxito podría venderse como un kit o algo así. No sé que más puedo decir si alguien quiere mas información puedo proporcionar todos los docuemntos que tengo. Los programas que más estoy utilizando MPLAB, el PICCLITE, el PROTEL DXP, el proteus...
-
este es un .jpg en el que e ido reflejando algunas ideas para aclararme yo. mas o menos esta indicado la forma por la que uno se mueve por los menus del aparto, o como se enciende, o el tipo e texto... en fin, espero que os agais una idea superficial.
-
Desde hace mucho tiempo tengo en mente realizar un proyecto para evitar tener que estudiar para lo examenes de la clase, segun lo que he visto de tu proyecto, se asemeje a lo que queria realizar yo. Dime... Eso sirve para almacenar mucho texto???... cuantos años tienes tu???... Bueno, podria ayudarte, pero no conosco de programar micros bajo C, siempre lo hago en Assembler, ya que el C no es algo super bueno, lo unico bueno es su facilidad. Saludos y espero tu respuesta. :hola:
-
ese es exactamente el proposito que tiene mi circuito. Son dos memorias 24FC515 y practicamente el 99% de su capacidad se elmplearia para mostrar el texto.
El primer programa que empece a desarrollar para el dispositivo fue .ASM pero llegue a la conclusion de que debia ser mucho mas sencillo elaborlo todo en C una vez se conoce suficiente el lenguaje. En un principio la velocidad por del micro nos podemos permitir ejecutar unas cuantas instrucciones de mas, y si falta espacio para el programa se puede utilizar otro PIC con mas memoria.
-Se me olvidaba...el circuito lleva dos leds (rojo y verde) que se ven a traves de la pantalla pensados para avisar o informar de algo al usuario mas que para iluminar la pantalla. Estan directamente conectados a pines del PIC. Para que podria utilizar estos leds?
-No se si el BUS I2C requiere obligatoriamente dos resistencias pull-up, tu sabes como o dnd comprobar antes de tener el crcuito realizado?
-Como aseguro los nets que van del cristal al PIC tienen las caracteristicas de inductancia, capacietancia y resistencia adecuadas, o no sufren agresiones de otros nets?
ahm, tengo 19 años y llevo metido en esto de la electronica desde que tenia 13 o eso. Siempre con la curiosidad de como funcionara este circuito pueda o no pueda realizarse por un aficionado en su casa con sus medios.
Tengo un osciloscopio BITSCOPE aunke practicamente todo lo que he echo han sido siempre simulaciones con el ordenador me permite ir mucho mas deprisa que trabajando con las manos(aunke no te da la prueba 100% de que tu circuito funcione...)
Me da la impresion de que tu tb has dedicado tiempo a esto de la electronica.
-
ahm, aqui va el .sch del circuito es un poco mas moderno que el que se ve en la foto. Por cierto jonathan, ¿que proyectos te traes actualemente entre manos?
-
Realmente interesante B) , te recomendaria realizar todas las rutinas que debas solo en lenguaje assembler, ya que la velocidad en que realizara todo sera algo super bueno... luego se podria realizar un nuevo codigo utilizando los sistemas operativos que vienen para los pic, donde puedes realizar que trabaje en modo multitarea, osea, realizaria muchas cosas a la vez, eso es algo muy interesante, pero en lo que todavia no tengo experiencia.
Los led's que dices que tiene el display, los puedes utilizar para informar al usuario sobre la posicion que se encuentra en el texto, que se encienda el verda para avizar que se esta de la mitad del texto para arriba, ambos cuando valla al medio y el rojo cuando cruce la mitad, solo para tener una nocion de donde se esta, y de paso iluminar el display.
Dime... puedes escribir sin problemas en el display del celular, o es algo muy dificil... en una epoca se me habia cruzado en mente destripar mi Nokia 5160i tan solo para ver si lograba escrbir sobre el LCD, pero luego me dio miedo no volver a recuperarlo, tu sabes, aqui es dificil conseguir algo y cuando lo tienes lo cuidas como oro. :)
Ha, queria preguntarte acerca de la cantidad de texto que puedes introducir, puede ser que sean 1.030 caracteres???... de ser asi, alcansaria muy bien pero creo no bastaria para algunas cosas.
Bueno, te comento que te di acceso a mi MSN, va ser bravo que nos encontremos ya que segun creo, los horarios que manejas son muy distintos a los de aqui, pero ya veremos como solucionarlo... Saludos y nos mantenemos en contacto. :hola:
PD: Por ahora vengo tranqui con los proyectos, ya que hay un reto que me esta volviendo loco, estaba trabajando en un discador telefonico para una central de alarmas. Saludos :hola:
-
yo tb e leido acerca de sistemas operativos xa PIC pero no tengo claro si serian una ventaja xa el proyecto, aparte de que no se como se crearia despues un programa.
La idea de usar los leds para indicar en que parte del texto estamos me parece buena, xq aunke seria mejor con una barra dibujada a la izq de la pantalla, lo de los leds es muchisimo mas sencillo de programar.es importante que pueda habilitarse y desabilitarse esta funcion para que el aparato llame la minima atencion.
La dos memorias EEPROM son 24FC515 con 64kbytes caada una, eso le da una capacidad de 128000 caracteres que segun calcule eran el ekivalente a una 16 paginas completamente llenas de texto....
HI-TECH creo que vendia algun sistema operativo xa PIC, aunke no se si requerian memoria externa o algo asi.De todas maneras no es necesario que el aparato sea "multitarea" xq....xq no. Voy a hacer un dibujo en el que lo explike y lo pongo en el mensaje siguiente
-
0/5 Con el flanco de subida de RA0 configuramos y ponemos en marcha TMR0 para que cree una interrupcion en el punto 1.
0-1 Podemos ejecutar cualkier subrutina, como comunicarnos con las EEPROM, enviar datos al LCD....
1 TMR0 overflow se crea una interrupcion, configuramos y ponemos en marcha TMR0 para que cree una interrupcion en el punto 4, empezamos una cuenta paramedir el valor de G.
1-2 Cuando RA0 pasa a 0 alamacenamos el valor de G, y volvemos al punto del programa dnd se quedo cuando TMR0 genero la interrupcion.
3 Es simplemente el punto en el que G tomaria su valor maximo.
3-4 Es un tramo identico al tramo 0-1, podemos ejecutar cualkier cosa.
4 En este punto TMR0 vuelve agenerar una interrupcion por overflow,permanecemos a la espera del flanco e subida de RA0.
5/0 Con el flanco de subida de RA0 configuramos y ponemos en marcha TMR0 para que cree una interrupcion en el punto 1.
PD: Cuanto mas pequeño sea el tramo 4-5, mas rapido funcionara el dispositivo(desde el punto de vista del usuario)
Cuanto mas grande sea el tramo 1-3, mas profundidad de G.
-
Uno de los usos(no tiene xq ser el unico) para los leds.
El dispositivo permanece en modo "sleep" cuando no se va a usar durante algun tiempo. La forma para que solo los usuarios lo puedan encender y no se encienda x ejemplo cuando lo llebamos en un bolsillo es solicitarde alguna manera un codigo. Este codigo en un principio seria el mismo xa todos los aparatos y consiste en dejar el aparato 1 seg horizontal, 1 seg apollado sobre un lado y un seg sobre otro lado, todo esto provoca diferentes impulsos en la salida del accelerometro. Bien, pues podriamos hacer que el verde indique cuando el dispositivo esta en la posicion correcta xa cumplir la secuencia y el rojo que indique el mmnto en el que has de ambiar al siguiente movimiento.
-
Es una idea realmente interesante, lo veo bueno, ya que de otra manera no se estaria seguro de que se hagan bien los movimientos. Seria lindo poner tambien aparte un contador de 2 seg de tiempo para hacer el otro movimiento, ahi se estaria mucho mas seguro de que no habra forma de ingresar. Saludos :hola:
-
No entiendo a que te refieres con lo del temporizador de 2 seg. Bueno, esto es un dibujito de como seria el funcionamiento de los leds mas o menos....
-
En el punto 1 configurabamos TMR0 para q crease una interrupcion en el punto 4.
He pensado que conectando el acelerometro al puerto B del PIC y utilizando una interrupcion de PORTB change dejamos el TMR0 libre durante el tramo 1-5 y aparte eliminamos el tramo 4-5.
0 TMR0 config, TMR0 START
Tiempo para otros procesos
1 TMR0 overflow interrupt
TMR0 STOP
G minima
2 G actual
Tiempo para otros procesos
3 G maxima
Tiempo para otros procesos
4 PORT B change interrup, TMR0 config, TMR0 START
-
El numero de menu. 0-128. Un bit ($)indica que ha terminado
Entre el byte q lleva el $ y el * se encuentra el texto q da nombre al menu.
*indica el PC si se pulsa OK
#indica el PC si se pulsa Cancel
& Indica el inicio dl menu.
1 $ TDB *CHECK #OFF
2 $ CONFIG *OPEN #CLOSE
3 $ TEXT *OPEN #CLOSE
4 $ CLOCK *M.CLOCK #M.TDBM
" separa distintos submenus.
2.1 $ X *OPEN #CLOSE
2.2 $ Y *OPEN #CLOSE
2.3 $ OK *OPEN #CLOSE
2.4 $ CANCEL *OPEN #CLOSE
"
2.1.1 $ AMPLI *OPEN #CLOSE
2.1.2 $ CENTER *OPEN #CLOSE
2.2.1 $ AMPLI *OPEN #CLOSE
2.2.2 $ CENTER *OPEN #CLOSE
2.3.1 $ AMPLI *OPEN #CLOSE
2.4.1 $ AMPLI *OPEN #CLOSE
"
2.1.1.1 $ 0 *EJ:100 #- No efectua ninguna accion
2.1.1.2 $ 1 *EJ:110 #- No efectua ninguna accion
2.1.1.3 $ 2 *EJ:120 #- No efectua ninguna accion
2.1.1.4 $ 4 *EJ:130 #- No efectua ninguna accion
"
2.1.2.1 $ 0 *EJ:140 #- No efectua ninguna accion
2.1.2.2 $ 1 * #
2.1.2.3 $ 2 * #
2.1.2.4 $ 4 * #
2.1.2.5 $ 5 * #
"
2.2.1.1 $ 0 *EJ:190 #- No efectua ninguna accion
2.2.1.2 $ 1 * #
2.2.1.3 $ 2 * #
2.2.1.4 $ 4 * #
"
2.2.2.1 $ 0 *EJ:230 #- No efectua ninguna accion
2.2.2.2 $ 1 * #
2.2.2.3 $ 2 * #
2.2.2.4 $ 4 * #
2.2.2.5 $ 5 * #
"
2.3.1.1 $ 0 *EJ:280 #- No efectua ninguna accion
2.3.1.2 $ 1 * #
2.3.1.3 $ 2 * #
2.3.1.4 $ 4 * #
"
2.4.1.1 $ 0 *EJ:320 #- No efectua ninguna accion
2.4.1.2 $ 1 * #
2.4.1.3 $ 2 * #
2.4.1.4 $ 4 * #
% Indica el fin dl menu.
El texto lleva un menu o indice separado
En la pantalla se muestran ,despues de que el dispositivo haya hecho el wake up, los menus que solo tienen un numero(ej: 1, 2, 3 y 4).
Cuando abrimos un menu se muestra en una pantalla nueva su contenido.
El modo reloj muestra una hora en toda la pantalla por si es necesario convencer a alguien de que nuestro aparatito es un reloj de pulsera ;-) ...
-
e estado pensando en incorporar un PIC algo mas versatil, y estoy replanteandome utilizar un 16F88 puesto que tiene mas memoria RAM, EEPROM FLASH, mas timers, incorporado el I2C, PWM...un puñaico de cosas quepueden ser muy utiles para el apartito.
En un semanita hare un nuevo SCH y un nuevo PCB que pondre en el foro.
-
Es buena idea cambiar de micro, aparte sera mas facil en muchos sentidos... la idea del reloj es exelente.
Dime... la alimentacion del dispositivo, sera con una bateria de 9 Volt???. Bueno, veo que estas a full con las ideas, recuerda que debes estudiar! :whistling: ... Saludos y hasta pronto!. :hola:
-
Pues todo depende de la tension maxima de entrada del regulador de voltage VREG1, pero supongo que 12 pilitas de boton conectadas en serie y paralelo xa obtener 9 voltios. Cada pilita tiene un diametro de 9.4mm y un grosor de 3mm y no se cuantos mAh pueden proporcionar pero el consumo del dispositivo no creo que supere los 15mAh. Sabes cuantos mAh podrian proporcionar unas pilas de esas dimensiones?
-
Caben 12pilas y consigo 9V 168mAh
Ya he mirado caracteristicas de pilas de boton de tamaño similar, y lo que e encontrado es:
9.5*3.6mm 84 mAh cada pilita,
serian unas 210horas (creo que serian unos 0.8mAh)en modo sleep y unas 11 horas (creo que serian unos 15mAh)en modo usuario.
-
org 0
;INT:
;POWER UP,CCP,WDT,USART,I2C,EEPROM,TMR0,TMR1,TMR2,ADC
;General Program routines
;Program starter
;For Menu navigator. (SOFTWARE)
;For Acc. Decoder (SOFTWARE)
;For Screen generator (SOFTWARE)
;Subrutines:
;For EEPROM READ (I2C)(RB1,RB4)
;For EEPROM WRITE (I2C)(RB1,RB4)
;For LCD WRITE (USART Synchronous Master Mode)(RA2,RA3,RA4,RB2,RB5)
;For Acc. reader(CCP)(RB0,RB3)
;For LEDs controller (PortB)(RB6,RB7)
;For Vbat indicator (ADC)(RA0)
;For Vreg3 OFF (PortA)(RA1)
;------------------------------------------------------------
org 0004
;INT.
;BCF INTCON,GIE
;BCF WDTCON,SWDTEN
;BTFSS INT1(power UP)
;GOTO 1
;BTFSS INT2(CCP)
;GOTO 2
;BTFSS INT3(WDT)
;GOTO 3
;BTFSS INT4
;GOTO 4
;BTFSS INT5
;GOTO 5
;BTFSS INT6
;GOTO 6
;BTFSS INT7
;GOTO 7
;BTFSS INT8
;GOTO 8
;BTFSS INT9
;GOTO 9
;BTFSS INT10
;GOTO 10
;BTFSS INT11
;GOTO 11
;BTFSS INT12
;GOTO 12
;BTFSS INT13
;GOTO 13
;BTFSS INT14
;GOTO 14
;
;POWER ON
;Config 16F88(intterrupts!!)
;CHECK
;APAGAR LCD
;MEDIR VBAT
;MEDIR ACC.
;LEER/ESCRIBIR EEPROM
;¿Verificar LEDS?si esto es posible
;Encender LCD
;Mandar Info.
;WAIT 5 SECONDS
;LCD OFF
;LEDs OFF
;GETOFF
;GET OFF
;PORTS A&B High-impedance
;WDT CONFIG (1seg)
;WDT ON
;SLEEP
;WAKE UP
;if ACCX NO= G or ACCY NO= G, GOTO GETOFF
;if ACCX =G AND ACCY=G during 250mS, LEDGREEN ON
;else GETT OFF
;WAIT 750mS
;LEDRED ON
;WATI 250
;LED RED OFF
;if ACCX =G AND ACCY=+G during 250mS, LEDGREEN ON
;else GETT OFF
;WAIT 750mS
;LEDRED ON
;WATI 250
;LED RED OFF
;if ACCX =+G AND ACCY=G during 250mS, LEDGREEN ON
;else GETT OFF
;USER MODE
;USER MODE
;Acc. Intepreter
;Menu Navigator
;Screen Generator
-
conexiones para el nuevo PCB. Resistencias pull-up en RA4,RB1,RB4 y RA1.
RB0 ACCx
RB1 EEPROM SDA
RB2 LCD SDI
RB3 ACCy
RB4 EEPROM SCL
RB5 LCD SCK
RB6 LED R, ICSP
RB7 LED G,ICSP
MCLR ICSP
RA0 Vbat
RA1 Vreg3 SHDN
RA2 LCD D/C
RA3 LCD RST
RA4 LCD CS
-
Esto seria el metodo de lectura de los impulsos dutty cicle con el modulo CCP del 16F88. Queda mucho mas sencillo que el metodo que tenia pensado para el 16F84, y ademas se necesita ejecutarmenos instrucciones que antes. Si el TMR1 se puede configurar con un reloj de 144*65536 se puede obtener una profuncidad de 16 bits en cada medida.
Inconvenientes tenemos que solo se toman 144/2 medidas de los ejes X e Y por segundo, pero son suficientes de toda maneras.
-
Muy bien amigo, me alegro que te hallas decidido por el 16F88, eso si, te informo que tengo 0 experiencia con ese micro, segun estuve viendo es muy similar al F84 pero con algunas cositas extras... bueno, es buena idea que comenzemos a implementar algo de lo que sabemos y escribamos un poco de codigo, por lo menos para que se nos haga un poco menos pesado. Vi el mensaje anterior y voe que lo tienes muy bien pensado a todo lo que vamos a hacer. Tengo algunas cosas que preguntarte, si no las posteo aqui te las pregunto por chat. Saludos y hasta lueguito :hola:
-
Hola, mira estos archivos, estoy realizando el proyecto que esta aqui para ver que puedo sacar para nuestro proyec... Saludos :hola:
-
no esta terminada esta parte, pero es bastante sencilla asi que la pensare en otro mmnto...bueno aqui va el dibujo
-
ahm, e pensado que las letras minusculas podrian estar en la eeporm del 16f88, incluso que las vocales minusculas podrian estar en la RAM. este dibujo no es sencillo de comprender, es el metodo xa generar 7 lineas de texto verticales y enviarlas al LCD en 6 bytes.
solo me queda comprobar una pequeña cosa de este ultimo dibujo y ya podria empezar a programar todo....
-
Se entiende perfecto, solo me queda preguntarte, de que manera escribiras el lcd???...
asi:
0 1 2 3 4 5 6 7 8 9 10
11 12 13 ...
O Asi:
0 11
1 12
2 13
3 ...
4 ...
5
6
7
8
9
10
Saludos :hola:
-
digamos que el LCD lo escribiria asi
primero de Y0,X7 hasta Y0,X83, Y1,X7 hasta Y1,X83...... Y5,X7 hasta Y5,X83, despues desde Y0,X0 hasta Y0,X6,Y1,X0 hasta Y1,X6,..........Y5,X0 hasta Y5,X6.
El metodo que planteo mas adelante permite enviar al LCD 7 lineas de texto, y aun me queda pensar como hacer para escribir en el LCD una barra(como un pequeño menu al borde de la pantalla)con 6 botones que apareceria en la posicio Y0,X0 hasta Y0,X6,Y1,X0 hasta Y1,X6,..........Y5,X0 hasta Y5,X6.
En la memoria RAM 4 bancos. Dos consecutivos de 38 (R1H y R2H)bytes y otros dos consecutivos de 39 bytes(R1L y R2L).
Primero generamos el texto que queremos mostrar en esos dos bancos leyendolo de la EEPROM.
Ponemos el LCD en la direccion Y0,X7.
Segundo cogemos la direccion del primer byte del banco 1 y lo metemos en el FSR. Despues copiamos INDF al TXREG. Sumamos 38 al FSR para desplzarlo al R2H. Rotamos 1 vez a la izq y testeamos "carry", si es 1 ponemos a 1 TXREG,7. enviamos TXREG al LCD.
ahora restamos 37 al FSR, restamos 38 y comprobamos si es 0, si no volvemos al principio.......bueno,mejor lo pongo en ASM y are un dibujo mejor...
Me gustaria saber si las operaciones del INDF provocan alteraciones en STATUS REG...alguien lo sabe
La primera linea de texto no se rota, la segunda se rota x1, la tercera x 2, la cuarta x 3, la quinta x 4, la sesta x -3 y la saeptima x -2.
;Screen Generator
;LCD XYB1H
;Generar B1L en R1L
;Generar B1H en R1H
;Generar B2L en R2L
;Generar B2H en R2H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB1H
;LCD XYB1L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB1L
;LCD XYB2H
;Generar B3L en R1L
;Generar B3H en R1H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB2H
;LCD XYB2L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;got LCD XYB2L
;LCD XYB3H
;Generar B4L en R2L
;Generar B4H en R2H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB2H
;LCD XYB3L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;got LCD XYB2L
;LCD XYB4H
;Generar B5L en R1L
;Generar B5H en R1H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,4
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB2H
;LCD XYB4L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,4
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RRF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;got LCD XYB2L
;LCD XYB5H
;Generar B6L en R2L
;Generar B6H en R2H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB2H
;LCD XYB5L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,5
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;got LCD XYB2L
;LCD XYB6H
;Generar B3L en R1L
;Generar B3H en R1H
;set LCD ADDR
;mov RlADDR to FSR
;mov indf to TXREG
;ADD 38 to FSR
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;goto LCD XYB2H
;LCD XYB6L
;mov R2ADDR to FSR
;mov indf to TXREG
;ADD 39 to FSR
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,6
;RLF INDF,f ;esto funcionaria?
;BTFSS STATUS,c ;esto funcionaria?
;BSF TXREG,7
;SEND TO LCD
;SUB 37 to FSR
;sub 38 to FSR,w ;!!!el resultado en W
;btfss STATUS,0
;got LCD XYB6L
-
LCDXYB1L
movlw 100
movwf FSR,F
movwf INDF,w
movwf TXREG,f
movlw 39
addwf FSR,w
rrf INDF,f
bsf TXREG,7
btfss STATUS,c
bcf TXREG,7
movlw 37
subwf FSR,f ;(FSR-37=FSR)
subwf FSR,w ;(FSR-38=w)
btfss STATUS,z
goto LCDXYB1L
END
Me gustaria saber como conseguir las operaciones de FSR-38=w con los minimos ciclos posibles. con la instruccion subwf FSR,w ,lo que hago es restar el valor de FSR a 38, y lo que pretendo es restar 38 al valor de FSR. si despues de jecutar subwf FSR,w, ejecuto la intruccion de complement rega,w y en rega hay un valor de 0? o despues de subwf FSR,w le sumo 128 a w?
-
diagrama de flujo general del Acc. Interpreter
-
Las rutinas basicas:
1 LEDs controller:
Utiliza de 4 a 8 registros de la RAM. Se ejecuta cada x segundos por una interrupcion de TMRx.
2 Acc reader:
Utiliza 4 a 10 registros de la RAM
Se ocupa de leer datos analogicos de AccX y AccY
3 Acc interpreter:
Utiliza de 10 a 20 registros de la RAM
se ocupa interpretar los datos leidos por el Acc reader
4Cursor mov.:
se ocupa de variar la posicion del cursor en funcion de Acc interpreter
5 EEPROM R/W
se ocupa de acceder a la EEPROM externa para escribirla o leerla
6Menu pointer
Se ocupa de marcar que menu se muestra en primera inea de pantalla, que menu esta seleccionado
7Screen Gen
Se ocupa de decodificar los caracteres de cada menu, de pintar el cursor en el lugar adecuado y de invertir el menu seleccionado.
8LCD config
Se ocupa de configurar el LCD y de enviarle DATOS
-
Yo no se mucho de pics, pero soy capaz de integrarlo en un "reloj" de pulsera con el display del telefono movil y hacer un boligrafo que aparte de escribir tenga pulsadores para controlar el reloj por infrarrojos. Eso si, el diseño tiene que ser un pic 16F877 + Eeprom 24LC64 (igualito que el 16F876 en funcionamiento) o un 16F84 + 24LC16B. Aparte estaria bien que el programa diese la hora para disimular... XDDD
-
No es mala idea, pero tendriamos que dejar de lado lo del acelerometro y las memorias para mayor capacidad... haber que opina mi amigo, la idea es muy buena, aparte nadie se lo imaginaria, pero tambien me gusta la idea de manejarse sobre el menu con unos movimientos... Ahh Averigue sobre la capacidad de la pila, es de 8 niveles y no hay manera de sobrepasarlos ni crear algo similar, no se puede usar la RAM para nada y lamentablemente deberemos de cambiar de micro, estuve averiguando y el que nos serviria es cualquiera de la serie 18Fxxx, lamentablemente son los unicos que tienen mas capacidad en la pila, lo malo es que disponen de 95 o algo asi de instrucciones, por lo que recomendaria que nos ocupemos y manipulemos con un micro de motorola ya que la diferencia es muy poca y la eficiencia del motorola es maxima. Saludos y suerte :hola:
-
si, las primeras versiones de mi proyecto funcionaban con un boli con pulsadores que transmitia las señales por medio de infrarrojos, pero luego conoci los acelerometros y me gusto incluirlos de alguna manera en el diseño. Una delas formas que mas me han gstado para disimular el aparato es quitarle al LCD una de las laminas de plastico que llevan en la parte superior. Solo quien mire a traves de esta lamina podra distinguir entre un pixel pintado yuno sin pintar,de tal manera que mientras los demas ven el LCD en blanco, tu puedes estar leyendolo a traves de unas gafas con esa laminita.
xq dices que puedes hacer esto con esas configuraciones de PIC unicamente? es xq estas pensando en usar chips de estos que se usan xa targetas de pirateria? no me lo he planteado, pero desde luego se puede conseguir un gran ahorro de espacio...aunqe quizas se quede corto en cuanto I/O...
en fin, agradezco enormemente tu interes y espero leer mas post que no sean mios...ejejej
-
Si, efectivamente es devido a la gran integracion del chip en esas tarjetas. Tambien se puede con otro tipo de micros (www.todotarjetas.com (http://www.todotarjetas.com) en la seccion de tarjetas de plastico) pero ya no son pic y no tengo ni idea!!. Lo del accelerometro se podria sustituir por un pulsador que haga correr el texto mientras esta pulsadoa una velocidad suficiente como para copiar a mano lo que aparece en pantalla. Lo de la laminita de plastico es muy buena idea!! tambien habria que incluir un jack mini en el reloj que sirva de puerto de comunicaciones PC para poder introducir los datos desde el programador, pero eso no es problema. Por cierto, recuerdo algo de una rutina para no tener que hacer circuitos antirebote en cada pulsador, eso vendria muy bien para no tener que fabricar antirebotes en cada pulsador del boligrafo-transmisor.
-
de momento estamos limitados al tamaño de la pantalla, que es de 34x40mm, el PCB tiene el mismo tamaño, y las baterias para una autonomia de 10-15 horas de uso miden lo mismo. El tamaño total del circuito con baterias es de 34x40x12mm con baterias y todo. Si queremos usarlo de relog basta con ponerle una correa...
-
Si, pero estar constantemente manipulando el accelerometro... puede ser muy descarado, por no hablar de las pilas y los cables que colgarian o podrian verse. Existen unas pilas pequeñas de 6v, son como la mitad de una pila de mando a distancia, yo las he tenido y me imagino que en un bazar puedan conseguirse. Tambien supongo que habra otras pilas similares de otros tamaños/voltajes. Tengo un nokia 5110 pero no puedo destriparlo porque es de mi padre, tambien tengo un maxon mx-6869 destripado, el display esta bastante chulo pero no tengo ni idea de las conexiones, me imagino que sera mas complejo que un display sencillo asi que hare pruebas a ver que consigo.
-
Es sierto lo que dice pagaxus sobre el acelerometro, la idea del infrarrojo esta muy buena, al mover el brazo a cada rato levantarias sospechas... quedarias como un loco, en cambio con una birome eso no seria problema, ya que es lo que menos sospecharian, ni siquiera mirarian a donde estas... pensando un poco me convence mas la birome, que piensas tu amigo???. Saludos :hola:
-
el aparatito utilizaria si no recuerdo mal 12 pilitas de boton de 9mm radio y 3 de alto cada una con una capacidad de unos 35mAh. Estube calculando y con 12 baterias de estas dimensiones pero de nimh se obtendria una capacidad de 60mAh. Las pilas van detras del dispositivo, pegadas a el, recuerda que 34x40x12mm... bueno, los movimientos para manejar el aparatito no necesariamente tienen xq ser unos movimientos exagerados supongo que simplemente moviendo los dos dedos cn los que sujetamos el aparato bastaria, pero esta claro que pulsar botones en un boli es mas disimulado...en fin, d mmnto seguire cn este sistema.
-
¿La primera imagen que pones en el post corresponde al controlador del display? esta muy muy currado, no creo que yo pueda conseguir hacer un pcb tan preciso.
-
Es todo el aparato. No es dificil si le heaces sin prisas. De todas maneras siempre necesito varios intentos xa conseguir unas placas decentes...lo mas importante es tener unas transparencias buenas. Yo imprimo el dibujo en un folio ampliado 2 veces, y lo llevo a una copisteria pido que me lo fotocopien sobre una transparencia reducido al 50%. El resto del proceso ya lo conoceras...
-
El controlador le has hecho con algun esquema de internet? estoy acostumbrado al los LCD de 16x2 de caracteres y una pantalla de movil no se como funcionara. Aqui tengo un standar pero preferiria algo ya integrado.
http://home.iae.nl/users/pouweha/lcd/lcd_examp.shtml (http://home.iae.nl/users/pouweha/lcd/lcd_examp.shtml)
-
mmmm, nuevas subrutinas.
la memoria EEPROM externa lleva un banco con todos los caracteres en ASCII dijujados de tal manera que una l (en ASCII 81hex)seira:
81x5=285h
285$ 11111111
286$ 00000000
287$ 00000000
288$ 00000000
289$ 00000000
280$ 00000000
un total de 256 caracteres x 5bytes = 1280Bytes. (direcicon 500h)
De esta manera, leyendo un byte con un caracter en ASCII y multiplicandolo x 5 direccionamos rapidamente hasta las posiciones de memoria de la EEPROM que contienen el "dibujo" del caracter.
En las siguientes direcciones a partir de la 500h se encuentra toda la informacion de MENUS, con su NUMERO de MENU, MENU PC OK, MENU PC CANCEL, MENU NOMBRE, MENU CONTENIDOS.
A Menu Numero AB Menu PCOK BC Menu PCCANCEL CD Menu Nombre DE Menu Contenidos E
A: indica que los datos hasta nueva A van a indicar el Menu Numero
B: indica que los datos hasta nueva B van a indicar el Menu PCOK
idem con la C,D y E.
El Menu Numero tiene un tamaño fijo de 3 bytes
El Menu PCOK tiene un tamaño fijo de 2 bytes
El Menu PCCANCEL tiene un tamaño fijo de 2 bytes
El Menu Nombre puede cualquier tamaño
El Menu Contenidos puede cualquier tamaño
El Menu Numero esta estructurado en 6 datos de 4 bits que pueden ir del 0 al 11 lo que da un maximo de 14000 menus distintos(aunque no cabrian en la EEPROM)
El Menu PCOK son dos bytes con la direccion que habria que introducir en el program counter del micro si el usuraio hace un movimiento de OK y el cursor esta sobre ese menu)
El Menu PCCANCEL son dos bytes con la direccion que habria que introducir en el program counter del micro si el usuraio hace un movimiento de CANCEL y el cursor esta sobre ese menu)
El Menu Nombre son los caracteres que se muestran cuando un menu esta cerrado
El Menu contents son los caracteres que se muestran cuando un menu esta abierto
Cuando el dispositivo arranca va a la direccion de EEPROM 501h y busca A
INC EEADDR (la direccion EEPROM a leer)
mobemos los 3 bytes del Menu numbre a la RAM en Actual Menu y buscamos de nuevo A.
ahora buescamos la siguiente B
almacenamos en la RAM en ACTUAL Menu PCOK, con la C lo mismo
y ahora buscamos D...
EEDATA=D
MOV (84-ancho de la barra) to BFERC
label 1
INC EEADDR
SAVE EEADR in CADDRP
READ EEPROM
EEDATA = D? ---SI----> desde BFERC hasta final pintar 0. IR a Mostrar
Multip`licar EEDATA x 5, resultado en EEADDR
label2
MOV BFERC to FSR
READ EEPROM
MOV EEDATA to W
W=0? --------SI-------> "caracter terminado". Pintar espacio. IR a label 1
MOV W to INDF
INCFSZ BFERC ----0----->"Linea terminada". IR a Mostrar
DECFSZ CP----0----> "caracter terminado". Pintar espacio. IR a label 1
INC EEADDR
IR a label 2
Me queda explicar como pintar un cursor en la pantalla acorde con la posicion actual en funcion de los movimientos.
Me queda explicar como invertir el color (B/W) de un menu cuando el cursor esta encima de este
Me queda explicar como se pintauna barra a la izq. de la pantalla.
Me queda explicar un nuevo metodo para crear un buffer en la RAM con una fila entera de 84 bytes con los pixels que tienen que tienen que ser pintados en el LCD.
Me queda explicar como se hace un buffer para tranformar las 7 lineas de texto que aparecen en la pantalla a 6 lineas que caben en la pantalla.
Pero para explicar estos ultimos buffers asi como el aspecto del cursor are unos dibujitos
Tambien tengo un nuevo algoritmo para transformar los 7 caracteres a 6 lineas mas rapido que el que propuse en post anteriores....
en fin, si alguien comprende todo esto que pongo y me quiere sugerir algo...
-
Pues gracias por explicarte, y no, no lo entiendo aunqe me esfuerzo por ello. XDDD. Yo voy a intentar hacer la version del boli a distancia. No tengo los datos exactos pero si se como hacerlo:
Con un temporizador 555 smd, 4 pulsadores mini, 5 resistencias smd, 1 condensador smd, 1 emisor infrarrojo y una pila de 3v de camara de fotos. Cabe todo perfectamente en la mitad de un boligrafo que tenga el diametro un poco ancho. cada pulsador conectado a traves de una de las 4 resistencias al 555, todas de distinto valor para generar pulsos de distinta frecuencia. La salida del 555 al emisor infrarrojo. con la otra resistencia y condensador se hace el tiempo de descarga del 555, con lo que este tiempo es igual para los 4 pulsadores, asi que nos fijamos solo en la anchura de los distintos pulsos. En el programa habra que hacer una rutina que al recibir los pulsos infrarrojos mida la anchura del pulso(habra que hacer unas pruebas con osciloscopio para los valores de muestreo del pic) y decodifique cual de los 4 pulsadores ha sido accionado. Tanto el pic como el 555, como el display led funcionan con 2v, asi que con 3v tanto en el reloj como el boligrafo deberian tener una pila de esas de 3v o dos de boton de 1,5.
-
lo dicho....
Me queda explicar un nuevo metodo para crear un buffer en la RAM con una fila entera de 84 bytes con los pixels que tienen que tienen que ser pintados en el LCD.
......Pero para explicar estos ultimos buffers asi como el aspecto del cursor are unos dibujitos
Tambien tengo un nuevo algoritmo para transformar los 7 caracteres a 6 lineas mas rapido que el que propuse en post anteriores....
...bueno, este es el dibujo...
-
lo dicho....
Me queda explicar un nuevo metodo para crear un buffer en la RAM con una fila entera de 84 bytes con los pixels que tienen que tienen que ser pintados en el LCD.
......Pero para explicar estos ultimos buffers asi como el aspecto del cursor are unos dibujitos
Tambien tengo un nuevo algoritmo para transformar los 7 caracteres a 6 lineas mas rapido que el que propuse en post anteriores....
...bueno, este es el dibujo...
-
Estaria bien el poder incluir graficos, asi la chuleta seria mas completa.
-
sip, lo se, pero de mmnto prefiero elaborar lo que mas o menos tengo en mente. una vez todo esto este realizado, si que kiero añadirle algunas cosas(como la posibilidad de almacenar y mostrar dibujitos).
Ahm, recorede una cosa que yo pense xa mi emisor de infrarrojos en su dia. Nada mas q yo lo hice con dos botones, y cuando se pulsaba uno la frecuencia era de 1Khz. Cuando se pulsaba el otro, la frecuencia era de 2Khz. Cuando se pulsaban los 2 a la vez emitia con una nueva frcuencia de 2.7Khz.
En fin, espero que este consejo te sea de utilidad
-
http://www.geocities.com/dinceraydin/lcd/intro.htm (http://www.geocities.com/dinceraydin/lcd/intro.htm)
En esta pagina viene explicado el funcionamiento de un display 2x16, esta bien para entender como funcionan para poder programarlos con el pic. Tambien viene un simulador. Estaria bien saber tambien las diferencias que hay con un display como el del 5110, ya que los estandar tienen 14 pines y el del 5110 solo tiene 9 creo:
http://todomodding.com/forums/showthread.php?threadid=254 (http://todomodding.com/forums/showthread.php?threadid=254)
aqui viene una explicacion de un display del 3310, seria interesante tener disponible toda la informacion para poder trabajar con ello mas comodamente.
Saludos.
-
#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
-
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.
-
aqui va el esquema del programa que e escrito en ASM, por cierto, son unas 380 instrucciones....
-
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.
-
Hola a Todos
quisiera pedirles ayuda en como calibrar el adxl311, realmente como saber el valor de 0G y la formula de transformacion de un voltaje a aceleracion en G tambien uso un pic para leer los datos
gracias
-
HOLA
Me parece tu proyecto muy interesnte excepto la aplicacion claro...... :devil: :devil:
no he leido todos los mensajes porq son muchos y mucha informacion, pero me sorprende agradablemente la forma tan documentada en q llevas todo.
Sabes para calibrar y saber exactamente como es q responde el dichoso acelerometro en circunstancias reales, lo primero q hubiese hecho es conectarlo directamente a una PC, al margen de lo q te diga la hoja de datos del chip.. y analizar las proporciones indicadas para ser tomadas en cuenta por tu chip.
No es necesario creo yo la precision matematica de las formulas por quien aplicara los movimientos
En cuanto a las posibilidades de obtener ganancias economicas de tu proyecto pues creo q no seran compensatorias al tiempo q le estas dedicando, :lightsabre: pero esta perfecto para hacerte rutinas muy interesantes aplicables a muchas cosas sobre todo el LCD.
:)
En fin felicitaciones por la forma de hacer las cosas y soy tambien de los que creen en q se puden hacer cosas muy buenas en el laboratorio de casa. :smartass:
Suerteeeeee!!!!!!!
Bye :hola: