Sunteți pe pagina 1din 14

Diagrama de Bloques.

Diagrama Circuital.
CODIGO DEL TALLER 3.
/***********************************
* TALLER 3: PERIFERICOS *
* LEO DANNY SANCHEZ ARCILA *
* JUAN MANUEL GIRON *
************************************/

#include <hidef.h> /* for EnableInterrupts macro */


#include "derivative.h" /* include peripheral declarations */

const byte NVOPT_INIT @0x0000FFBF = 0x02; // vector redirect, flash


unsecure
const byte NVPROT_INIT @0x0000FFBD = 0xFA; // 0xFC00-0xFFFF are
protected
//Lineas E/S que utiliza la pantalla LCD
#define RS PTAD_PTAD4 //Se pueden asignar en cualquier línea del MCU
#define E PTAD_PTAD5
#define DATOS PTAD //Solo se pueden asignar a la parte baja de algún
puerto

//Arreglo para el mensaje del primer renglón


const unsigned char MSG1[]="TEMPORIZADOR";
//Arreglo para el mensaje del segundo renglón
const unsigned char MSG2[]="TIEMPO=1s";
//Arreglo para los caracteres número
const unsigned char MSG3[]="0123456789";
//Arreglo para el mensaje de error.
const unsigned char MSG4[]="ERROR";

extern void _Startup(void);

//Variables para la función de retardo


unsigned char K1@0xB0,K2@0xB1,CONT@0xB2;

//RETARDO ANTIREBOTE DE 100MS


void retardo2(void) {
asm {
clr CONT
LAZO: mov #200,K1
LAZO1: mov #170,K2 ; Lazo externo (K1)
LAZO2: dbnz K2,LAZO2 ; Lazo interno (K2)
dbnz K1,LAZO1
inc CONT ; Código para controlar las
lda CONT ; 10 repeticiones.
cmp #10
bne LAZO
rts
}
}

// RETARDO DE 1 SEGUNDO PARA MOSTRAR EL ERROR.


void retardo1(void) {
asm {
clr CONT
LAZO: mov #200,K1
LAZO1: mov #170,K2 ; Lazo externo (K1)
LAZO2: dbnz K2,LAZO2 ; Lazo interno (K2)
dbnz K1,LAZO1
inc CONT ; Código para controlar las
lda CONT ; 100 repeticiones.
cmp #100
bne LAZO
rts
}
}

//Función de retardo para la función TECLADO


//Ajustada para 10ms. Ecuación de tiempo -> Tret=(10+11K1+7K1K2)T
void retardo(void) {
asm {
mov #200,K1
LAZO1: mov #170,K2 ; Lazo externo (K1)
LAZO2: dbnz K2,LAZO2 ; Lazo interno (K2)
dbnz K1,LAZO1
rts
}
}

//Función para un escaneo de un teclado 4x3


//Retorna 255, si ninguna tecla fue presionada
char TECLADO(void) {
//Variable de para el ID de tecla presionada
unsigned char ID_TECLA=255;

//Proceso de escaneo por filas


PTBD=0b1110; //Fila 1,teclas 1,2,3
retardo(); //Espera de 10ms
if (PTBD_PTBD4==0)ID_TECLA=1;
else if (PTBD_PTBD5==0)ID_TECLA=2;
else if (PTBD_PTBD6==0)ID_TECLA=3;
else {
PTBD=0b1101; //Fila 2,teclas 4,5,6
retardo();
if (PTBD_PTBD4==0)ID_TECLA=4;
else if (PTBD_PTBD5==0)ID_TECLA=5;
else if (PTBD_PTBD6==0)ID_TECLA=6;
else {
PTBD=0b1011; //Fila 3,teclas 7,8,9
retardo();
if (PTBD_PTBD4==0)ID_TECLA=7;
else if (PTBD_PTBD5==0)ID_TECLA=8;
else if (PTBD_PTBD6==0)ID_TECLA=9;
else {
PTBD=0b0111; //Fila 4,teclas *,0,#
retardo();
if (PTBD_PTBD4==0)ID_TECLA=10;
else if (PTBD_PTBD5==0)ID_TECLA=0;
else if (PTBD_PTBD6==0)ID_TECLA=11;
}
}
}
return ID_TECLA;
}
//Función de retardo de 1uz para manejo de la pantalla LCD
//Ecuación de tiempo -> Tret=(10+7K1)T
void ret_lcd0(void) {
asm {
mov #2,K1 ; Carga constante de retardo 1
LAZO: dbnz K1,LAZO ; Ciclo interno
rts
}
}

