TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: tito melli en 13 de Diciembre de 2017, 14:16:02
-
Hola,
Tengo una duda (quizás un poco básica): si quiero conectar un botón en un pin con pull up activada, ¿Es necesario poner otra pull up externa?
Entiendo que no, pues la interna ya hace su función. Sin embargo, siempre que veo esquemas veo la resistencia externa también (incluso cuando hay pull up interna), y no se si es porque es aconsejable por algo, o qué.
Gracias!
Saludos
-
Si tenes pull-up simplemente pones el boton del pin a GND.
Hay veces que el pull-up interno no provee demasiada corriente, entonces es necesario utilizar uno externo.
-
Entendido. Gracias! :)
-
En Arduino, a 5V, el pull-up entrega 0.15mA
La corriente depende del micro y de la tensión de alimentación. Cuanta más tensión, más corriente.
En micros modernos (sobre todo de 16 y 32 bit), se puede controlar la cantidad de corriente de Pull-up en cada salida.
Saludos.
-
Hola de nuevo,
Gracias por vuestras resupestas. Lo he probado en Proteus, y va perfecto. Pronto lo probaré físicamente en una PCB.
Aprovecho este hilo para preguntaros también algo: he leído que cuando escribes información en la EEPROM, el PIC tarda como 4ms en hacerlo. ¿Es posible que, si se produce alguna interrupción (por CCP1 por ejemplo), falle este proceso? o ¿cuando escribe no hay forma de interrumpirlo?
Gracias!
Saludos
-
Hola,
Para escribir(principalmente) o leer la EEPROM es altamente recomendable deshabilitar las interrupciones durante el proceso. En realidad, mas que recomendable, creo que es obligatorio. Todos los datasheet de Microchip que leí lo implementan de esa manera.
Saludos.
-
Justo lo que necesitaba saber. Gracias! :)
-
Lo que yo no se es si es necesario unicamente para dar la habilitacion a la escritura o si es necesario para todo el proceso de escritura.
Algunos dicen que es unicamente para la habilitacion, ya que debe ingresarse sobre los registros de la EEPROM ciertos valores seguidos para quitar la proteccion. Y que si ocurre en esos momentos se interrumpe y por lo tanto no se estaria escribiendo sobre la misma. Por eso es mejor una escritura y verificacion de la misma.
Mirando el codigo de microchip hay 2 casos, en algunos deciden meter la espera hasta que termine de escribir la EEPROM dentro de la proteccion de las interrupciones. Y en otros casos esa espera se encuentra afuera.
Asi que pienso que lo que vale es eso.. Es escribir esos 2 valores + el bit de escritura (para que inicie) seguidos y sin interrupcion, luego de alli en adelante podes activar las interrupciones.
Lo cual es tener desactivadas las interrupciones por un maximo de 7 instrucciones simples de 1 ciclo de maquina cada uno. ( 2 de activado/desactivado de interrupcion / 4 de cargar los registros / 1 de escritura del bit )
-
OK. Pero en cualquier caso, CCS no lo hace automáticamente con el comando write_eeprom, no? Lo tendría yo que asegurar.
Según el diagrama de interrupciones, con desactivar la interrupción global (GIE), basta para no tenerlas. Sabeis si esto es totalmente cierto? O vosotros habéis visto alguna vez en que esto no sea suficiente?
Saludos
-
la verdad es que no se como funciona, deberias tener el .hex como para ver si lo genera o no.
Ya que existe la opcion: #DEVICE WRITE_EEPROM = NOINT
------------
Hice un pequeño programa y el codigo del write_eeprom es este:
ASM de write_eeprom(0,1) sin NOINT
Line Address Opcode Label DisAssy
24 0017 1303 BCF STATUS, RP1
25 0018 080B MOVF INTCON, W
26 0019 00F7 MOVWF 0x77
27 001A 138B BCF INTCON, GIE ; Desactiva las interrupciones
28 001B 1703 BSF STATUS, RP1
29 001C 018D CLRF EEADR ; Carga direccion
30 001D 3001 MOVLW 0x1
31 001E 008C MOVWF EEDAT ; Carga datos
32 001F 1683 BSF STATUS, RP0
33 0020 138C BCF EECON1, EEPGD
34 0021 150C BSF EECON1, WR
35 0022 3055 MOVLW 0x55 ; Escribe la secuencia de proteccion
36 0023 008D MOVWF EECON2
37 0024 30AA MOVLW 0xAA
38 0025 008D MOVWF EECON2
39 0026 148C BSF EECON1, WR ; Activa el grabado
40 0027 188C BTFSC EECON1, WR ; Espera hasta que se termine
41 0028 2827 GOTO 0x27
42 0029 110C BCF EECON1, WR
43 002A 0877 MOVF 0x77, W
44 002B 1283 BCF STATUS, RP0
45 002C 1303 BCF STATUS, RP1
46 002D 048B IORWF INTCON, F ; Vuelve a dejar como estaba las interrupciones
Creo que esta explicado con los comentarios, pero basicamente, lo desactiva por si solo CCS. Al menos lo probe en un PIC16F887 como ejemplo
-
Gracias! :)
Con la sentencia: #DEVICE WRITE_EEPROM = NOINT, entiendo que el microcontrolador no habilitará las interrupciones cuando esté escribiendo, no?
Saludos
-
Contesto varias preguntas
Según el diagrama de interrupciones, con desactivar la interrupción global (GIE), basta para no tenerlas. Sabeis si esto es totalmente cierto? O vosotros habéis visto alguna vez en que esto no sea suficiente?
Si con el GIE en un PIC16 es suficiente, en un PIC18 si se utilizan prioridades entonces es necesario desactivar GIEH y GIEL ( ocupan el mismo lugar que GIE y PEIE )
Con la sentencia: #DEVICE WRITE_EEPROM = NOINT, entiendo que el microcontrolador no habilitará las interrupciones cuando esté escribiendo, no?
Acabo de hacer la prueba...
Con el WRITE_EEPROM = NOINT, CCS genera el codigo que esta en este post, el codigo ese me dice que al estar esto, las interrupciones se desactivan por si solas unicamente para cargar las direcciones/datos y quitar la proteccion de la EEPROM, una ves iniciado el proceso de escritura, se activan nuevamente.
La direferencia de usarlo SIN esto es lo que vimos en mi anterior respuesta, SIN el WRITE_EEPROM = NOINT, las interrupciones son desactivadas hasta que finaliza la escritura por completo de la EEPROM.
ASM de write_eeprom(0,1) con el NOINT
Line Address Opcode Label DisAssy
24 0017 1303 BCF STATUS, RP1
25 0018 080B MOVF INTCON, W
26 0019 00F7 MOVWF 0x77
27 001A 138B BCF INTCON, GIE ; Desactivo las interrupciones
28 001B 1703 BSF STATUS, RP1
29 001C 018D CLRF EEADR ; Escribo direccion y dato
30 001D 3001 MOVLW 0x1
31 001E 008C MOVWF EEDAT
32 001F 1683 BSF STATUS, RP0
33 0020 138C BCF EECON1, EEPGD
34 0021 150C BSF EECON1, WREN ; COmienzo a quitar la proteccion
35 0022 3055 MOVLW 0x55
36 0023 008D MOVWF EECON2
37 0024 30AA MOVLW 0xAA
38 0025 008D MOVWF EECON2
39 0026 148C BSF EECON1, WR ; Que comienze la escritura
40 0027 0877 MOVF 0x77, W
41 0028 1283 BCF STATUS, RP0
42 0029 1303 BCF STATUS, RP1
43 002A 048B IORWF INTCON, F ; Activo la interrupciones
44 002B 1683 BSF STATUS, RP0
45 002C 1703 BSF STATUS, RP1
46 002D 188C BTFSC EECON1, WR ; Aca espero que termine de grabarse
47 002E 282D GOTO 0x2D
48 002F 110C BCF EECON1, WREN
En ambos codigos, resalte con negrita los 3 puntos principales, el desactivado, el activado de las interrupciones y por ultimo donde espera hasta que se complete. Asi ves la diferencia.
-
Muchas gracias KILLERJC ((:-))
Por curiosidad, ¿por que se activan antes de terminar la escritura? ¿No habría riesgo de dañar el byte de la EEPROM si hay una interrupción? O fallo en la escritura, etc.
-
O sea... Voy a divagar un poco porque no lo se a ciencia cierta. Tampoco hay mucho donde tomar informacion o al menos mientras busque no encontre, y por ultimo ver que Microchip ofrece las mismas 2 versiones como validas para una escritura correcta hace que piense que no hay problema.
El inicio de la escritura ya se hizo y con las interrupciones desactivadas, de alli en adelante el modulo se encarga de generar la tension alta para el borrado, escritura, etc, el nucleo queda en otro plano ya que el que trabaja es el modulo.. por ser una EEPROM debe actuar charge-pump para generar la tension para el borrado, lo que si pienso es que ese charge-pump es uno solo para la flash y el EEPROM, asi que, para mi, el unico caso en que afectaria la escritura a mi parecer es que quieras grabar la Flash luego de haber iniciado la EEPROM, pero segun el PIC que trabajes, esto se realiza con el mismo modulo de la EEPROM. Asi que solo tener ese recaudo y uno mas que nombro mas adelante.
Lo demas no deberia afectar en nada (interrupcion,etc) lo que si vas a tener que tener cuidado es que si iniciaste una escritura, no vas a poder leer la EEPROM hasta que termine la escritura. Es decir deberias tener esa otra precaucion. Como la EEPROM se usa para mantener valores dentro de todos fijos, la idea de leerlos cuando inicia el micro para llevarlo a variables en la RAM, actualizarlo si es necesario durante el programa tanto la RAM como la EEPROM. Ese manejo haria que no sea necesario tantos recaudos, ya que trabajarias siempre con los datos de la RAM (no tenes que leer constantemente la EEPROM).
-
Ah vale! Entonces no se va a interrumpir porque la charge-pump está ocupada escribiendo en la EEPROM, y no puede usarse para escribir la flash mientras. Es así?
Gracias por las explicaciones KillerJC :)
-
Si la precauciones que necesitas tener son:
No tratar de escribir la FLASH o EEPROM, y no leer la EEPROM mientras todavia esta en curso la escritura de la EEPROM.
Para asegurarte podes usar el flag de interrupcion de la EEPROM, no hay necesidad de activar la interrupcion, solo borrarla y leerla.
-
o debes poner solo cuando es necesario, hay veces q no produce la cantidad de energia q quieres!