Anda di halaman 1dari 7

/

*****************************************************************************
**
UNIVERSIDAD POLITCNICA SALESIANA
CARRERA DE INGENIERA ELECTRNICA
SISTEMAS MICROPROCESADOS I
Programa:
Prog06SistemaEmbebido.c
Autor:
Ing. talo Mogrovejo P.
Fecha de Creacin:
26-Ene-2015
Fecha de Modificacin: 26-Ene-2015
Descripcin:
Este cdigo muestra la operacin de una aplicacin industrial con modos de
opera
cin: Administrador u Operador.
El desarrollo del sistema embebido dispone de:
Ingreso de 2 claves de 4 dgitos: ADMINISTRADOR o USUARIO:
ADMINISTRADOR:
1.
Configurar hasta 5 usuarios (crear, modificar, eliminar) cuyos datos
deben ser registrados en la memoria EEPROM de datos interna del micro.
2.
Configurar lmites (inferior y superior) de alarma de temperatura en
un rango de (15.0 hasta 99.9C)
3.
Configurar lmite (superior) de corriente en un rango de (1.00 hasta
9.99A)
4.
Configuracin de parmetros del reloj de tiempo real RT DS1307
5.
COMUNICACIN SERIAL: Los datos de la memoria serial I2C (alarmas)
deben poder ser ledos desde una aplicacin en MATLAB o LABVIEW y
escritos en una hoja en excel.
ADMINISTRADOR O USUARIO:
1.
Ingreso - validacin de cdigo para operar el sistema.
2.
Men de opciones para:
a.
CONTROL DE VELOCIDAD DE:
i.
Motor a pasos (unipolar o bipolar) a doble torque, con visualizacin
de r.p.m. e inversin de giro
ii. Motor CD con visualizacin de r.p.m., temperatura, corriente
b.
VISUALIZACIN DE ALARMAS:
i.
Cuando la temperatura ambiente est por debajo del lmite, se
advertir a travs de un mensaje si se desea operar el cual debe recibir
confirmacin (tecla ACEPTAR o ENTER)
ii. Cuando la temperatura del motor CD y/o a pasos hayan sobrepasado la
temperatura mxima, entonces el motor se apagar indicando en el LCD la
sobretemperatura producida, hasta que se presione una tecla.
iii. Cuando el motor CD y/o a pasos hayan sobrepasado la corriente mxima,
entonces el motor se apagar indicando en el LCD la sobrecarga producida,
hasta que se presione una tecla.
iv. Todas las alarmas que superan los lmites (sobretemperatura, sobrcarga)
se registrarn la fecha, hora, motor, tipo de sobrecarga en la memoria I2C
*****************************************************************************
**/
/*-----------------------------------------------------------------------------1. DEFINICIN DE CONSTANTES, BITS, PINES (ALIAS)
------------------------------------------------------------------------------*/
// alias para el teclado matricial