//Función de retardo de 2ms para manejo de la pantalla LCD


//Ecuación de tiempo -> Tret=(10+11K1+7K1K2)T
void ret_lcd1(void) {
asm {
mov #100,K1 ; Carga constante de retardo 1
LAZO1: mov #67,K2 ; Carga constante de retardo 2
LAZO2: dbnz K2,LAZO2 ; Ciclo interno
dbnz K1,LAZO1 ; Ciclo externo
rts
}
}

//Función de retardo de 15ms para manejo de la pantalla LCD


//Ecuación de tiempo -> Tret=(10+11K1+7K1K2)T
void ret_lcd2(void) {
asm {
mov #220,K1 ; Carga constante de retardo 1
LAZO1: mov #233,K2 ; Carga constante de retardo 2
LAZO2: dbnz K2,LAZO2 ; Ciclo interno
dbnz K1,LAZO1 ; Ciclo externo
rts
}
}

//Función para enviar datos a la pantalla LCD.


//Para enviar un COMANDO, la entrada tipo debe ser 0
//Para enviar un CARACTER, la entrada tipo debe ser 1
void envio_lcd(unsigned char dato,unsigned char tipo) {
//Envia nibble parte alta del comando
DATOS=dato>>4;
RS=tipo; //Indica datos (pin RS)
ret_lcd0();
E=1; //Pulso de habilitación(pin E)
ret_lcd0();
E=0;
//Envia nibble parte baja del comando
DATOS=dato&0x0F;
RS=tipo; //Indica datos (pin RS)
ret_lcd0();
E=1; //Pulso de habilitación(pin E)
ret_lcd0();
E=0;
ret_lcd1(); //Espera de 2ms para la ejecución del dato
}

//Función para la inicialización de la pantalla LCD


