lunes, 11 de agosto de 2014


COMUNICACIÓN CON LAB-VIEW Y ARDUINO MEGA


Para establecer una comunicación entre LabView y Arduino se debe realizar el siguiente procedimiento:


  •      Descargar e instalar el toolking Arduino-Labview de la página de National Instrument (http://sine.ni.com/nips/cds/view/p/lang/es/nid/209835).
  •            Cargar a la placa de Arduino el programa que se encuentra en la dirección: C:\Program Files (x86)\National Instruments\LabVIEW 2012\vi.lib\LabVIEW Interface for Arduino\Firmware\LIFA_Base\LIFA_Base.
  •          Abrir LabView y crear un nuevo VI.
  •          Añadir y unir los siguientes elementos de la paleta de herramientas de Arduino:
  •          En el icono Init le añadimos dos variables de control:
  •          En el Digital Write añadimos dos variables de control:

o   Init
o   Close
o   Digital Write

o   VISA resource (Seleccionar el COM en el que se encuentra conectado la tarjeta Arduino)
o   Board Type (Seleccionar el tipo de tarjeta Arduino)

o   Se evita este paso cuando la tarjeta a ocuparse es la Arduino Uno ya que LabView viene por defecto para trabajar con esta tarjeta.


o    Digital I/O Pin (Seleccionar el pin a trabajar).
o   Value (Seleccionar el estado lógico).




Link de videotutoriales:

https://www.youtube.com/user/ElectronicJobs/videos



MANEJO DE RELOJ DS1307 CON MICROCONTROLADOR ATMEGA164PA


                                              APRENDE PRACTICA DESARROLLA

Los relojes electrónicos para sistemas embebidos son de gran ayuda para poder poder integrar el tiempo, en ocasiones los sistemas electrónicos deben accionarse por hora de uso, o por tiempos definidos, donde con estos dispositivos vamos los podemos hacer rápidamente, usaremos CodeVision para poder programar al microcontrolador ya que tiene un librería dedicada para el manejo de los mismos.

RELOJ DS1307


 El DS1307 de Dallas Semiconductor (Maxim) es un dispositivo que se conoce como “Reloj de Tiempo Real” (Real Time Clock – RTC) que opera a través del bus I2C y que, además de brindarnos la hora con minutos y segundos, posee un calendario que contempla los años bisiestos hasta fin de siglo, es decir, hasta el año 2100.
Entre las características destacadas, posee una salida (configurable por software) que, en nuestro caso, la utilizamos como “segundero luminoso”, y la posibilidad de trabajar con una pequeña batería para almacenar los datos mientras el sistema se encuentra desconectado de la alimentación. Además, esta pequeña alimentación de respaldo permite mantener funcionando el oscilador  maestro del reloj con un consumo ínfimo de 300nA, según su hoja de datos. Una simple batería de Litio CR2032 puede brindarnos un funcionamiento satisfactorio durante 10 años.



En el mercado lo podemos encontrar de esta forma donde la memoria y el máster ya están conectados.

Dentro de CodeVision AVR tenemos las librerías i2c.h  y ds1307.h donde nos permiten poder configurar al microcontrolador de mejor forma.
Específicamente en la librería i2c,h lo que hacemos en comunicarlo al microcontrolador y poder traer los datos adecuadamente, en el caso de la librería  ds1307.h nos permite recuperar la hora y fechas completas desde subrutinas ya realizadas.

Para poder comunicarlo mediante i2c es necesario determinar los pines de comunicación del microcontrolador de la siguiente forma:
#asm
   .equ __i2c_port=0x05 ;PORTB // configuracion de puerto como salida
   .equ __sda_bit=0 // bit de transmisión
   .equ __scl_bit=1   //bit de transmión
#endasm

Una vez realizada la configuración adecuada mediante las subrutinas de la librería vamos poder traer los datos 
unsigned char hora,minuto,segundo;//registros de almacenamiento de hora actual
unsigned char semana,fecha,mes,anio;//almacenamiento de fecha actual
 rtc_get_time(&hora,&minuto,&segundo);
 rtc_get_date(&fecha,&mes,&anio);

De esta forma tenemos los datos provenientes del reloj en cada variable de tipo unsigned char, de esta forma podemos enviarlo a una lcd y observarlos fácilmente.

El microcontrolador si lo usamos para que funcione dentro del void main tendrá incovenientes, ya que al ser un microcontrolador de gama media puede saturarse la CPU, para ellos es una buena alternativa usar las interrupciones por cambio de estado en un pin, ya que desde el reloj podemos sacar un señal digital hacia un interrupciones y se puede actualizar la hora en slots de tiempo.

Dejo el programa comentado para su uso y tambíén un tutorial de cómo se hace.

Saludos.

//****************************************************************************//
#include <delay.h>
#include <stdio.h>
#include <alcd.h> //libreriade lcd 
#asm
   .equ __i2c_port=0x05 ;PORTB
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>   //libreria de cx i2c

// DS1307 Real Time Clock functions
#include <ds1307.h>       // libreria de reloj ds1307
//variables de envio a lcd de datos
char palabra_hora[8];      //vector de almacenamiento de hora
char palabra_fecha[8];       // vector de almacenamiento de fecha
unsigned char hora,minuto,segundo;     //registros de almacenamiento de hora actual
unsigned char semana,fecha,mes,anio;   //almacenamiento de fecha actual
//subrutina de lectura de hora
void lee_hora()
{
   rtc_get_time(&hora,&minuto,&segundo);     // traer la hora en variables
   sprintf(palabra_hora,"%2u:%2u:%2u",hora,minuto,segundo);     // unir todos los datos en un vector
   lcd_gotoxy(0,0); //seleccion de ubicaion de lcd
   lcd_puts(palabra_hora);//envía la palabra de hora a la lcd   
   lcd_gotoxy(8,0);
   lcd_puts("    ");
}
//subrutinda de lectura de fecha
void lee_fecha()
{
   
   rtc_get_date(&fecha,&mes,&anio);        // traer la fecha en variables
   sprintf(palabra_fecha,"%2u/%2u/%2u",fecha,mes,anio);     // unir todos los datos en un vector
   lcd_gotoxy(0,1);
   lcd_puts(palabra_fecha);     //envía la palabra de hora a la lcd 
    lcd_gotoxy(8,1);
   lcd_puts("    ");
}

interrupt [EXT_INT2] void ext_int2_isr(void)
{
 lcd_clear();//limpia pantalla
   lee_hora();
   lee_fecha(); 
}

void main(void)
{

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


// Timer/Counter 2 initialization
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: On
// INT2 Mode: Falling Edge
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-15: Off
// Interrupt on any change on pins PCINT16-23: Off
// Interrupt on any change on pins PCINT24-31: Off
EICRA=0x2A;
EIMSK=0x07;
EIFR=0x07;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;


// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x98;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;                                  


// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 32768Hz
 rtc_init(0,1,0);



// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 8
lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1)
      {
       
      }
     
    }
