Ucontrol Revista 0010
Ucontrol Revista 0010
Ucontrol Revista 0010
Diseño y Diagramación:
Alejandro Casanova,
Lucas M. Treser
y xocas
[email protected]
[email protected]
Consejo Editorial:
Ariel Palazzesi
[email protected]
Emiliano Safarik
[email protected]
.indice
Felixls
[email protected]
Gabriel Gabarain
[email protected]
Hector Javier
[email protected]
Descarga Gratuita.
Este contenido se rige por la licencia
de Creative Commons “Licencia Creative Commons
AtribuciónNo ComercialSin Obras Derivadas 3.0”
.editorial
Es la décima vez que me siento a escribir un editorial para
que sirva de “prólogo” de la Revista uControl. Y al igual que
las otras nueve veces, no se por donde empezar.
Afortunadamente, este dilema se debe a la abundancia de
buenos temas que deberían ser resaltados en estas lineas, y
no al bochornoso hecho de disponer solamente de “material
de segunda” que no me permitiría escribir nada bueno sobre
el contenido de estas páginas.
Cómo desechar
cloruro férrico
Mucho se habla en internet sobre como desechar el cloruro férrico o como no hacerlo, sin
embargo, casi ninguna de las voces explica idealmente como debe hacerse o por qué, es por
ello que nos pusimos a investigar para saber como desechar este compuesto adecuadamente
tratando de causar el menor impacto posible al medio ambiente.
// por: Maximiliano Martin Simonazzi //
[email protected]
El cloruro de hierro (III) o tricloruro de hierro en una reacción exotérmica. De ello resulta
(comúnmente llamado cloruro férrico o mal una solución acida y corrosiva de color
llamado percloruro férrico o percloruro de marrón que se utiliza como coagulante en el
hierro) es un compuesto químico utilizado tratamiento de aguas residuales, para la
industrialmente en muchas aplicaciones. En potabilización del agua, y en la industria
electrónica se lo utiliza para la realización de electrónica para el grabado químico de
plaquetas y generalmente se lo utiliza en su plaquetas de circuito impreso. Al disolverse en
estado líquido o si no como un polvo diluido agua, debería precipitar formando hidróxido
en agua. Su color es rojo purpúreo cuando de hierro (III), insoluble; sin embargo, forma
trasmite la luz y sus cristales tienen un color una disolución coloidal de ese compuesto,
verde oscuro cuando reflejan la luz. que presenta el típico color pardo de las
disoluciones de sales de hierro (III). El cloruro
Es muy probable que toda persona que se férrico anhidro es un ácido de Lewis bastante
haya dedicado a la creación de plaquetas fuerte, y se emplea como catalizador en
electrónicas haya tenido contacto o esté síntesis orgánicas.
usando este químico para realizarlas. Luego
de un tiempo de usarlo este líquido pierde sus Visto lo anterior solo vamos a tomar el
propiedades y ya no puede ser usado para la ejemplo del cloruro férrico disuelto en agua
tarea que se usaba originalmente por lo cual que es el que realmente nos interesa porque
debe ser desechado, y es aquí cuando todos es el que se usa en electrónica.
nos preguntamos ¿Cuál es el método
adecuado para desechar estos residuos? Precauciones:
Es importante saber antes que nada como En este estado no es muy fuerte y no
interactúa el Cloruro Férrico en presencia de quema al contacto con la piel, aun así su
otros compuestos. Por su carácter covalente contacto prolongado puede irritar levemente
este es soluble en disolventes orgánicos. En las capas superiores de la piel. Al contacto
disolución alcohólica se lo conoce como con heridas o los ojos se siente un ardor
tintura de hierro. Cuando se disuelve en agua, intenso debido a las quemaduras que
el cloruro férrico sufre hidrólisis y libera calor produce, urgentemente hay que limpiar la
/ / página 0x05
.cómo desechar cloruro férrico
zona con abundante agua durante 10 minutos poder de ataque de la disolución. Llegado
o más. Una vez que la piel fue expuesta al cierto punto debe ser desechado
cloruro férrico es muy probable que durante adecuadamente.
un tiempo (1 semana aproximadamente) la
misma quede coloreada de un color marrón Para no dar más vueltas sobre el tema,
bien característico, sobre todo en la parte de fuimos directamente a contactar a un
la unión de las uñas con la piel. Es muy responsable de una de las empresas más
recomendable el uso de guantes durante su conocidas en Argentina que comercializa este
manipulación. producto, Electroquímica Delta. En esta
ocasión nos pusimos en contacto con el Ing.
Hay que tener cuidado con la ropa ya que la Leonardo Eidelson el cual nos explicó
tiñe al instante y por más que se la lave va a detalladamente como debe ser la disposición
quedar la mancha en la tela. del compuesto:
Es muy corrosivo para los metales ferrosos "La explicación es general, si bien cada distrito
y algunos metales no ferrosos como el cobre o provincia tiene su propia reglamentación sobre
y sus aleaciones, es por ello que se debe el tratamiento de desechos; tratándose de un
evitar el contacto del mismo con cualquier tipo producto poco peligroso, le sugerimos lo
de metal. siguiente:
Cuando lo hacemos reaccionar con el cobre El desecho del cloruro férrico usado puede
de una plaqueta, este reacciona formando hacerse por vía de desagüe de líquidos
Cloruro Ferroso y Cloruro Cúprico. Para diluyéndolo en gran cantidad de agua, no menor a
obtener mejores resultados, la solución debe 50 litros, por litro de cloruro férrico.
ser calentada a 25º previamente o
simultáneamente en un baño calefactor. Si la Si las cantidades son mayores, agregar al
solución se encuentra en buen estado la recipiente con el producto usado, una pequeña
plaqueta debería flotar sobre la solución. cantidad de hidróxido de calcio (cal) para
También es recomendable usar una fuente de neutralizar el producto, con mucho cuidado y con
aire en el recipiente donde vaya la disolución guantes y gafas por si se generan salpicaduras.
para que de esta manera se oxigene y el
ataque sea más efectivo. El agregado de la cal debe hacerse de a poco,
ya que se eleva la temperatura y se debe esperar
entre agregado y agregado, mezclando con
cuidado con varilla de plástico o madera.
/ / página 0x06
..circuitos
Visualizando 3 displays de 7
segmentos mediante registros
de desplazamiento.
Utilizar display de 7 segmentos para representar datos numéricos de forma visual puede llegar a
ser algo imprescindible en nuestro proyecto. En esta nota presentamos una de las tantas
formas de hacerlo, utilizando registro de desplazamiento y multiplexado, con el fin de ahorrar
pines utilizados por el microcontrolador. Además evaluamos entre 3 posibilidades de registros de
desplazamientos.
// por:Rodrigo Flores Calle //
[email protected]
/ / página 0x07
.tres displays 7 segmentos
/ / página 0x08
.tres displays 7 segmentos
/ / página 0x09
.tres displays 7 segmentos
/ / página 0x0A
.tres displays 7 segmentos
/ / página 0x0B
.tres displays 7 segmentos
/ / página 0x0C
.tres displays 7 segmentos
Y con eso ya tenemos los 1. Primero nos vamos con el TPIC6595 de texas:
datos para nuestros displays
de ánodo común listos para
ser enviados y mostrados.
Ahora una vez explicado
todo lo anterior nos falta
detallar un poco el programa,
comprendiendo todas las
anteriores ideas, podemos
resumir el funcionamiento del
programa para el
microcontrolador como: 2. Ahora cambiamos el TPIC por un registro CD4094
/ / página 0x0D
.tres displays 7 segmentos
/ / página 0x0E
..programación
TIPS de programación en
ASSEMBLER para PIC
En el presente artículo, presentaremos una serie de “Tips” de programación en lenguaje
ensamblador o assembler para los microprocesadores PIC® de Microchip con palabras de
instrucción de 12 y 14 bits.
// por: Hector Javier (HJ) //
[email protected]
/ / página 0x10
.tips de programación assembler
/ / página 0x11
.tips de programación assembler
invb PORTB,3
btfss PORTB,3
goto $+3
bcf PORTB,3
goto $+2
bsf PORTB,3
/ / página 0x12
http://www.ucontrol.com.ar/forosmf/tiendaucontrol/
..proyectos
Receptor de mandos
infrarrojos
La intención del artículo es la de explicar cómo realizar un sistema receptor de infrarrojos, que
sea capaz de descodificar un protocolo específico de cualquier mando a distancia común en
cualquier hogar. También implementaremos un pequeño sistema por contraseña.
// por: Miguel Ángel Borrego Trujillo //
correo autor
Introducción a la solución:
Sabiendo cuál es el proyecto que debemos
realizar, tenemos que fijar unos objetivos para
llevar a cabo el trabajo de una manera
organizada.
el código SIRC, que es un código que
Los objetivos para el correcto del desarrollo distribuye los bits que envía en dos partes, el
del trabajo son: comando y la dirección. Para empezar la
comunicación se envía una señal de 'START'
1. Concretar el protocolo de comunicación. que consiste en un pulso en alto de 2400 us y
2. Estudio del protocolo de comunicación. un pulso en bajo de 600 us, seguidamente se
3. Definir el hardware y circuitería necesaria. envían los datos. Para enviar un 1 se genera
4. Implementar el programa. una señal en alto de 1200 us y uno en bajo de
5. Simulación del circuito. 600 us, para enviar un 0 se genera una señal
/ / página 0x14
.receptor de mandos infrarrojos
/ / página 0x15
.receptor de mandos infrarrojos
conectados a los 4 bits altos del PORTB, ya Configuración para emulación de código
que utilizaré la interrupción por cambio de SIRC en simulación:
estado que estos 4 pines me generan al
haber algún cambio en estos. El botón que
queda lo conectaré al pin de reset (MCLR).
Estos pulsadores estarán conectados a los
pines correspondientes mediante resistencias
de PULLUP de 10k.
/ / página 0x16
.receptor de mandos infrarrojos
/ / página 0x17
.receptor de mandos infrarrojos
/ / página 0x18
.receptor de mandos infrarrojos
4) Rutina de interrupción por cambio de altos del PORTB, primero hago una máscara
estado para descartar el nibble bajo del PORTB, una
vez he hecho esto comparo si los bits del
Lo que hago en esta rutina es leer el estado nibble alto del PORTB están a 1 (ninguna
del teclado al inicio del programa para tecla pulsada) o no lo están (alguna tecla
implementar una pequeña contraseña. pulsada), si no están todos a 1 procedo a
Cuando llega la interrupción quiere decir que hacer la lectura del PORTB y retorno el valor
hubo un cambio de estado en los 4 pines de las teclas que he apretado.
#INT_RB
void rb_interrupt(){
disable_interrupts(global); // Deshabilitamos las interrupciones
delay_ms(100); // Esperamos 100 ms para no tener ruido
lectura_portb=PORTB; //
lectura_portb&=0xF0; // Nos quedamos con los bits altos
if(!(lectura_portb==0xF0)){ // Comprobamos si se ha pulsado una tecla
/ / página 0x19
.receptor de mandos infrarrojos
/ / página 0x1A
..sistemas de control
En esta primer parte del artículo, se pretende dar a conocer los conceptos básicos acerca de los
controladores, y hacer un énfasis sobre los controladores PID. No se enfocará puntualmente la
parte de aplicación, pero si se realizará un ejemplo simple para que las personas que recién
comenzamos con esto del control, tengamos algo de teoría respecto al control y no solo a la
aplicación.
// por: Miguel A. Lopez O. //
[email protected]
/ / página 0x1C
.control P.I.D. nivel básico
/ / página 0x1D
.control P.I.D. nivel básico
/ / página 0x1E
.control P.I.D. nivel básico
En los sistemas reales, se tiene que los Como se mencionó en la Introducción, las
cambios dentro del mismo sistema, no son operaciones básicas de un sistema de control
inmediatos, si no que toman cierto tiempo, son:
debido a la inercia del mismo proceso. En el Medición
momento de efectuarse el aumento de Decisión
temperatura: Acción
/ / página 0x1F
.control P.I.D. nivel básico
/ / página 0x20
.control P.I.D. nivel básico
Io : Valor de salida del controlador para el Este tipo de controlador no se utiliza solo, si
valor de referencia, es decir, cuando el error no en combinación con los otros anteriores.
es cero.
Isal : Valor de salida cuando el error cambia
a una tasa d error(t)/dt .
/ / página 0x21
.control P.I.D. nivel básico
Tenemos entonces:
/ / página 0x22
.control P.I.D. nivel básico
Para aplicar este método, lo que se hace es Si queremos digitalizar nuestro controlador,
obtener la curva de reacción de nuestro hay que tener en cuenta que ya no se estaría
sistema a una entrada escalón y verificamos trabajando en tiempo continuo, si no que hay
que el sistema sea de orden 1. Como bien de por medio un tiempo entre la toma de una
vimos anteriormente, el sistema térmico, va a muestra y otra de nuestra variable, a este
presentar una respuesta típica de un sistema tiempo se le denomina Tiempo de Muestreo e
de orden 1 no todos los sistemas presentan influye en el comportamiento de nuestro
este tipo de respuesta o al menos se va a controlador.
acercar bastante. Su influencia radica en el concepto de
Hay unas formulas que se aplican para frecuencia, ya que, si el tiempo con el que
calcular los valores de las constantes: muestreo la señal es muy prolongado, la
señal que obtendré no será la real, si no que
estará modificada su frecuencia. Para saber a
que tiempo se debe muestrear se usa un
teorema denominado Teorema de Nyquist,
que en sí nos determina cuanto debe ser la
frecuencia mínima de muestreo en función de
Donde R = M / T la frecuencia de nuestra señal a muestrear.
/ / página 0x23
.control P.I.D. nivel básico
en donde:
T : Tiempo de muestreo
Ti : Tiempo integral
Td : Tiempo derivativo
K : Constante proporcional
k : 0,1,2,....
e() : error
m() : salida del controlador
/ / página 0x24
..tutorial
Tutorial
MPLAB C18
En esta segunda parte del tutorial de programación utilizando el compilador C18, trataremos
como son almacenados los datos en la memoria, arreglos de variables, declaración y definición
de funciones, y como siempre algunos ejemplos. A trabajar!
// por: Casanova Alejandro //
[email protected]
/ / página 0x26
..mplab c18
p= k /2.0; // p = 2.5
p =(( float )k /2); // p = 2.5
/ / página 0x27
..mplab c18
/ / página 0x28
..mplab c18
/ / página 0x29
..mplab c18
Código:
/* ** Archivo con definicion de registros y bits del microcontrolador elegido */
# include <p18f2550 .h>
/* ** Include para realizacion de demoras ** */
# include <delays .h>
/* ** Configuracion de los Fuses del microcontrolador ** */
# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2
# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768
# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF
# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF
# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF
# pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF
# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF
# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFF
// Para controlar vizualizacion del Display .
unsigned char i, Unidad , Decena , Centena ;
const rom unsigned char Display7Seg [10]={0 x3F , 0x06 , 0x5B , 0x4F , 0x66 ,
0x6D , 0x7D , 0x07 , 0xFF , 0 x6F };
/* ** Declaracion de funcion a utilizar */
void Visualizacion ( void );
void main ( void ){
ADCON1 =0 x0F ;// Todos entrada / salida digitales .
TRISA =0 xF0 ;
TRISB =0 x00 ; // Todos como salida .
LATA =0 x00 ; // Comienza en 0
Unidad =0;
Decena =0;
Centena =0;
while (1){
// Llamamos funcion que actualiza displays .
Visualizacion ();
// Actualizamos cuenta .
++ Unidad ;
if( Unidad ==10){
Unidad =0;
++ Decena ;
if( Decena ==10){
Decena =0;
++ Centena ;
}
}
}
}
/ / página 0x2A
..mplab c18
/ / página 0x2B
..mplab c18
funcion. Las que se asemejan a funciones // Para no utilizar pin RW sacar comentario a
toman parametros mientras que las que se la siguiente linea .
asemejan a objetos no. //# define __LCD_DONT_WAIT
Su formato es el siguiente: # define LCD_PIN_E LATCbits . LATC4
# define LCD_PIN_RS LATCbits . LATC2
# define <identificador > <lista de tokens a # ifndef __LCD_DONT_WAIT
reemplazar > # define LCD_PIN_RW LATCbits . LATC3
# define <identificador >(< lista de # endif
parametros>)<lista de tokens a reemplazar >
// CCS
Ejemplos: #if defined ( __PCH__ )
char Buffer [512];
# define e 2.718258 # endif
# define LED LATBbits . LATB5 // C18
# define Suma_10 (x) {x +=10;} # ifdef __18CXX
# define Suma_Divide_10 (x) {(x +=10);( x # pragma udata =0 x100
/=10);} unsigned char Buffer [512];
# pragma udata
Nota: Se debe tener cuidado en la # endif
implementacion de esta directiva. Las que se // C30 y C32
asemejan a funciones, pueden tomar #if defined ( __C30__ ) || defined (
parametros pero no se comportan como una __PIC32MX__ )
funcion, ya que el preprocesador reemplaza unsigned char __attribute__ (( aligned (4)))
un texto por otro, lo cual conlleva al mayor Buffer [512];
uso de la memoria de programa. # endif
/ / página 0x2C
..mplab c18
Código
/* ** Archivo con definicion de registros y bits del microcontrolador elegido */
# include <p18f2550 .h>
/* ** Include para realizacion de demoras ** */
# include <delays .h>
/* ** Configuracion de los Fuses del microcontrolador ** */
# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2
# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768
# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF
# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF
# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF
# pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF
# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF
# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFF
/* ** Definiciones para preprocesador ** */
// Pin para control display visualizador de unidades .
# define DISPLAY_PIN_U LATAbits . LATA0
# define DISPLAY_PIN_D LATAbits . LATA1
# define DISPLAY_PIN_C LATAbits . LATA2
# define DISPLAY_TRIS_U TRISAbits . TRISA0 //
# define DISPLAY_TRIS_D TRISAbits . TRISA1
# define DISPLAY_TRIS_C TRISAbits . TRISA2
// Puerto para enviar data a displays .
# define DISPLAY_DATA LATB
# define DISPLAY_TRIS_DATA TRISB
/* ************************************** */
// Para controlar vizualizacion del Display .
unsigned char i, Unidad , Decena , Centena ;
const rom unsigned char Display7Seg [10]={0 x3F , 0x06 , 0x5B , 0x4F , 0x66 ,
0x6D , 0x7D , 0x07 , 0xFF , 0 x6F };
/* ** Declaracion de funcion a utilizar */
void Visualizacion ( void );
void main ( void ){
ADCON1 =0 x0F ;// Todos entrada / salida digitales .
DISPLAY_TRIS_DATA =0 x00 :
DISPLAY_TRIS_U =0;
DISPLAY_TRIS_D =0;
DISPLAY_TRIS_C =0;
DISPLAY_PIN_U =0;
DISPLAY_PIN_D =0;
DISPLAY_PIN_C =0;
Unidad =0;
Decena =0;
Centena =0;
/ / página 0x2D
..mplab c18
while (1){
// Llamamos funcion que actualiza displays .
Visualizacion ();
// Actualizamos cuenta .
++ Unidad ;
if( Unidad ==10){
Unidad =0;
++ Decena ;
if( Decena ==10){
Decena =0;
++ Centena ;
}
}
}
}
void Visualizacion ( void ){
for (i =1;i <=20;++ i){
// Cargamos en puerto valor de la tabla indicado por Unidad .
DISPLAY_DATA = Display7Seg [ Unidad ];
DISPLAY_PIN_U =1; // Enciendo Display Unidad .
Delay1KTCYx (5); // Demora de 5 ms (XT =4 MHz )
DISPLAY_PIN_U =0;
DISPLAY_DATA = Display7Seg [ Decena ];
DISPLAY_PIN_D =1;
Delay1KTCYx (5);
DISPLAY_PIN_D =0;
DISPLAY_DATA = Display7Seg [ Centena ];
DISPLAY_PIN_C =1;
Delay1KTCYx (5);
DISPLAY_PIN_C =0; // Apago Display Centena .
}
}
Código:
/* ** Archivo con definicion de registros y bits del microcontrolador elegido */
# include <p18f2550 .h>
/* ** Includes ** */
# include <delays .h>
# include <xlcd .h>
/* ** Configuracion de los Fuses del microcontrolador ** */
# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2
# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768
# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF
# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF
# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF
/ / página 0x2E
..mplab c18
Tutorial ASM
...desde 0
Todo programa consiste en una serie de instrucciones, que sirven para indicarle al dispositivo
que es lo que debe hacer para lograr nuestro cometido. Los PIC de la gama media disponen de
un repertorio de 35 instrucciones, que debemos conocer tan bien como la palma de nuestra
mano y a las que dedicamos esta segunda parte del Tutorial.
// por: David (Leon Pic) //
[email protected]
/ / página 0x31
.tutorial asm
/ / página 0x32
.tutorial asm
/ / página 0x33
.tutorial asm
ADDLW ANDWF
Suma un valor designado por el Realiza la operación AND entre W y un
programador al registro W registro designado por el programador. El
destino de esta operación lo elije el
ADDLW .128 programador.
/ / página 0x34
.tutorial asm
No afecta a ningún Bit del registro Status. Normalmente, continuando las ins
trucciones BTFSS y/o BTFSC va un GOTO o
BTFSC CALL pero no la he puesto porque aún no se
Salta un línea si el bit de un registro es explicaron estas instrucciones.
cero. El bit debe ser indicado por el
programador. CALL
Se dirige a una dirección de la memoria de
BTFSC TEMP,5 programa designado por el programador. En
BCF PORTA,0 otras palabras, se utiliza para dirigirse a una
BSF PORTB,0 rutina o tarea. Su principal ventaja es que una
vez que finalizó la tarea, vuelve al punto
Caso 1: siguiente desde dónde se llamo.
TEMP vale B'00011110'. El CP analizará
solo el Bit 5 del registro TEMP, como es 0, CALL ESC_PORTB
salta la instrucción BCF PORTA,0 y ejecuta
la siguiente línea que es BSF PORTB,0 y No afecta a ningún bit del registro Status.
continua haciendo la instrucción.
/ / página 0x35
.tutorial asm
1.
STACK = vacío
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230
/ / página 0x36
.tutorial asm
/ / página 0x37
.tutorial asm
/ / página 0x38
.tutorial asm
Pagesel es una instrucción del MPASM que Antes de la instrucción W vale B'00000111'.
genera dos instrucciones: un bcf/bsf Después de la instrucción W vale
PCLATH,3 y un bcf/bsf PCLATH,4. El B'00000000'.
software ensamblador selecciona auto
máticamente la instrucción bcf o bsf según el Afecta a:
banco en el cual se encuentra la etiqueta (o Z Se pone a 1
posición de memoria) que se le especifique.
En el caso anterior pagesel cruzo generaría CLRWDT
estas dos instrucciones: Borra al WDT. La forma en que lo hace,
pone en 0 al mismo.
bsf PCLATH,3
bcf PCLATH,4 CLRWDT
/ / página 0x39
.tutorial asm
Si TEMP tenía guardado B'00111101' luego NOTA: Esta instrucción, también hay que
de ejecutar la instrucción TEMP vale elegirle el destino. En el caso que no se
B'11000010'. Nótese, que aquí también exprese, como en este caso, el MPLAB dará
podemos elegir el destino y esto nos deja por sentado que el resultado se guardará en
guardarlo en el registro W si así lo el registro F y no en W.
requerimos.
No afecta a ningún bit del registro STATUS.
Afecta a:
Z Se pone a 1 si la operación da 0 INCF
Incrementa en 1, o suma 1, el contenido de
DECF un registro elegido por el programador.
Decrementa en una unidad, o lo que es lo
mismo, resta 1 el contenido de un registro INCF INDF,F
/ / página 0x3A
.tutorial asm
Afecta a: Afecta a:
Z se pone a 1 si la operación da 0 Z Se pone a 1 si el resultado de la operación
es 0
IORWF
Realiza la operación lógica OR entre el Anteriormente, habíamos dicho que esta
registro W y un registro elegido por el instrucción se la puede tomar como
programador. La operación es W OR F. verificación para saber si se guardó con el
mismo valor que tenía, el bit Z se pone a 1 si
IORWF PORTC,F el valor es igual al que tenía cargado.
/ / página 0x3B
.tutorial asm
Extendiendo el ejemplo:
/ / página 0x3C
.tutorial asm
datos a un LCD, así que esta rutina tendrá A la hora de utilizar estas dos instrucciones,
implementada RETURN hay que prestarle atención al bit C del registro
STATUS. La razón de esto, es porque la
RETURN rotación se hace a través del bit C.
No afecta a ningún bit del registro STATUS Supongamos que tenemos lo siguiente:
BIT C = 0
RLF TEMP = B'00010000'
Rota hacia la izquierda los bit de un registro
seleccionado por el programador. El destino Ejecutamos la instrucción RRF y TEMP vale
de la operación se puede elegir. Cada B'00001000'. O si ejecutamos la instrucción
rotación equivale a multiplicar por 2 si el bit C RLF TEMP vale B'00100000'
del registro STATUS es 0.
Pero si ahora tenemos:
RLF PORTC,F BIT C = 1
TEMP = B'00010000'
Si antes de la instrucción PORTC vale
B'00001000', después de la instrucción vale Ejecutamos la instrucción RRF y TEMP vale
B'00010000'. Si se hubiera elegido como B'10001000'. O si ejecutamos la instrucción
destino W, PORTC después de la instrucción RLF TEMP vale B'00100001'
continua valiendo B'00001000' y W vale
B'00010000' Vemos como rotan los bit dependiendo del
valor del bit C. Pero anteriormente, habíamos
Afecta a: dicho que estas dos instrucciones afectan al
C se pone a 1 si hubo acarreo bit C. La actualización del bit C, lo hace
después de la rotación. Lo vemos con un
RRF ejemplo:
Rota hacia la derecha los bits de un registro
seleccionado por el programador. El destino MOVLW B'10001001'
de la operación se puede elegir. Cada MOVWF temp
rotación equivale a dividir por 2 si el bit C del BCF STATUS,C ;PONEMOS A 0 AL BIT C
registro STATUS es 0. RLF temp,F ;ROTAMOS A LA IZQUIERDA
RRF PORTB,F
Al ejecutar este programa, nos dará lo
Si antes de la instrucción PORTB vale siguientes resultados:
B'10000000' después de la instrucción TEMP = B'00010010'
PORTB vale B'0100000'. Si se hubiera BIT C = 1
elegido como destino W, PORTB después de
la instrucción continua valiendo B'10000000' y Y para ver la diferencia vemos lo siguiente:
W vale B'01000000'
MOVLW B'00000001'
Afecta a: MOVWF temp
C se pone a 1 si hubo acarreo BCF STATUS,C ;PONEMOS A 0 AL BIT C
RLF temp,F ;ROTAMOS A LA IZQUIERDA
1110101011101100110110110001100100
11100101111001101100100100110010010010010001111011
00110001001100011001001
/ / página 0x3D
.tutorial asm
Si antes de la instrucción W vale .23 Cabe pensar que puede ser una instrucción
después de la instrucción W vale .3 Para de muy poco uso, pero todo lo contrario si se
saber si el resultado es negativo o positivo, utilizan con las interrupciones. Microchips
hay que chequear el bit C del registro Status. recomienda su utilización a la hora de salvar
Si hay acarreo, el resultado es negativo, y por el contexto y restaurarlo en una interrupción
el contrario, si no hay acarreo es positivo. ya que no modifica el registro STATUS.
Cuando trabajemos con las interrupciones, se
Afecta a: verá que es muy recomendable salvar el
Z se pone a 1 si el resultado es 0 registro STATUS y W en la RAM para luego
DC se pone a 0 si hay acarreo del bit del 4 al restaurarlos. Si utilizamos la instrucción
5 bit del registro (recordemos que en la resta, MOVF, es afectado el bit Z, perdiendo su
es distinto a la suma, por eso, se pone a 0 si estado original en el momento de la
hubo acarreo). interrupción. Esto se soluciona, utilizando la
C se pone a 0 si hubo acarreo (recordemos instrucción SWAPF.
que en la resta, es distinto a la suma, por
eso, se pone a 0 si hubo acarreo). No se preocupe si no lo entiende por ahora.
Lo entenderá cuando veamos ejemplos de
interrupciones.
/ / página 0x3E
.tutorial asm
k: Campo Literal, constante o etiqueta. f: Dirección Registro. b: Dirección de Bit en un registro de 8 bits.
W: Registro de Trabajo. d: Selección de Destino. 0 almacena resultado en W; 1 almacena resultado en f. Por defecto d=1.
/ / página 0x3F
..proyectos
/ / página 0x41
.generar señal vga con un pic
31,75 millonésimas de
segundo para dibujar cada
linea. Por razones
derivadas del diseño, el
Figura 2: Diagramas de tiempos. trazo de la linea solo es
/ / página 0x42
.generar señal vga con un pic
visible durante 25.17 us. (ver figura 2). En ese través del divisor formado por los resistores y
lapso de tiempo tenemos que obtener los diodos. Victor sugiere utilizar diodos 1N5819
datos correspondientes a cada píxel y colocar funcionan perfectamente, como puedes ver
el valor correspondiente a cada linea en las fotos pero en las pruebas que hemos
analógica (R, G, B), una vez para cada píxel. realizado pudimos comprobar que incluso un
Si pensamos dibujar 640 píxeles, solo común y modesto 1N4148 sirve. Esto nos
tenemos permite duplicar la cantidad de colores, ya
que disponemos de 8 colores “vivos” y 8
Tiempo por píxel = 25,17 us / 640 = colores “lavados”. En la practica como se ve
0.039328125us (39,33 ns) en la figura 4 son solo 15, ya que dos de
ellos corresponden al negro.
El primer problema que enfrentamos es la
generación de los pulsos de sincronismo.
Necesitamos un pulso bajo de una duración
de 3,9 us cada 31,75us., que será nuestro Figura 4: Tenemos 15 colores diferentes, sin
pulso de sincronismo horizontal. Y durante la necesidad de conversores DA externos.
generación de las últimas dos lineas de la
imagen lineas 524 y 525 necesitamos un El pin “data”, en la parte superior de la
pulso también negativo que sirva como figura 3, se encarga de encender o apagar
sincronismo vertical. Victor recomienda utilizar cada píxel. Resumiendo, para generar un
una interrupción para generar el pulso de píxel necesitamos ajustar el valor de los pines
sincronismo horizontal. Para generar los R, G, B e Y, y poner el pin “data” en el estado
valores adecuados de tensión en las lineas correcto. Si vamos a mostrar solo texto, no
analógicas correspondientes a los colores necesitamos cambiar el color de cada uno de
rojo, verde y azul, puede utilizarse un los píxeles que componen la linea, sino que
esquema como el propuesto en pic24.ru: basta con hacer el cambio cada vez que el
trazo del haz de electrones pasa de un
carácter a otro. Esto significa que disponemos
de un poco más de tiempo para controlar la
señal “data”, que es la que en definitiva va a
determinar nuestra resolución horizontal.
Victor, en el trabajo mencionado, explica todo
esto en detalle y proporciona un programa
completo (código fuente incluido) que, junto al
circuito de la figura 5, permite escribir 30 filas
de 30 columnas de texto, con 16 colores
posibles para cada carácter, sobre fondo
negro, en un monitor VGA estándar.
Figura 3: 4 pines del PIC bastan para generar el
color de cada píxel. Los caracteres a mostrar se envían al
dispositivo mediante el bus SPI. La velocidad
Tres pines con salidas tipo “open drain” máxima de transmisión de datos es de
pueden “encender” o “apagar” las lineas 250Kbps, y los comandos que acepta se
correspondientes al rojo, verde y azul. Son 8 muestran en la tabla 1.
combinaciones que proporcionan 8 colores
diferentes. El cuarto pin en cuestión (Y) Todo esto está implementado en una librería
proporciona un rudimentario mecanismo de que puede descargarse junto al resto del
control de brillo. Cuando esa salida está en código fuente, junto a una explicación más
nivel bajo, el transistor se cierra y los voltajes detallada de cada comando, desde
presentes en los nodos etiquetados como http://www.pic24.ru/lib/exe/fetch.php/osa/articl
VGAR, VGAG y VGAB se modifiquen a es/terminal.rar
/ / página 0x43
.generar señal vga con un pic
/ / página 0x44
.generar señal vga con un pic
El conector VGA
/ / página 0x45