void ini_lcd(void) {
//Variable contadora
unsigned char i;

//Espera de 30ms aprox. para encendido de la pantalla LCD


DATOS=0x00;
ret_lcd2();
ret_lcd2();
//Envío de tres veces el comando de inicialización
for(i=0;i!=3;i++) {
DATOS=0x03; //Comando de inicio
E=1; //Pulso de habilitación(pin E)
ret_lcd0();
E=0;
ret_lcd1(); //Espera de 2ms
}
DATOS=0x02; //Comando de inicio
E=1;
ret_lcd0();
E=0;
ret_lcd1(); //Espera de 2ms
envio_lcd(0x28,0); //Envía comando FUNCTION SET (4 bits, 2 líneas y
5X7)
envio_lcd(0x0C,0); //Envía comando DISPLAY ON/OFF (Encendido y sin
cursor)
envio_lcd(0x01,0); //Envía comando CLEAR DISPLAY
envio_lcd(0x06,0); //Envía comando ENTRY MODE (Incrementa cursor)
}
/********************************
* FUNCION PRINCIPAL *
********************************/
void main(void) {
unsigned char i,AUX1,ESTADO=0,TECLA,AUX2,CONT=0,UNID,DECE;

//CONFIGURACION HARDWARE DEL MCU.


SOPT1 = 0x20; //DESACTIVA COP
PTBDD = 0x0F; // CONFIGURA PUERTOS DEL TECLADO.(FILAS)
PTBPE = 0x70; //RESISTENCIAS PULL UP PARA EL TECLADO.(COLUMNAS)
PTADD = 0x3F; //CONFIGURO COMO SALIDAS LOS BITS DEL PUERTO A DEL 0
AL 6.
PTAD = 0x00; // PONGO EN 0 LOS BITS DEL PUERTO A.
PTCDD=0x01; //CONFIGURA EL BIT 0 DEL PUERTO C COMO SALIDA (LED).
PTCDS=0x01; //REGISTRO DE ALTA CORRIENTE.

//INICIALIZA LA PANTALLA.
ini_lcd();

//ENVIA PRIMER MENSAJE


for(i=0;i!=12;i++){
envio_lcd(MSG1[i],1);
}

envio_lcd(0xC0,0); //SE UBICA EN EL RENGLON 2 POSICION 1.

//ENVIA SEGUNDO MENSAJE


for(i=0;i!=9;i++){
envio_lcd(MSG2[i],1);
}
for(;;){
TECLA = TECLADO();
switch(ESTADO){
case 0:
//ENVIA EL PRIMER DIGITO.
if(TECLA<=6){
envio_lcd(0xC7,0);
for(i=0;i!=2;i++){
envio_lcd(' ',1);
}
envio_lcd(0xC7,0);
AUX1 = TECLA;//GUARDA EL PRIMER DIGITO EN UNA
VARIABLE
envio_lcd(MSG3[TECLA],1);
ESTADO = 1;
envio_lcd(0xC8,0);
for(i=0;i!=1;i++){
envio_lcd('s',1);
}
retardo1();//RETARDO DE 1 SEGUNDO PARA EVITAR
REBOTE.
}
break;
case 1:
//ENVIA EL SEGUNDO DIGITO
if(TECLA <= 9){
envio_lcd(0xC8,0);
for(i=0;i!=1;i++){
envio_lcd(' ',1);
}
envio_lcd(0xC9,0);
for(i=0;i!=1;i++){
envio_lcd('s',1);
}
envio_lcd(0xC8,0);
AUX2 = TECLA;//GUARDA EL SEGUNDO DIGITO EN UNA
VARIABLE
envio_lcd(MSG3[TECLA],1);
retardo2();//RETARDO DE 100ms PARA ESPERAR.
AUX1 = AUX1 * 10;//OPERACION NECESARIA PARA
GUARDAR # EN UNA SOLA VARIABLE(AUX1=2 -> AUX1=20)
CONT = AUX1 + AUX2;//SE SUMAN AMBAS
VARIABLES(AUX1=20 Y AUX2=3 -> CONT=20+3=23)...
ESTADO = 3;
}
//SI SE QUIERE BORRAR EL PRIMER NUMERO DIGITADO
if(TECLA == 10){
ESTADO = 2;
}
//TEMPORIZAR VALORES MENORES A 10 SEGUNDOS
if(TECLA == 11){
CONT = AUX1;
if(CONT == 0){
ESTADO = 4;
}else {
for(i=CONT;i>0;i--){
PTCD_PTCD0 = 1;
UNID = i%10;
envio_lcd(0xC7,0);
envio_lcd(MSG3[UNID], 1);
retardo1();
}
envio_lcd(0xC7,0);
for(i=0;i!=1;i++){
envio_lcd('0',1);
}
PTCD_PTCD0 = 0;
retardo1();
envio_lcd(0xC7,0);
for(i=0;i!=1;i++){
envio_lcd('1',1);
}
envio_lcd(0xC8,0);
for(i=0;i!=1;i++){
envio_lcd('s',1);
}
envio_lcd(0xC9,0);
for(i=0;i!=1;i++){
envio_lcd(' ',1);
}
ESTADO = 0;
}
}
break;
case 2:
//BORRA Y PONE EN 1 SEGUNDO
if(TECLA == 10){
envio_lcd(0xC7,0);
for(i=0;i!=1;i++){
envio_lcd('1',1);
}
envio_lcd(0xC8,0);
for(i=0;i!=1;i++){
envio_lcd('s',1);
}
envio_lcd(0xC9,0);
for(i=0;i!=1;i++){
envio_lcd(' ',1);
}
ESTADO = 0;
}
break;
case 3:
if(TECLA == 10){
ESTADO = 2;
}
//TEMPORIZADOR
if(TECLA == 11){
//REDIRECCIONA AL ESTADO 3 PARA MOSTRAR ERROR.
if(CONT > 60 || CONT <= 1){
retardo2();
ESTADO = 4;
}else {
for(i=CONT;i>0;i--){
PTCD_PTCD0 = 1;
UNID = i%10;
DECE = i/10;
envio_lcd(0xC7,0);
envio_lcd(MSG3[DECE], 1);
envio_lcd(MSG3[UNID], 1);
retardo1();
}
envio_lcd(0xC7,0);
for(i=0;i!=2;i++){
envio_lcd('0',1);
}
PTCD_PTCD0 = 0;
retardo1();
envio_lcd(0xC7,0);
for(i=0;i!=1;i++){
envio_lcd('1',1);
}
envio_lcd(0xC8,0);
for(i=0;i!=1;i++){
envio_lcd('s',1);
}
envio_lcd(0xC9,0);
for(i=0;i!=1;i++){
envio_lcd(' ',1);
}
ESTADO = 0;
}
}
break;
case 4:
//MUESTRA LA PALABRA ERROR EN CASO DE QUE LA CANTIDAD
//SUPERE LOS 60 SEGUNDOS.
envio_lcd(0xC0,0);
for(i=0;i!=10;i++){
envio_lcd(' ',1);
}
envio_lcd(0xC4,0);
for(i=0;i!=5;i++){
envio_lcd(MSG4[i],1);
}
retardo1();
envio_lcd(0xC0,0);
for(i=0;i!=9;i++){
envio_lcd(MSG2[i],1);
}
ESTADO = 0;
break;
}
}
}

