viernes, 17 de mayo de 2013

Lógica combinatoria con GAL y WinCUPL

LÓGICA COMBINATORIA CON GAL
En esta publicación se explicar como se utiliza y programa un dispositivo GAL para realizar circuitos digitales empleando lógica digital combinatoria.
Actualmente este dispositivo es muy económico y relativamente fácil de conseguir, ademas es reprogramable y fácil de montar en un protoboard.
Para programar el dispositivo GAL se empleara el WinCupl de Atmel, se pude descargar después de registrarse en la pagina.
Una vez descargado se introduce el código de activación dado por el soporte técnico de Atmel el cual es 60008009
ENLACES DE INTERÉS

Descargas

GAL22V10
En la GAL22v10 tendremos que 22 terminales pueden ser utilizados como entradas, en el esquema están marcados como In, que 10 terminales se pueden utilizar como salidas, en el esquema están marcados como Out ademas que estas salidas pueden ser Q lo que representa la salida de un flip flop. Se puede observar que los 10 terminales comparten la opción de entrada o salida y que esta salida puede ser el Q de un flip flop. También el terminal 1 que es una entrada comparte la opción de ser la entrada de la señal de reloj Clk para los flip flop internos de la GAL siendo esto útil al diseñar circuitos digitales secuenciales.

WINCUPL
En las siguientes tablas se resumen las instrucciones mas frecuentes para la realización de aplicaciones digitales combinatorias.

Formatos Numéricos

Se utilizan los prefijos entre comillas simples para indicar el formato numerico que se esta utilizando.

Asignación De Terminales, Variables Y Constantes

Son las instrucciones que se utilizan para definir y asignar terminales a variables, o asignar a variables operaciones con variables o constantes.
Ejemplos de asignaciones de terminales:
PIN 2 = a; /*asigna al terminal 2 la variable a*/
PIN 2 = !a; /*asigna al terminal 2 la variable a negada*/
PIN [2,3,4,5,6,7,8,9]= [A0,A1,A2,A3,A4,A5,A6,A7];
PIN [2..9] = [A0,A1,A2,A3,A4,A5,A6,A7];
PIN [2..9] = [A0..A7];
Ejemplos de asignaciones con variables intermedias: Las variables intermedias no tiene terminales asignados y son útiles para simplificar las ecuaciones que generan las salidas.
X0 = A0&A1 # A1&A2;
FIELD entradas = [D,C,B,A];
Ejemplos de ecuaciones booleanas de salida: Son las ecuaciones asociadas a las varibles declaradas para los terminales de salida.
El simbolo => utilizado en las tablas significa asignación de un ecuación booleana.
S = X0#Y0;
Table input=>output {
‘d’00 => ‘d’000;
‘d’01 => ‘d’001;
‘d’02 => ‘d’004;
}

Operadores Lógicos

La jerarquía hacer referencia a que operador se tendrá en cuenta primero al hacer una operación, por ejemplo si tenemos S=!A&B, se tendrá en cuenta primero la operación de negar A y luego se hará la operación AND.

Operadores Aritméticos

Los operadores aritméticos se utilizan para realizar operaciones entre valores que sean de tipo numérico y no con variables de tipo booleano como las asignadas a lo terminales por medio de la instrucción PIN. Normalmente lo que se hace es que el resultado de una operación aritmética se asigna a una variable o registro.

Instrucciones Adicionales

Instrucción De Repetición REPEAT: Esta instuccion no es formalmente igual a la que se utiliza en otros lenguajes de programacion como BASIC por ejemplo. Esta instrucción se utiliza en WinCupl para ahorrar escritura de lineas de código y no para implimentar una estructura ciclica en el dispositvo GAL
Ejemplo:
$repeat i = [0..3]
$define D(i) 'b'(i)
$repend
esto equivale a escribir el siguiente código:
$define D0 'b'000
$define D1 'b'001
$define D2 'b'010
$define D3 'b'011

EJEMPLOS
Ejemplo 1
Implementar una compuerta AND de dos entradas en una GAL22V10.

Name Ejem01 ;
PartNo   00 ;
Date     17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company  UNIAJC ;
Assembly None ;
Location  ;
Device   G22V10 ;
/*Terminales de entrada de la compuerta AND*/
PIN 3 = a ; PIN 4 = b; 
/*Terminales de salida para las compuertas*/ 
PIN 17 = s; 
s = a&b; /*Compuerta AND*/ 
Ejemplo 2