sbit F1 at RB7_bit;
sbit F2 at RB6_bit;
sbit F3 at RB5_bit;
sbit F4 at RB4_bit;
sbit C1 at RB3_bit;
sbit C2 at RB2_bit;
sbit C3 at RB1_bit;
sbit C4 at RB0_bit;
// alias para el LCD
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_RS at RD2_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_RS_Direction at TRISD2_bit;
//sbit BACKLIGTH at RD1_bit;
/*-----------------------------------------------------------------------------2. VARIABLES GLOBALES
------------------------------------------------------------------------------*/
unsigned char iLecturaPortb;
unsigned char iTecla;
/*-----------------------------------------------------------------------------3. PROTOTIPO DE FUNCIONES
------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------3.1 Prototipo de funciones utilizadas en el main
------------------------------------------------------------------------------*/
void iConfigPeripherals(void);
void iPresentacion(void);
void iInitAdc(unsigned char, unsigned char, unsigned char,
unsigned char, unsigned char);
unsigned int iConversionAdc(unsigned char channel);
void iDutyCyclePWM(unsigned int);
void iUsartTx(unsigned char);
/*-----------------------------------------------------------------------------3.2 Prototipo de funciones utilizadas en las interrupciones
------------------------------------------------------------------------------*/
void interrupt(void);
void iSubChangeStatus(void);
/*-----------------------------------------------------------------------------4. DEFINICIN DE FUNCIONES UTILIZADAS EN LA SUBRUTINA DE
INTERRUPCIN
------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------4.1 Atencin a la interrupcin por cambio de estado y scan de tecla
------------------------------------------------------------------------------*/
void iSubChangeStatus(void){
Delay_Ms(25); //retardo antirebote por tecla presionada

/* scan tecla */
C1=0; C2=1; C3=1; C4=1;
if(!F1) iTecla=1;
if(!F2) iTecla=4;
if(!F3) iTecla=7;
if(!F4) iTecla=14;
C1=1; C2=0; C3=1; C4=1;
if(!F1) iTecla=2;
if(!F2) iTecla=3;
if(!F3) iTecla=8;
if(!F4) iTecla=0;
C1=1; C2=1; C3=0; C4=1;
if(!F1) iTecla=3;
if(!F2) iTecla=6;
if(!F3) iTecla=9;
if(!F4) iTecla=15;
C1=1; C2=1; C3=1; C4=0;
if(!F1) iTecla=10;
if(!F2) iTecla=11;
if(!F3) iTecla=12;
if(!F4) iTecla=13;
/* condicin de mismatch */
C1=0; C2=0; C3=0; C4=0;
while(!F1 || !F2 || !F3 || !F4)
continue;
Delay_Ms(50); //retardo antirebote por tecla liberada
iLecturaPortb=PORTB;
}
/*-----------------------------------------------------------------------------5. DEFINICIN DE LA SUBRUTINA DE ATENCIN A LA INTERRUPCIN
------------------------------------------------------------------------------*/
void interrupt(void){
GIE_bit=0;
if(RBIE_bit && RBIF_bit) {
RBIE_bit=0;
iSubChangeStatus();
RBIF_bit=0;
RBIE_bit=1;
}
GIE_bit=1;
}
/*-----------------------------------------------------------------------------6. DEFINICIN DE FUNCIONES UTILIZADAS POR EL MAIN
------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------6.6 Duty cycle para el PWM
------------------------------------------------------------------------------*/
void iUsartTx(unsigned char dato) {
while(!TRMT_bit)
continue;
TXREG=dato;
}
/*-----------------------------------------------------------------------------6.5 Duty cycle para el PWM

------------------------------------------------------------------------------*/
void iDutyCyclePWM(unsigned int duty) {
CCPR1L=(unsigned char)((duty>>2));
if((duty & 0x03)==3) {
DC1B1_bit=1;
DC1B0_bit=1;
}
if((duty & 0x03)==2) {
DC1B1_bit=1;
DC1B0_bit=0;
}
if((duty & 0x03)==1) {
DC1B1_bit=0;
DC1B0_bit=1;
}
if((duty & 0x03)==0) {
DC1B1_bit=0;
DC1B0_bit=0;
}
// CCP1CON|=(unsigned char)((duty<<4)&0x30);
}
/*-----------------------------------------------------------------------------6.4 Adquisicin y conversin de un dato analgico a digital
------------------------------------------------------------------------------*/
unsigned int iConversionAdc(unsigned char channel) {
unsigned int dato;
unsigned char byte_low, byte_high;
// ADCON0=ADCON0|(channel<<2);
ADCON0|=channel<<2; //selecciona el canal a convertir
ADON_bit=1; //se enciende el conversor analgico digital
// Delay_Us(4); //tiempo de adquisicin
GO_DONE_bit=1;
while(GO_DONE_bit)
continue;
ADIF_bit=0; //bandera de interrupcin del conversor borrada
Delay_Us(1); //tiempo requerido para la prxima conversin
if(ADFM_bit) dato=(unsigned int)((ADRESH<<8)|ADRESL);
else {
byte_low=(unsigned char)((ADRESL>>6) & (0x03));
byte_low|=(unsigned char)((ADRESH<<2) & (0xFC));
byte_high=(unsigned char)((ADRESH>>6) & (0x03));
dato=(unsigned int)(byte_high*256+byte_low);
}
ADON_bit=0; //se apaga el conversor analgico digital
return dato;
}
/*-----------------------------------------------------------------------------6.3 Inicializacin del conversor analgico digital
------------------------------------------------------------------------------*/
void iInitAdc(unsigned char num_channels, unsigned char typ_ref,
unsigned char time_conv, unsigned char time_adq,
unsigned char adc_just) {
/* num_channels: selecciona cuantos canales analgicos va a utilizar en la
aplicacin, incluyendo los canales de volaje de referencia

typ_ref escoja 0 para Vref(-)=Vss, Vref(+)=Vdd


typ_ref escoja 1 para Vref(-)=Vss, Vref(+)=AN3
typ_ref escoja 2 para Vref(-)=AN2, Vref(+)=Vdd
typ_ref escoja 3 para Vref(-)=AN2, Vref(+)=AN3
time_conv escoja una opcin entre 0 y 7 segn su diseo
time_adq escoja una opcin entre 0 y 7 segn su diseo */
ADCON1=((15-num_channels) | typ_ref<<4);
/* configuracin de los canales analgicos como ingresos */
switch(num_channels) {
case 13:
TRISB0_bit=1;
case 12:
TRISB4_bit=1;
case 11:
TRISB1_bit=1;
case 10:
TRISB3_bit=1;
case 9:
TRISB2_bit=1;
case 8:
TRISE2_bit=1;
case 7:
TRISE1_bit=1;
case 6:
TRISE0_bit=1;
case 5:
TRISA5_bit=1;
case 4:
TRISA3_bit=1;
case 3:
TRISA2_bit=1;
case 2:
TRISA1_bit=1;
case 1:
TRISA0_bit=1;
default:
break;
}
ADCON2=(time_conv | time_adq<<3);
/* justificacin a la derecha o izquierda del resultado de la conversin */
if(adc_just==1) ADFM_bit=1;
else ADFM_bit=0;
ADON_bit=0; //mdulo ADC apagado inicialmente
ADIF_bit=0; //bandera de interrupcin del conversor borrada
ADIE_bit=0; //sin interrupcin
}
/*-----------------------------------------------------------------------------6.2 Men principal e ingreso de cdigo administrador-operador
------------------------------------------------------------------------------*/
void iPresentacion(void) {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,"MANEJO TECLADO");
Lcd_Out(2,4,"MATRICIAL.");
Delay_Ms(2000);