//****************************************************************************//

link de videotutoriales:

https://www.youtube.com/user/ElectronicJobs/videos

jueves, 3 de abril de 2014

TECLADO MATRICIAL CON MICROCONTROLADOR ATMEGA164PA, CODEVISION Y PROTEUS

   WE UNIT TALENT THEY CREATE THE FUTURE


Un teclado matricial es un simple arreglo de botones conectados en filas y columnas, de modo que se pueden leer varios botones con el mínimo número de pines requeridos. Un teclado matricial 4×4 solamente ocupa 4 líneas de un puerto para las filas y otras 4 líneas para las columnas, de este modo se pueden leer 16 teclas utilizando solamente 8 líneas de un microcontrolador. Si asumimos que todas las columnas y filas inicialmente están en alto(1 lógico), la pulsación de un botón se puede detectar al poner cada fila en bajo (0 lógico)y revisar cada columna en busca de un cero.

Es un teclado construido en forma de matriz. El teclado que se describe es un teclado de 4x4=16teclas. Para controlar el teclado, los puertos correspondientes a las filas se programan como salidas y los conectados a las columnas del teclado se programan como entradas. El diagrama a continuación muestra como está constituido el mismo:
Para su conexión al microcontrolador se deben colocar unas resistencias de pull-up en las filas (o las columnas). De esta forma si se pone un cero lógico, en  una columna (fila) se obtendrá un cero en la fila (columna) correspondiente cuando se pulse una tecla.



