jueves, 6 de marzo de 2014

Sumador en ensamblador PIC16F84A

DESCRIPCIÓN:
Lo que se hace en esta práctica es un sumador. El programa se hizo en ensamblador con ayuda del software MPLABX para obtener el *.hex. Éste le va a sumar 15 al dato que se encuentre en el PORTA y se mostrara en el PORTB.


CIRCUITO:


Este es el circuito básico que se usó. En lugar de una barra de LEDs, se usaron LEDs individuales. El RESET o MCLR va conectado a voltaje. Los pines 15 y 16 van conectados al cristal de cuarzo de 4 MHz, junto con los capacitores 22 pF. Los pines de RA van conectados a un dipswitch, al cual se conectan resistencias de 10 Kohms. Los pines RB se conectaron a resistencias de 330 Ohms y de ahí a los LEDs

MATERIAL:
-Microcontrolador PIC16F84A
-8 LEDs
-8 resistores de 330 ohms
-1 dipswitch de 8
-5 resistores de 10 Kohms
-Cristal de cuarzo de 4 MHz
-2 capacitores de 22 pF
-Alambres
-Protoboard
-Fuente y sus cables

CODIGO DEL PROGRAMA:
;---------------------------------------------------------------------------
;Descripcion: Lea un dato por el puerto A PORTA, sumele una constante igual 15.
; Guardelo en una variable, muestrelo en el puerto B PORTB.

;
;Funciona: version 1.0 no
;---------------------------------------------------------------------------
;Configuracion MPLABX
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

K_Const EQU 0x0F ;definiendo una constante
V_Dato EQU 0x0C ;definiendo una variable
;---------------------------------------------------------------------------
;Zona de configuracion del PIC
ORG 0x00
Inicio bsf STATUS,RP0 ;Accesando al banco 1
clrf TRISB ;PORTB como salida
movlw 0xFF ;cargando la cte
movwf TRISA ;puerto A como salida
bcf STATUS,RP0 ;acceso al banco 0
;---------------------------------------------------------------------------
Main movf PORTA,W ;leer el dato
addlw K_Const ;suma el dato mas 15
movwf V_Dato ;guarda el resultado
movwf PORTB ;muestra el resultado
goto Main ;fin del programa y $=salta a el mismo
END
;------------------------------------------------------------------------------------------

TEORÍA SOBRE INSTRUCCIONES DE CARGA:
Las instrucciones de transferencias de datos son típicas de todos los procesadores su misión es transferir el contenido de un registro fuente (f) a un registro destino (d) o bien cargar el destino con una constante. En los microcontroladores PIC todos los datos residen en posiciones de la memoria de datos en el registro de trabajo W.
En la explicación de estas instrucciones se emplea muchas veces una nomenclatura especial muy simple basada en paréntesis y flechas. Con los paréntesis se destaca que se trata del “contenido” de las posiciones de memoria y la flecha de dirección de la transferencia de los datos.
Hay 5 instrucciones de carga propiamente dichas:
clrw: (clear W) El contenido del registro W se borra, es decir, se carga con b’00000000’ y el flag z se activa a “1”. Esta instrucción también se podría considerar como aritmética.
clrf f: (clear f) El contenido del registro ‘f’ se borra, se carga con b’00000000’ y el flag z se activa con ‘1’. Esta accion tambien se podria considerar como aritmetica.
movlw k: (Move Literal to W) El registro W se carga con el valor de los 8 bits de la constante ‘k’. Ningun flag del estado del registro de estado es afectado.
movf f,d: (move f) El contenido del registro ’f’ se carga en el registro destino dependiendo del valor de ‘d’. Si ‘d’ = 0 el destino es el registro W, si ‘d’ = 1 el destino es el propio registro ‘f’. El flag z del registro STATUS queda afectado: z se activa a ‘1’ si el resultado de la operación es cero.
movwf f: (Move W to f) Carga el contenido del registro W al registro ‘f’. Ningun flag del registro de estado es afectado.

miércoles, 5 de marzo de 2014

PIANO DIGITAL CON AT89LP3240/6440

// INSTITUTO DE INGENIERIA Y TECNOLOGIA (IIT/UACJ) //
// SISTEMAS CON MICROPROCESADOR // IVAN MENDOZA 103405
#include <at89lp6440.h>