Implementar una compuerta OR y una compuerta AND de dos entradas en una GAL22V10.

Name Ejem02 ;
PartNo   00 ;
Date     17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company  UNIAJC ;
Assembly None ;
Location  ;
Device   G22V10 ;
/*Terminales de entrada de la compuerta AND*/
PIN 2 = A0 ;
PIN 3 = A1; 
/*Terminales de entrada de la compuerta OR*/
PIN 4 = B0;
PIN 5 = B1;
/*Terminales de salida para las compuertas*/ 
PIN 23 = S0; /*Salida compuerta AND*/
PIN 22 = S1 ;/*Salida compuerta OR*/
/*Operaciones Logicas*/ 
S0 = A1&A0; /*Compuerta AND*/ 
S1 = B1#B0; /*Compuerta OR*/ 
Ejemplo 3

Implementar un decodificador de binario a decimal con la GAL22V10
Tabla de la verdad correspondiente al decodificador, que se empleara en el programa.
En este ejemplo no se esta empleando el punto decimal dp a pesar de que esta conectado en el esquema mostrado.

CARACTERES EN UN DISPLAY 7 SEGMENTOS

Para otras aplicaciones puede ser útil generar caracteres alfanuméricos con un display de 7 segmentos, aqui se deja una tabla con su respectivo valor decimal teniendo en cuenta que el segmento a es el menos significativo y el segmento g el mas significativo
Mapa de caracteres
Name Ejem03 ;
PartNo 00 ;
Date 17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company UNIAJC ;
Assembly None ;
Location ;
Device G22V10 ;
/*Terminales de entrada */
PIN [2..5] = A, B, C, D;
/*Terminales de salida */
PIN [13..20] = sa,sb,sc,sd,se,sf,sg,sdp;
/*Declaraciones */
FIELD entradas = [D,C,B,A];
FIELD salidas = [sdp,sg,sf,se,sd,sc,sb,sa]; 
/*Ecuaciones booleanas */
TABLE entradas => salidas {
'b'0000 => 'b'00111111;
'b'0001 => 'b'00000110;
'b'0010 => 'b'01011011;
'b'0011 => 'b'01001111;
'b'0100 => 'b'01100110;
'b'0101 => 'b'01101101;
'b'0110 => 'b'01111101;
'b'0111 => 'b'00000111;
'b'1000 => 'b'01111111;
'b'1001 => 'b'01100111;
'b'1010 => 'b'00000000;
'b'1011 => 'b'00000000;
'b'1100 => 'b'00000000; 
'b'1101 => 'b'00000000;
'b'1110 => 'b'00000000; 
'b'1111 => 'b'00000000;
 }

lunes, 22 de abril de 2013

Comunicación de pinguino con processing

Utilización De La Librería Piguino Processing

Esta es una librería para Processing que permite comunicar la tarjeta Pinguino con Processing en modo Bulk USB.
Esta aplicación fue pensada para que se pueda desarrollar programas desde el computador, en este caso con Processing para poder tener acceso a un dispositivos electrónicos conectados a un microcontrolador como leds, interruptores, potenciómetros, etc.
También trata de poder tener acceso al microcontrolador sin necesidad de programar este directamente.
Para poder utilizar esta librería hay que instalarla en Processing y descargar un programa en el microcontrolador Pinguino.
Disposición para el 18f4550
La imagen muestra como esta configurado para la tarjeta montada con el PIC18F4550, se indica cuales terminales se emplean como entradas y salidas digitales así como entradas análogas.
El terminal 11 puede ser empleado como salida análoga por modulación de ancho de pulso.

Enlaces de interés

Instalación De La Librería En Processing.

Antes de instalar la librería se debe tener lo siguiente:
  1. Descargar en la tarjeta Pinguino el programa de comunicación USB con Processing, puede ser los archivos con extensión hex empleando el PICKIT o compilando el código que esta al final de este documento con Pinguino 9.05 donde dice descarga del programa de comunicación en Pinguino.
  2. En el caso de windows instalar el driver o controlador, el enlace para descargar el controlador esta en los enlaces de interés.
Ya teniendo lo anterior se puede instalar y probar la librería

 Video explicativo de la instalación de la libreria