Lcd_Cmd(_LCD_CLEAR);
}
/*-----------------------------------------------------------------------------6.1 Configuracin de registros, mdulos, pines del microcontrolador
PIC18F4550
------------------------------------------------------------------------------*/
void iConfigPeripherals(void) {
/* Mdulo 1: Configuracin de canales analgicos */
iInitAdc(1,1,1,1,1);
/* Mdulo 2: Configuracin del mdulo comparador */
CMCON=0x07; //por ahora unicamente est apagado el mdulo
comparador
/* Mdulo 3: Configuracin de teclado matricial con
interrupcin por cambio de estado y pull-ups */
TRISB7_bit=1;
TRISB6_bit=1;
TRISB5_bit=1;
TRISB4_bit=1;
TRISB3_bit=0;
TRISC0_bit=0;
TRISD1_bit=0;
TRISD2_bit=0;
NOT_RBPU_bit=0;
RBIF_bit=0;
RBIE_bit=1;
/* condicin de mismatch */
C1=0; C2=0; C3=0; C4=0;
iLecturaPortb=PORTB;
/* Mdulo 4: Configuracin del LCD */
Lcd_Init();
/* Mdulo 5: Configuracin del mdulo CCP1 en modo PWM */
CCP1CON=0x0C;
PR2=0xFF; //configuracin para frecuencia mnima del PWM
T2CKPS1_bit=1;
T2CKPS0_bit=1;
TMR2ON_bit=1;
CCP1IF_bit=0;
CCP1IE_bit=0;
/* Mdulo 6: Configuracin del EUSART */
TRISC7_bit=1; //se deben configurar como ingresos los pines Rx-Tx
TRISC6_bit=1; //del mdulo EUSART
SPBRGH=0; //es cero porque se est utilizando una configuracin a 8 bits
SPBRG=129; //configura la tasa de baudios a 9600bps, segn las
ecuaciones
BRGH_bit=1; //del datasheet
BRG16_bit=0;
SYNC_bit=0;
SPEN_bit=1;
TXCKP_bit=0; //no invierte los bits de transmisin
TX9_bit=0; //no se utilizar transmisin a 9 bits (bit de paridad)
TXIF=0;
TXIE=0; //no se requiere interrupcin a la transmisin

/* Habilitacin global de interrupciones */


GIE_bit=1;
}
/*-----------------------------------------------------------------------------7. DEFINICIN DEL PROGRAMA PRINCIPAL
------------------------------------------------------------------------------*/
int main() {
unsigned char iFlagBackligth=0;
iConfigPeripherals();
iPresentacion();
while(1) {
iDutyCyclePWM(iConversionAdc(0));
Delay_Ms(1000);
}
return 0;
}

Anda mungkin juga menyukai