El momento de crear tu proyecto no olvides incluir la librería para que funcione correctamente tu teclado:
include <stdlib.h>                                               // librería para  conversión de char a entero.







TIMER/CONTADOR0 CON PWM 8 Bits CON MICROCONTROLADOR ATMEGA164PA, CODEVISION Y PROTEUS

   WE UNIT TALENT THEY CREATE THE FUTURE

Especificaciones:
  • Dos unidades de comparación diferenciales.
  • Registro de comparación con doble Buffer de salida.
  • Recarga automática en los modos Clear Timer y punto de comparación (Compare Match)
  • Modulación de Ancho de Pulso
  • Periodo variable PWM
  • Generador de frecuencia
  • Tres fuentes de interrupción externa (TOV0, OCF0A y OCF0B)

Diagrama de bloques TIMER/CONTADOR0 CON PWM 8 Bits 

Modos de Operación:
En el modo de operación, la conducta del Timer/Contador y los pines de comparación a la salida, son definidos por la combinación del modo de Generador de Forma de Onda (WGM02:0) y el modo de Comparación de Salida (COM0x1:0). Los bits COM0x1:0 controlan si la salida de la PWM generada debería ser invertida o no.

Modo Normal 

El modo más simple de operación es el Modo Normal (WGM02:0 = 0). En este modo la dirección del contador siempre se encuentra incrementando, y el contador no se pone en cero. El contador simplemente deja de contar con un valor máximo a 8 bits (TOP=0xFF) y luego inicia desde tope bajo (0x00). En operación normal la Bandera de desbordamiento del Timer/Contador será uno al mismo tiempo que el ciclo de máquina como el TCNT0 llegan a ser cero. La bandera TOV0 en este caso se comporta como un noveno bit, excepto que esté solo en uno. Sin embargo, combinado con la interrupción de desbordamiento del timer que automáticamente limpia la bandera TOV0, la resolución del timer puede incrementarse por software. No hay casos especiales a considerar en el Modo Normal, el valor del nuevo contador puede ser escrito a cualquier instante. 

Modo de Rápida PWM 

El modo de Rápida PWM (WGM02:0=3 o7) proporciona una opción de generación de forma de onda PWM a alta frecuencia. La rápida PWM difiere de otra opción de PWM por la simple pendiente de operación (diente de sierra). El contador cuenta desde el 0x00 hasta el Tope luego inicia desde 0x00. El tope es definido como 0xFF cuando WGM2:0 = 3, y OCR0A cuando WGM2:0 = 7. En Modo de comparación de salida no invertido, la salida de comparación (OCOx) es limpiada en el punto de comparación entre TCNT0 y OCR0x, y pone en uno a la dirección 0x00. En Modo de Comparación de salida Invertida, la salida es puesta en uno en el punto de comparación y es limpiada en la dirección 0x00, en simple pendiente de operación, la frecuencia de operación en modo rápida PWM puede estar dos veces en alto como en el modo de fase correcta PWM que usa doble pendiente de operación (onda triangular). Esta alta frecuencia hace que el modo Rápida PWM pueda ser usada para reguladores de voltaje, rectificadores, y aplicaciones DAC. Para alta frecuencia se tiene físicamente pequeños tamaños de componentes externos (capacitores), y reduce el costo total del sistema. 

Descripción de Registros:

              TCCR0A – Registro de Control A Timer /Contador 

             Bits 7:6 – COM0A1:0: Modo de Comparación de Salida A 