Resumen Funciones Disponibles En La Librería

Esta tabla es un resumen de las funciones que pueden ser empleadas en Processing y la tarjeta Pinguino.

Ejemplos Básicos 

Una vez instalada la librería en Processing y el driver de Pinguino. Se pueden probar los siguientes programas en Processing para ser probados.

Encendido y Apagado De Un Led

Montaje de prueba básico

Ejemplo 01 Encendido Y Apagado De Un Led

import hypermedia.pinguino.*; 
Pinguino pinguino; 
void setup(){ 
   Pinguino.log( true );
   pinguino = new Pinguino( this );
void draw(){ 
   pinguino.digitalWrite(0,Pinguino.LOW); 
   delay(1000); 
   pinguino.digitalWrite(0,Pinguino.HIGH); 
   delay(1000); 
}

Ejemplos Varios

Montaje multiproposito

Ejemplo 02 Entradas Digitales Empleando Pulsadores

import hypermedia.pinguino.*;
Pinguino pinguino;
int nPulsador1;
nt nPulsador2;
int nPulsador3;
int nPulsador4;
void setup(){
Pinguino.log( true );
   pinguino = new Pinguino( this );
}
void draw(){
   nPulsador1=pinguino.digitalRead(10);
   nPulsador2=pinguino.digitalRead(12);
   nPulsador3=pinguino.digitalRead(21);
   nPulsador3=pinguino.digitalRead(22);
   pinguino.digitalWrite(0,Pinguino.LOW);
   pinguino.digitalWrite(1,Pinguino.LOW);
   pinguino.digitalWrite(2,Pinguino.LOW);
   pinguino.digitalWrite(3,Pinguino.LOW);
   if(nPulsador1==0){
      println("Pulsador izquierdo esta presionado ");
     pinguino.digitalWrite(0,Pinguino.HIGH);
   }
   if(nPulsador2==0){
     println("Pulsador arriba esta presionado ");
    pinguino.digitalWrite(1,Pinguino.HIGH );
   } 
   if(nPulsador3==0){
     println("Pulsador derecho esta presionado ");
     pinguino.digitalWrite(2,Pinguino.HIGH );
   }
   if(nPulsador4==0){
      println("Pulsador abajo esta presionado ");
     pinguino.digitalWrite(3,Pinguino.HIGH );
   } 
}

Ejemplo 03 Entrada Análoga Empleando Un Potenciómetro

import hypermedia.pinguino.*;
Pinguino pinguino;
int nAdc;
void setup(){
   Pinguino.log( true );
   pinguino = new Pinguino( this );
}
void draw(){
   nAdc=pinguino.analogRead(13);
   println("El Valor es: " + nAdc);
}

Descarga Del Programa De Comunicación En Pinguino

Dejo los dos programas tanto para el microcontrolador 18F2550 y 18F4550 empleando pinguino 9.05 si se utiliza PinguinoX2 o PinguinoX3 comentar la instrucción #define pic18f4550.
Los siguientes son los programas que se compilan y se descargan en el microcontrolador

Para el 18F4550 en Pinguino 9.05

// test Pinguino with Processing
// Jean-Pierre MANDON 2009
#define PIC18F4550
int i;
uchar todo,mode,pin,value;
unsigned char buffer[2];
int temp;
int endstring;
void clear();
void setup() {
for( i=0; i<8; i++ ) pinMode( i, OUTPUT );
for( i=25; i<29; i++ ) pinMode( i, OUTPUT );
clear();
}
void loop() {
// select action to perform...
if ( USB.available() ) {
if (USB.read()=='+')
{
todo =USB.read();
if ( todo=='C' ) clear(); // clear all
if ( todo=='W' ) { // switch on/off the specified pin
mode = USB.read();
pin = USB.read();
value  = USB.read();
if ( mode=='D' ) digitalWrite( pin, value );
if ( mode=='A' ) {
temp=value+(USB.read()*256);
analogWrite( pin, temp );
}
}
if ( todo=='R' ) {
mode = USB.read();
pin = USB.read();
if ( mode=='D' ) {
buffer[0] = digitalRead( pin );
USB.send(  buffer, 1 );
}
if ( mode=='A' ) {
temp = analogRead( pin  );
buffer[0]=temp;
buffer[1]=temp/256;
USB.send(  buffer, 2 );
}
}
endstring=USB.read(); // read end string byte ( 0 )
}
}
}
void clear() {
for( i=0; i<8; i++ ) {
digitalWrite( i, LOW );
}
for( i=21; i<29; i++ ) {
digitalWrite( i, LOW );
}
}

Para el 18F2550 en Pinguino 9.05

// test Pinguino with Processing
// Jean-Pierre MANDON 2009
int i;
uchar todo,mode,pin,value;
unsigned char buffer[2];
int temp;
int endstring;
void clear();
void setup() {
for( i=0; i<8; i++ ) pinMode( i, OUTPUT );
clear();
}
void loop() {
// select action to perform...
if ( USB.available() ) {
if (USB.read()=='+')
{
todo =USB.read();
if ( todo=='C' ) clear(); // clear all
if ( todo=='W' ) { // switch on/off the specified pin
mode = USB.read();
pin = USB.read();
value  = USB.read();
if ( mode=='D' ) digitalWrite( pin, value );
if ( mode=='A' ) {
temp=value+(USB.read()*256);
analogWrite( pin, temp );
}
}
if ( todo=='R' ) {
mode = USB.read();
pin = USB.read();
if ( mode=='D' ) {
buffer[0] = digitalRead( pin );
USB.send(  buffer, 1 );
}
if ( mode=='A' ) {
temp = analogRead( pin  );
buffer[0]=temp;
buffer[1]=temp/256;
USB.send(  buffer, 2 );
}
}
endstring=USB.read(); // read end string byte ( 0 )
}
}
}
void clear() {
for( i=0; i<8; i++ ) {
digitalWrite( i, LOW );
}
for( i=21; i<29; i++ ) {
digitalWrite( i, LOW );
}
}

Problemas Comunes

  • En la versión PinguinoX4 da un error al tratar de compilar el programa que se descarga en Pinguino, en la versión PinguinoX3 también da el mismo error compilando el programa en windows más no en Linux. No da problemas empleando Pinguino 9.05 tanto en windows como en Linux. Deje en los enlaces de descarga el archivo ya compilado hex para descargarlo empleando el PICKIT.
  • En algunas ocasiones se rompe la comunicación y aparece un error de comunicación en Processing. Es importante tener un buen cableado en la tarjeta para no generar ruido o interferencias que pueda romper la comunicación con el puerto USB en modo BULK

Preguntas Frecuentes

  • ¿ Por medio de esta librería es la única forma de comunicar Pinguino con Processing ? R/ No hay otras formas como la que puede realizarse con los puertos seriales del computador, ya sea por medio de un adaptador usb serial o configurando la tarjeta Pinguino en modo CDC.
  • ¿ Solo necesito conectar la tarjeta pinguino para realizar la comunicación ? R/ No también es necesario que el microcontrolador Pinguino tenga descargado el programa correspondiente para realizar la comunicación.
  • ¿ Puedo controlar servos con la tarjeta desde Processing ? R/ No el programa que se descarga a Pinguino no tiene soporte para servos, así como la librería. Para manjar servos aconsejo programar directamente la tarjeta Pinguino y comunicarse con Processing por el puerto serie.

martes, 16 de abril de 2013

sábado, 13 de abril de 2013

Manejo Pantalla LCD 1602 en un microcontroaldor

Aquí muestro como se conecta una pantalla LCD tipo 1602 con un microcontrolador 16f628A.
El esquema puede ser adaptado fácilmente a cualquier otro microcontrolador
Terminales de este tipo de pantalla

Conexión con el pic16f628A

Enlaces de interés

Código en Great Cow Basic

'================================================================
'===== Utilizacion LCD ejemplo 00
'================================================================
'================================================================
'===== CHIP SETUP  
'===============================================================
#chip 16F628A, 4
'================================================================
'===== CONFIGURACION  DE ENTRADAS Y SALIDAS
'===== CONFIGURACION DEL LCD
'================================================================
#define LCD_IO 8
#define LCD_DATA_PORT PORTB
#define LCD_RS PORTA.1
#define LCD_RW PORTA.2
#define LCD_Enable PORTA.3
'================================================================
'===== PROGRAMA PRINCIPAL  
'================================================================
    PRINT "Hola UNIAJC"