//Redireccionamiento de vectores de interrupción


/*Dummy ISR */
interrupt void Dummy_ISR(void)
{
}

void (* volatile const _UserEntry[])()@0xFABC={


0x9DCC, // asm NOP(9D), asm JMP(CC)
_Startup
};

// redirect vector 0xFFC0-0xFFFD to 0xFBC0-0xFBFD


void (* volatile const _Usr_Vector[])()@0xFBC4= {
Dummy_ISR, // Int.no.29 RTC (at FBC4) (at FFC4)
Dummy_ISR, // Int.no.28 IIC (at FBC6) (at FFC6)
Dummy_ISR, // Int.no.27 ACMP (at FBC8) (at FFC8)
Dummy_ISR, // Int.no.26 ADC (at FBCA) (at FFCA)
Dummy_ISR, // Int.no.25 KBI (at FBCC) (at FFCC)
Dummy_ISR, // Int.no.24 SCI2 Transmit (at FBCE) (at FFCE)
Dummy_ISR, // Int.no.23 SCI2 Receive (at FBD0) (at FFD0)
Dummy_ISR, // Int.no.22 SCI2 Error (at FBD2) (at FFD2)
Dummy_ISR, // Int.no.21 SCI1 Transmit (at FBD4) (at FFD4)
Dummy_ISR, // Int.no.20 SCI1 Receive (at FBD6) (at FFD6)
Dummy_ISR, // Int.no.19 SCI1 error (at FBD8) (at FFD8)
Dummy_ISR, // Int.no.18 TPM2 Overflow (at FBDA) (at FFDA)
Dummy_ISR, // Int.no.17 TPM2 CH1 (at FBDC) (at FFDC)
Dummy_ISR, // Int.no.16 TPM2 CH0 (at FBDE) (at FFDE)
Dummy_ISR, // Int.no.15 TPM1 Overflow (at FBE0) (at FFE0)
Dummy_ISR, // Int.no.14 TPM1 CH5 (at FBE2) (at FFE2)
Dummy_ISR, // Int.no.13 TPM1 CH4 (at FBE4) (at FFE4)
Dummy_ISR, // Int.no.12 TPM1 CH3 (at FBE6) (at FFE6)
Dummy_ISR, // Int.no.11 TPM1 CH2 (at FBE8) (at FFE8)
Dummy_ISR, // Int.no.10 TPM1 CH1 (at FBEA) (at FFEA)
Dummy_ISR, // Int.no.9 TPM1 CH0 (at FBEC) (at FFEC)
Dummy_ISR, // Int.no.8 Reserved (at FBEE) (at FFEE)
Dummy_ISR, // Int.no.7 USB Statue (at FBF0) (at FFF0)
Dummy_ISR, // Int.no.6 SPI2 (at FBF2) (at FFF2)
Dummy_ISR, // Int.no.5 SPI1 (at FBF4) (at FFF4)
Dummy_ISR, // Int.no.4 Loss of lock (at FBF6) (at FFF6)
Dummy_ISR, // Int.no.3 LVI (at FBF8) (at FFF8)
Dummy_ISR, // Int.no.2 IRQ (at FBFA) (at FFFA)
Dummy_ISR, // Int.no.1 SWI (at FBFC) (at FFFC)
};

/****************************************************************
* Código inicialización del Bootloader (IMPORTANTE..no modificar*
****************************************************************/
#pragma CODE_SEG Bootloader_ROM

void Bootloader_Main(void);

void _Entry(void) {
PTGD = 0x00;
PTGDD = 0xF0; //PTG0-3 used for KBI input
PTGPE = 0x0F; //Pull-up enable

// MCG clock initialization, fBus=24MHz


MCGC2 = 0x36;
while(!(MCGSC & 0x02)); //wait for the OSC stable
MCGC1 = 0x1B;
MCGC3 = 0x48;
while ((MCGSC & 0x48) != 0x48); //wait for the PLL is locked

// Flash clock
FCDIV=0x4E; // PRDIV8=1; DIV[5:0]=14, flash clock
should be 150-200kHz
// bus clock=24M, flash
clock=fbus/8/(DIV[5:0]+1)
// bus clock=24M, flash
clock=fbus/8/(DIV[5:0]+1)
if(!PTGD_PTGD0)
{
SOPT1 = 0x20; // disable COP only if bootloader mod
is requested
// PTG0 is pressed
USBCTL0=0x44;
Bootloader_Main(); // Bootloader mode
}
else
asm JMP _UserEntry; // Enter User mode
}

#pragma CODE_SEG default