Estos bits controlan el comportamiento del pin de comparación-salida (OC0A). Si uno o ambos bits del COM0A1:0 están en uno, la salida del OC0A proporciona el normal funcionamiento de los pines de I/O cuando están conectados.

             Modo de Comparación de Salida, Modo rápida PWM




LCD CON MICROCONTROLADOR ATMEGA164PA CODEVISION Y PROTEUS

WE UNIT TALENT THEY CREATE THE FUTURE


Una vez estudiado el manejo de puertos y la cx serial en un microcontrolador ATMEGA164PA, el siguiente a tratar es la configuración de una LCD, en este artículo vamos a conocer tanto códigos de programación, como configuración de pines en Proteus y en trabajos prácticos.

DESCRIPCIÓN GENERAL DE UNA LCD.
Una pantalla de cristal líquido o LCD es una pantalla delgada y plana formada por un número de píxeles en color colocados delante de una fuente de luz o reflectora. A menudo se utiliza en dispositivos electrónicos de pilas, ya que utiliza cantidades muy pequeñas de energía eléctrica.



LCD 16x2
Una LCD es un dispositivo controlado de visualización gráfico para la presentación de caracteres, símbolos, en este caso dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos (píxeles), aunque los hay de otro número de filas y caracteres. Este dispositivo está gobernado internamente por un microcontrolador y regula todos los parámetros de presentación, este modelo es el mas comúnmente usado.

Características principales de una LCD:
  • Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.
  • Desplazamiento de los caracteres hacia la izquierda o la derecha.
  • Proporciona la dirección de la posición absoluta o relativa del caracter.
  • Memoria de 40 caracteres por línea de pantalla.
  • Movimiento del cursor y cambio de su aspecto.
  • Permite que el usuario pueda programar 8 caracteres.
  • Conexión a un procesador usando un interfaz de 4 u 8 bits.

Diagrama:




Funciones básicas para el manejo de LCD:


lcd_gotoxy(x,y);    indica la posición de la matriz donde va a ser colocado el caracter      
lcd_puts("      ");   indica el caracter o conjunto de caracteres que va a visualizarse en la LCD 
lcd_clear();           borra los caracteres existentes en la LCD

    

El momento de programar en CODEVISION no olvides incluir la librería para LCD:

#include <alcd.h>








CONVERSOR ANÁLOGO DIGITAL CON MICROCONTROLADOR ATMEGA164PA, CODEVISION Y PROTEUS

WE UNIT TALENT THEY CREATE THE FUTURE


Especificaciones:
• Resolución de 10-bits
• Integrador no Lineal 0.5 LSB
• Presición Absoluta ±2 LSB
• Tiempo de Conversión 13 - 260μs
• Máxima Resolución por encima de 15 KSPS
• 8 Canales Multiplexados Simples de Salida
• Modo Diferencial con Ganancia Seleccionable: X1, X10 o X200
• Ajuste opcional Izquierdo para lectura de salida del ADC
• Rango de Voltaje de Entrada del ADC: 0 - VCC
• Rango de Voltaje Diferencial del ADC: 2.7 - VCC
• Voltaje de Referencia Seleccionable ADC: 2.5V o 1.1V
• Modo de Simple Conversión (Free Running)
• Inicio de Conversión ADC por Auto-disparo o Fuente de Interrupción
• Activación de Interrupción al finalizar la Conversión ADC
• En Modo Sleep se cancela el ruido

Bloque Esquemático del Conversor Analógico Digital:

Descripción de Registros:

         ADMUX- Selección de Registros Multiplexados del ADC
     
                                                                               
        Bit 7:6 -REFS1:0: Selección Bits de Referencia
Estos bits seleccionan el voltaje de referencia para el ADC, como se muestra en la siguiente tabla. Si estos bits son cambiados durante la conversión, el cambio no será efectuado hasta que la conversión sea completada (ADIF EN ADCSRA es uno). La opción del voltaje de referencia interno no debe ser usada si una referencia externa esta siendo aplicada en el pin AREF.