void config (void)
{ //--------------- CONFIGURACION DE PUERTOS ----------------------//
//entradas
P1M0=0XFF;    //TECLAS TONOS DO-RE-MI-FA-SOL-LA-SI-SI#
P1M1=0X00;

P3M0=0X0E;    //SELECCION DE OCTAVA 0-1-2-3-4-5
P3M1=0X10;

//salidas
P0M0 =0x00;    //LED TONOS DO-RE-MI-FA-SOL-LA-SI-SI#
P0M1 =0xFF;

P2M0 =0x00;   //LED OCTAVAS 0-1-2-3-4-5
P2M1 =0xFF;
//--------------------------------------------------------------//
// TIMER E INTERRUPCIONES
TMOD=0x10;
P3_7=1;
EA=1;
ET1=1;
TR1=0;
TCONB=0x00;
  CLKREG=0x00;
}
///////////////////// FUNCIONES TONOS /////////////////////////////////
void DO(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
{
RH1=0XA6;
RL1=0X33;
TR1=1;
}
else if(P3_3==0&&P3_2==0&&P3_1==1)
{
P2_7=1;
RH1=0XD3;
RL1=0X19;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{
P2_6=1;
RH1=0XE2;
RL1=0X11;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{
P2_5=1;
RH1=0XE9;
RL1=0X8C;
TR1=1;
}
else if (P3_3==1&&P3_2==0&&P3_1==0)
{
P2_4=1;
RH1=0XEE;
RL1=0X6A;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{
P2_3=1;
RH1=0XF1;
RL1=0X08;
TR1=1;
}
P3_4=0;
TR1=0;
}
void RE(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XB0;
 RL1=0X47;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XD8;
RL1=0X23;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XE5;
RL1=0X6C;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XEC;
RL1=0X11;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF0;
RL1=0X0E;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF2;
RL1=0XB6;
TR1=1;
}

P3_4=0;
TR1=0;
}
void MI(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XB8;
 RL1=0XFA;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XDC;
RL1=0X7D;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XE8;
RL1=0X53;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XEE;
RL1=0X3E;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF1;
RL1=0XCB;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF4;
RL1=0X29;
TR1=1;
}

P3_4=0;
TR1=0;
   


}
void FA(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XBC;
RL1=0XD8;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XE9;
RL1=0X9C;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XEF;
RL1=0X35;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XF2;
RL1=0X95;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF4;
RL1=0XCE;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF6;
RL1=0X08;
TR1=1;
}

P3_4=0;
TR1=0;
   


}
void SOL(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XC4;
RL1=0X35;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XE2;
RL1=0X1A;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XEC;
RL1=0X11;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XF1;
RL1=0X0D;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF4;
RL1=0XCE;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF6;
RL1=0X08;
TR1=1;
}

P3_4=0;
TR1=0;
   


}
void LA(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XCA;
RL1=0XBB;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XE5;
RL1=0X5D;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XEE;
RL1=0X3E;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XF2;
RL1=0XAE;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF5;
RL1=0X58;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF7;
RL1=0X1E;
TR1=1;
}

P3_4=0;
TR1=0;
   


}
void SI(void){
 if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XD0;
RL1=0X8D;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XE8;
RL1=0X46;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XF0;
RL1=0X2E;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XF4;
RL1=0X23;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF6;
RL1=0X82;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF8;
RL1=0X17;
TR1=1;
}
P3_4=0;
TR1=0;
   


}
void SII(void){
if(P3_3==0&&P3_2==0&&P3_1==0)
 {
RH1=0XD3;
RL1=0X2F;
TR1=1;
    }
else if(P3_3==0&&P3_2==0&&P3_1==1)
{P2_7=1;
RH1=0XE9;
RL1=0X97;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==0)
{P2_6=1;
RH1=0XF1;
RL1=0X0F;
TR1=1;
}
else if(P3_3==0&&P3_2==1&&P3_1==1)
{P2_5=1;
RH1=0XF4;
RL1=0XCB;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==0)
{P2_4=1;
RH1=0XF7;
RL1=0X09;
TR1=1;
}
else if(P3_3==1&&P3_2==0&&P3_1==1)
{P2_3=1;
RH1=0XF8;
RL1=0X87;
TR1=1;
}

P3_4=0;
TR1=0;
   


}


//////////////////////////////////////////////////////////////////////

// INICIO DE PROGRAMA //
void main (void)
{
  config(); // llamamos a la funcion para cargar configuracion
while(1)
{ P0=0;
P2=0;
// int tono=P1;    //tonos de la octava do-re-mi-fa-sol-la-si-si#
switch(P1)
{
case 1://DO
P0_0=1; DO();
break;

case 2://RE
P0_1=1; RE();
break;

case 4://MI
P0_2=1; MI();
break;

case 8://FA
P0_3=1; FA();
break;

case 16://SOL
P0_4=1; SOL();
break;

case 32://LA
P0_5=1; LA();
break;

case 64://SI
P0_6=1; SI();
break;

case 128://SI#
P0_7=1; SII();
break;

case 0:
P3_4=0;
break;
}
}
}
void int_timer_1(void) interrupt 3
{
P3_4=~P3_4;//conmutacion
}