PROYECTO 4 – EJERCICIO 2
Main:
#include <xc.h> #include <stdio.h> #define _XTAL_FREQ 20000000 #include
#include "config.h" #include "LCD.h" #include "uart.h"
unsigned int aux; unsigned int cuenta; unsigned int cuenta1; float temperatura; char temp[20];
void main(void) { // Configuro puertos como entradas o salidas: TRISA = 0xFF; TRISB = 0X00;// Configura el PortA como entrada.
// Configuro puertos como entradas o salidas: TRISCbits.TRISC7=1;
//pin RX como una entrada digital.
TRISCbits.TRISC6=0;
//pin TX como una salida digital.
// Inicialización del módulo EUSART PIC en el XC8 modo asíncrono, a 8bits: TXSTAbits.TX9=0;
//8 bits de datos.
TXSTAbits.TXEN=1;
//Transmisión habilitada.
TXSTAbits.SYNC=0;
//Transmisión Asíncrona.
TXSTAbits.BRGH=0;
//Baja velocidad.
RCSTAbits.SPEN=1;
//Habilita puerto serie.
//Configuro la velocidad "Baud Rate": BAUDCONbits.BRG16=0; //modo 16 bits.
SPBRGH=0; SPBRG=15;
//Byte MSB del registro de velocidad en 0. //Byte LSB del registro de velocidad en 129 para una velocidad de 9600 baudios con oscilador de 20Mhz.
// Configuración del ADC: ADCON1= 0x0E; ADCON0= 0x00; ADCON2= 0x9D;
// 6TAD, FOSC/16, justificación derecha
ADCON0bits.ADON= 1; // Arranca conversion.
//Configuracion del tmr0 T0CON = 0xC2;
// Ftmr0=5MHz/8=625KHz Ttmr0=1.6 uS
T1CON = 0xC9;
//
RCONbits.IPEN = 0; INTCON = 0XE0;
//GIE ON, PEIE ON, T0IE ON
PIE1bits.TMR1IE=0; cuenta = 0; cuenta1 = 0;
// Configuración del LCD: lcd_init(); lcd_clear_display(); __delay_ms(180); lcd_goto(2,1); lcd_print("TEMPERATURA:"); lcd_goto(10,2); lcd_dato(0xDF); lcd_print("C");
while (1)
// Bucle infinito (no hace nada)
{ ADCON0bits.GO_DONE = 1; while(ADCON0bits.GO_DONE ==1);
aux = ADRESH; aux = aux << 8; aux = aux + ADRESL; temperatura = (aux)*(500.0/1023.0);
sprintf(temp,"%.2f ",temperatura);
Write_Text_UART(temp); __delay_ms(5000); //
TXREG = 0;
// Se coloca en el buffer de TX.
//
while(TXSTAbits.TRMT==0); // Espera que se envíe.
//
__delay_ms(250); }
} // Fin de main
void __interrupt(high_priority) Tmr0ISR(void){
TMR0L = 6;
// 0.4 ms
cuenta++; if(cuenta==12500) { lcd_goto(4, 2); lcd_print(temp); //Se activa a los 500ms cuenta = 0; } INTCONbits.TMR0IF = 0;
TMR1L = 0xAF;
// 10 ms
TMR1H = 0x3C; cuenta1++; if(cuenta1==612) { LATBbits.LB0 = ~LATBbits.LB0; //se activa a los 250ms cuenta1 = 0; } PIR1bits.TMR1IF = 0; }
“config.h”:
//Zona de los bits de configuración #pragma config PLLDIV = 5
// PLL Prescaler Divide by 5 (20 MHz/5 = 4 MHZ)
#pragma config CPUDIV = OSC1_PLL2 // System Clock Postscaler (20 MHz/1 = 20 MHz) #pragma config USBDIV = 2
// USB Clock Full-Speed (96 MHz/2 = 48 MHz)
#pragma config FOSC = HS
// Oscillator Selection bits (HS oscillator)
#pragma config PWRT = ON
// Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = OFF
// Brown-out Reset disabled
#pragma config BORV = 3
// Brown-out Reset Voltage (Minimum 2.05V)
#pragma config WDT = OFF
// Watchdog Timer disabled
#pragma config CCP2MX = OFF
// CCP2 MUX bit (CCP2 is multiplexed with RB3)
#pragma config PBADEN = OFF
// PORTB A/D (PORTB<4:0> configured as digital I/O)
#pragma config MCLRE = ON
// MCLR Pin Enable bit (MCLR pin enabled)
#pragma config STVREN = ON
// Stack Full/Underflow will cause Reset
#pragma config LVP = OFF
// Single-Supply ICSP disabled
“LCD.h”:
/* Creada por tutorialesvirtuales.com / [email protected] * Nota: Esta Libreria esta diseñada PAra una interfaz a 4 Bits Esta primera parte debe ser modificada por el usuario, para setear los pines del Micro */ #define RS
LATBbits.LATB4
//Se debe de definir el Pin Usado para RS
#define EN
LATBbits.LATB5
//Se debe de definir el pin Usado para E
#define TRISRS TRISBbits.TRISB4 //Se define el Tris para el RS Para poderlo configurar como Salida #define TRISEN TRISBbits.TRISB5 //Se define el Tris para el E Para poderlo configurar como Salida #define PUERTOTRS TRISD #define PUERTO LATD
// Se define el TRIS del puerto que se usa como interfaz en este caso el Puerto C // Se define El LAT del puerto que se usa como interfaz en este caso el C
void lcd_init(); void lcd_control(char); void lcd_dato(char); void lcd_clear_diplay(); void lcd_cursor_home(); void lcd_print(char*); void lcd_print_with_position(int, int, char*); void lcd_goto(int, int); void lcd_put_caracter(char, char[]); void lcd_time_control();
/* * Configuracion de Puertos * Iniciliaza el los puertos requeridos para el LCD * Ademas lo inicializa a 4 Bits */ void lcd_init() { TRISRS = 0; //Configuramos el Pin RS como salida TRISEN = 0; //Configuramos el Pin E como salida PUERTOTRS = 0b00001111; //Configuramos El nibble mas significativo como Salidas (Bus de 4 Bits)) RS = 0; //Aseguramos RS en 0 EN = 0; //Aseguramos E en 0 PUERTO = 0; //Aseguramos el Puerto de datos en 0 /* * Configuracion del control del LCD
*/ __delay_ms(50); // Tiempo de espera a que se estabilicen los puertos lcd_control(0x02); //Asegura el Cursos del LCD Al inicio (Home) lcd_control(0x28); //Configura el LCD a 4 Bits, 2 Lineas Y Fuente de 5*8; Lineas Esto se llama el function set lcd_control(0x0C); //LCD Prendido, Cursor Apagado, Destello Cursor apagado; Esto se Llama Diplay on/off Control lcd_control(0x06); //No rota el mensaje Y se incrementa el contador de direccion. Esto se Llama Entry Mode Set }
/* * Esta rutina se encarga de tomar un dato y ponerlo en el puerto de datos * teniendo en cuenta que es a 4 bits, por lo tanto tiene que hacer cambio de ninbles * primer se envia el nible mas significativo y luego se envia el menos significativo */ void lcd_control(char dato) { RS = 0; PUERTO = dato & 0xF0; lcd_time_control(); PUERTO = ((dato & 0x0F) << 4); lcd_time_control(); __delay_ms(2); }
/* * Está rutina se encarga de tomar un dato y ponerlo sobre el puerto de datos * especificamente para escribir un caracter sobre el LCD * */ void lcd_dato(char dato) { RS = 1; PUERTO = dato & 0xF0; lcd_time_control(); PUERTO = ((dato & 0x0F) << 4); lcd_time_control(); __delay_us(50); }
/* * Rutina encargada de limpiar el LCD
*/ void lcd_clear_display() { lcd_control(0x01); }
/* * El puntero regresa al inicio sin modificar los datos del LCD */ void lcd_cursor_home() { lcd_control(0x02); }
/* * Imprime una cadena de caractres en el LCD */ void lcd_print(char *dato) { while (*dato) // Mientras no sea Null { lcd_dato(*dato); // Envio el dato al LCD dato++; // Incrementa el buffer de dato } }
/* * Imprime una cadena de caracteres en la pisicion X y Y que se le pasen */ void lcd_print_with_position(int x, int y, char *dato) { char posicion; switch (y) { case 1: posicion = 0x80 + x; break; case 2: posicion = 0xC0 + x; break; default: posicion = 0x80 + x; break; } lcd_control(posicion); lcd_print(dato);
}
/* * Pone el puntero en la posicion deseada */ void lcd_goto(int x, int y) { char posicion; switch (y) { case 1: posicion = 0x80 + x; break; case 2: posicion = 0xC0 + x; break; default: posicion = 0x80 + x; break; } lcd_control(posicion); }
/* * Guardar caracteres especiales. en la CGRAM */ void lcd_put_caracter(char adress, char caracter[]) { int i; lcd_control(0x40 + (adress * 8)); for (i = 0; i < 8; i++) { lcd_dato(caracter[i]); } }
/* * Genera un Pulso de control Ese pulso es un pulso de E a 1 milisegundos */ void lcd_time_control() { EN = 1; __delay_us(5); EN = 0; __delay_us(5); }
“uart.h”:
char Read_UART() { while(!RCIF); //leer únicamente si el buffer no está ocupado return RCREG; }
void Read_Text_UART(char *Output, unsigned int length) { unsigned int i; for(i=0;i
void Write_UART(char data) { while(!TXIF); // escribir únicamente si el buffer no está ocupado TXREG = data; }
void Write_Text_UART(char *text) { int i; for(i=0;text[i]!='\0';i++) //escribir hasta que el final de la cadena { Write_UART(text[i]); } }
CÓDIGO EN NETBEANS:
package proyecto4; import jPicUsb.*;
public class main extends javax.swing.JFrame { public main() { initComponents(); try{ iface.load(); System.out.println("Libreria kPicUSB inicializada"); } catch(Exception e){ setTitle(e.getMessage()); System.out.println(e.getMessage()); } } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jButton1 = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); jTextPane1 = new javax.swing.JTextPane();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1);
jButton1.setText("INICIO"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } });
jTextPane1.setText("UNI - FIEE - EE637N2"); jScrollPane2.setViewportView(jTextPane1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(32, 32, 32) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 331, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(147, 147, 147) .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(132, 132, 132) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(37, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap()
.addComponent(jButton1) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(17, Short.MAX_VALUE)) );
pack(); }//
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { byte [] buf_sal = new byte [32]; buf_sal[0]=0; try{ byte [] buf_ent = iface.QWriteRead(buf_sal, 1, 1, 1000); System.out.println("Temperatura: "+buf_ent[0]); jTextArea1.setText("Temperatura: "+buf_ent[0]); } catch(Exception ex){ System.out.println("ERROR: "+ ex.getMessage()); } }
public static void main(String args[]) { //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new main().setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextPane jTextPane1; }