Bit 5- ADLAR: Ajuste de resultado hacia la izquierda del ADC 
El bit ADLAR afecta la presentación del resultado de la conversión ADC en el registro de datos del ADC. Escriba uno en ADLAR para ajustar el resultado hacia la izquierda.

Bits 4:0 – MUX4:0: Bits de selección para Canal Análogo y Ganancia
El valor de estos bits seleccionan cual combinación de la entrada analógica son conectadas al ADC. Estos bits también seleccionan la ganancia para los canales diferenciales

ADCSRA – ADC Registro de Control y Estado A

Bit 7- ADEN: Habilitación ADC
Cuando se pone uno en este bit se habilita el ADC, con cero el ADC es apagado.Si se apaga el ADC mientras la conversión está en progreso, la conversión terminará.
Bit 6 -ADSC: Inicio de Conversión ADC
En modo de Simple Conversión, cada vez que se ponga uno en este bit se inicia cada conversión. En modo de Simple Conversión (Free Running), al escribir uno en este bit inicia la conversión. La primera conversión ADSC ha sido escrita después de que el ADC ha sido habilitado o si ADSC es escrito al mismo tiempo que el ADC es habilitado, esto demora 25 ciclos de reloj ADC comparado con los 13 ciclos que demora normalmente. La primera conversión llega a inicializar el ADC.ADSC estará en uno durante la conversión en progreso. Cuando termina la conversión retorna a cero.
Bit 5- ADATE: Habilitación Auto Disparador ADC
Cuando se escribe uno en este bit, el auto Disparador del ADC es habilitado. El ADC empezará la conversión con flanco positivo seleccionado con la señal del disparador. 
Bit 4- ADIF: ADC Banderas de Interrupción
Este bit es uno cuando se completa la conversión ADC y los Registros de Datos son actualizados. Cuando la conversión ADC es completada se ejecuta la interrupción si el bit ADIE y el bit I en SREG son uno.
Bit 3 – ADIE: Habilitación de interrupciones del ADC
Cuando este bit es uno y el bit I en SREG es uno, la conversión ADC es completada y es activada la interrupción.
Bits 2:0 – ADPS2:0: Bits de selección para el Prescalador 
Estos bits determinan el factor de división entre la frecuencia del cristal y la entrada del reloj 
del ADC.


------------------------------------------------------------------------------------------------

Para realizar la conversión análoga digital debemos tener en cuenta un rango dentro del cual se realizará la conversión, en el caso de los microcontroladores el voltaje de referencial es de 5V 



Las líneas de código que debes verificar el momento de la creación de tu proyecto en CODEVISION son las que se detallan a continuación:




#define ADC_VREF_TYPE 0x00

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
 adc_data=ADCW;
   //((x*1023)/5) 
  // (X*1023)/5
    //x=valor del conversor a encontrar
 // 5= valor referencial 

if (adc_data>((0.5*1023)/5)&&(adc_data<((1*1023)/5)))
PORTB=0b00000001;
if (adc_data>((1*1023)/5)&&(adc_data<((1.5*1023)/5)))
PORTB=0b00000011;
if (adc_data>((1.5*1023)/5)&&(adc_data<((2*1023)/5)))
PORTB=0b00000111;
if (adc_data>((2*1023)/5)&&(adc_data<((2.5*1023)/5)))
PORTB=0b00001111;
if (adc_data>((2.5*1023)/5)&&(adc_data<((3*1023)/5)))
PORTB=0b00011111;
if (adc_data>((3*1023)/5)&&(adc_data<((3.5*1023)/5)))
PORTB=0b00111111;
if (adc_data>((3.5*1023)/5)&&(adc_data<((4*1023)/5)))
PORTB=0b01111111;
if (adc_data>((4*1023)/5)&&(adc_data<((4.5*1023)/5)))
PORTB=0b01111111;


ADCSRA=ADCSRA |0x40;  // inicializar la siguiente conversión


}