miércoles, 28 de octubre de 2015

Uso de sll srl en ghdl, ejemplo con registro de corrimiento

Al tratar de usar la instrucción de corrimiento sll o srl en GHDL, así como en el software de altera Quartus II, obtenida el siguiente error:

no function declarations for operator "sll" en GHDL
can't determine definition of operator ""sll"" -- found 0 possible definitions  en Quartus II

en uno de los foros indican que sll, ni srl estan definidos en numeric.std (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00032.html), en este mismo foro, recomiendan cambiar la libreria numeric_std.all por la libreria numeric_bit.all (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00033.html
https://mail.gna.org/public/ghdl-discuss/2008-12/msg00028.html

Sin embargo profundizando un poco mas y no conforme con esta situación, en otro foro, se encontró lo siguiente

-- Solo es posible usar los desplazamientos hasta vhdl 2008
--  y el cual no está bien soportado en los modernos sintetizadores
-- de los fpga y asic

-- a modo de parche(workaround) es convertir la señal a tipo unsigned de
-- la libreria ieee.numeric.std hacer el corrimiento y devolver a std logic
-- vector   (wjl, 21/02/2014)
--http://stackoverflow.com/questions/20024887/trying-to-leftshiftlogical-sll-in-vhdl-for-logic-vector-getting-errorfound

de este modo se puede hacer lo siguiente



-------------------------------------------------------------------------------
--
-- Company : Instituto Tecnologico Superior de Teziutlan
-- Engineer: Miguel Montiel Mtz
-- 
-- Create Date:    26/10/2015 11:54:35
-- Project Name:   RegUniversal
-- Module Name:    RegUniversal.vhd
-- Description:
-- El registro opera de la siguiente manera
-- S0 S1 | Accion
-- 0 0 | Hold
-- 0 1 | Desplazamiento a la izquierda
-- 1  0 | Load
-- 1 1 | Desplazamiento a la derecha
-- Additional Comments:
-- contiene a demas las siguientes terminales
-- CLk reloj
-- S0,S1 señales de control
-- D0..D3 entrada de datos
-- RST Reset
-- Q0..Q3 Salida de datos
-- L entrada serie desplazamiento a la izquierda
-- R entrada serie desplazamiento a la derecha
-------------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;  -- Para std_logic
use IEEE.numeric_std.all;     -- Para unsigned

entity RegUniversal is
   port( 
 CLK: in std_logic;
 S: in std_logic_vector(1 downto 0);
 D: in std_logic_vector(3 downto 0);
 RST, L, R: in std_logic;
 Q, Qn: out std_logic_vector(3 downto 0)
 );
end RegUniversal;

architecture arq1 of RegUniversal is

signal qq : std_logic_vector(3 downto 0);
signal xqq:std_logic_vector(3 downto 0);

begin
process (clk, rst, s)
 begin
 if ( rst = '0') then
 qq <= "0000";
 elsif( clk 'event and clk = '1') then
  if ( s = "00") then
   --hold
   qq <= qq;
  elsif ( s = "01") then
   --desplaza a la izquierda
-- Solo es posible usar los desplazamientos hasta vhdl 2008
--  y el cual no está bien soportado en los modernos sintetizadores
-- de los fpga y asic

-- a modo de parche(workaround) es convertir la señal a tipo unsigned de
-- la libreria ieee.numeric.std hacer el corrimiento y devolver a std logic
-- vector   (wjl, 21/02/2014) 
--http://stackoverflow.com/questions/20024887/trying-to-leftshiftlogical-sll-in-vhdl-for-logic-vector-getting-errorfound  
   qq <= std_logic_vector(unsigned (qq) SLL 1);
   qq(0) <= L;
   
  elsif ( s = "10") then
   -- load
   qq <= d; 
  else
   -- desplaza a la derecha
   qq <= std_logic_vector(unsigned(qq) srl 1);
   qq(3) <= r;
  end if;
 end if;
 
 q <= qq;
 qn <= not qq;
 
end process;
end arq1;


Y este es el banco de pruebas
library IEEE;
use IEEE.std_logic_1164.all;  -- Para std_logic
use IEEE.numeric_std.all;     -- Para signed, unsigned

entity RegUniversal_tb is
end    RegUniversal_tb;

architecture Testbench of RegUniversal_tb is

   -- Component Declaration for the Unit Under Test (UUT)
   component RegUniversal
   port( 
CLK: in std_logic;
S: in std_logic_vector(1 downto 0);
D: in std_logic_vector(3 downto 0);
RST, L, R: in std_logic;
Q, Qn: out std_logic_vector(3 downto 0)
);
   end component;

   -- Select an architecture if needed (default is last one analyzed).
   --for uut: RegUniversal use entity WORK.RegUniversal(arq1);

   -- Inputs/Outputs
   -- signal ...
signal s: std_logic_vector ( 1 downto 0);
signal d: std_logic_vector ( 3 downto 0);
signal rst, l, r: std_logic;
signal q, qn: std_logic_vector( 3 downto 0);
   -- Clock (uncomment if needed)
   -- Sustituir  por el nombre de puerto apropiado
   signal   clk : std_logic := '0';
   constant clock_period : time := 50 ns;
   signal   clock_on : boolean := true;

begin

   -- Instantiate the Unit Under Test (UUT)
   uut: RegUniversal port map ( clk, s,d,rst,l,r,q,qn);

-- Clock process (uncomment if needed)
-- Descomentar en caso de requerir senial de reloj
-- Sustituir  por el nombre de puerto apropiado
clock_process : process
begin
   while (clock_on) loop
      clk <= '0';
      wait for clock_period/2;
      clk <= '1';
      wait for clock_period/2;
   end loop;
   --assert (false) report ("Finished") severity error;
   -- Wait forever
   wait;
 end process;

-- Stimulus process
stim_proc: process
begin
   -- hold reset state for 100 ns
rst <= '0';
   wait for 100 ns;

   ---------------------------------------------------------
   -- insert stimulus here
   ---------------------------------------------------------

   -- Test case 1
   -- ... Asignaciones a seniales de entrada ...
rst <= '1'; s <= "10" ; d <= X"A"; wait for 100 ns;
rst <= '1'; s <= "00" ; d <= X"0"; wait for 100 ns;
rst <= '1'; s <= "10" ; d <= X"1"; wait for 100 ns;
rst <= '1'; s <= "11" ; d <= X"7";r <= '1'; wait for 100 ns;
rst <= '1'; s <= "11" ; d <= X"3";r <= '1'; wait for 100 ns; 

   -- assert () report "Error case 1" severity error;

   -- Test case 2
   -- ... Asignaciones a seniales de entrada ...
   wait for 100 ns;
   -- assert () report "Error case 2" severity error;

   -- Stop clock
--   clock_on <= false;
   -- Wait forever
   wait;

end process;

end Testbench;

Y finalmente la simulación

Mi agradecimiento al Prof. Garrido, por el desarrollo de la herramienta UMHDL con la cual, mis estudiantes de Ing Mecatrónica de la materia Electrónica Digital, se encuentran desarrollando las simulaciones en VHDL.

sábado, 5 de septiembre de 2015

Instalando Debian sobre Fedora para Pinguino IDE y otras chivas

Pues despues de casi 48 horas de intentar la pinguino IDE en mi pc con Fedora 22, no mas no me dejo, por lo que voy a instalar una Debian como máquina virtual y de ahi a instalar el Pinguino IDE version 11 que se ve muy bueno.

Espero tener un poco mas de tiempo para jugar con el Pinguino IDE después.

También de ahi todo lo demás funciona correctamente

Arduino Uno
Arduino Mega
Programador AVR USBASP + AVRDUDE
Programador para microcontroladores PIC pickit2 Clone
Programador USB Blaster de Altera :)
 Labview, Matlab, Scilab y la nueva vesión de Kicad

viernes, 14 de agosto de 2015

pk2cmd, Piklab, sdcc, gputils en Fedora 22 funcionan

Pues depués de un rato configurando la pc (una gateway mx6947m) con Fedora 22, ya puedo programar microcontroladores PIC de nuevo en Linux!! acabo de probar y configurar Piklab para que por medio de SDCC programe un microcontrolador PIC con el programador USB pickit 2 Clon.

USB blaster clon en Fedora 22 como usuario normal

Ya con mi máquina funcionando de nuevo veo con agrado que Fedora ha mejorado mucho desde que la deje, po cuestiones de problemas con los paquetes y las actualizaciones.

Ahora expongo el caso de tener el programador USB blaster funcionando muy bien en mi box con Fedora 22

Primero, experimenté un poco con el script que hice para hacer andar mi usb blaster en Manjaro, y funcionó muy bien, sin embargo me pregunte si habría otra forma mas sencilla de hacer funcionar mi programador para la CPLD que voy a usar para dar mis clases de electrónica digital, sin verme en la necesidad de voltaer hacia la ventana.

Pues, siempre si la encontré en un post viejito que tenia para hacer andar mi programdor para AVR, el USBASP y para el USB blaster en Manjaro, pero que requería de añadir mi usuario al grupo plugdev, así como al grupo users.

Sin embargo, no me encontré al dichoso grupo en la nueva Fedora, entonces después de googlear un poco, encontré este link, donde ví un archivo similar al de mi post para AVR, pero para el USB blaster de Altera.

# USB-Blaster
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666"

Bien, solo abrí el editor pluma con sudo y se guardo con el nombre

sudo pluma /etc/udev/rules.d/51-usbblaster.rules

Y pues, escrito así, sin la directiva GROUP de los post anteriores, el programador funciona correctamente.

miércoles, 12 de agosto de 2015

Escribiendo desde Fedora 22

Muy bien, pues ya instale Fedora 22 en mi pc, y pues ahi va jalando de a pocos; como principal ventaja, es que ya la habia manejado con anterioridad y que, algunos de los programas instalados con Manjaro, aqui están, funcionando de nuevo.

Definitivamente, la herramienta Yum extender con dnf se tarda mucho, para mi gusto.

Seguiré probando.

¿El retorno a Fedora?

Desafortunadamente, desde la ultima actualización de Manjaro, y después de creo dos años sin ningún problema grave, antier mi sistema basado en mancjaro se rompió de una forma estrepitosa.

simplemente se quedaba en el splash y asi estaban dando de vueltas las bolitas verdes, despues de seleccionar el kernel de arranque desde GRUB, incluso, el modo a prueba de fallos se quedaba en esa misma situación.

Primero pensé que el grub estaba apuntando mal, después de la actualización, pero mi unidad de dvd no funciona al 100.

resuelto el problema con una unidad usb y el comando dd, logre reinstalar manjaro en su versión de 64 bits (que es la que tenía), sin embargo ahora, después de la reinstalación. al dar inicio en initramfs, la pantalla se volvia negra y se reiniciaba el equipo.

Leyendo en los foros de Manjaro y ArchLinux, encontré que posiblemente estuviera roto el initramfs, por lo que hice un hijack desde el livecd de manjaro y despues de montar la partición en /mnt y hacer que el chroot tuviera acceso a la red.

La actualización, tal y como se indicaba en los foros, no fue posible, y esto por problemas con gpg, cosa que no entendí.

Aunque agradezco el hecho de que he aprendido mucho sobre la reinstalación, ahora mi sistema no reinicia.

Por lo que tuve que bajarme la iso de Fedora en spin con Mate + compiz y pues a ver que resulta.

Ojalá sea posible que mas adelante pueda recuperar Manjaro, ya que la verdad en cuanto a la ejecución de programas para electrónica, todos corrian perfectamente (bueno a excepción del software para programar microcontroladores PIC y Pinguino), cosa que en Fedora hasta su versión creo 19 no logré que lo hiciera de manera satisfactoria.

domingo, 9 de agosto de 2015

codificador de prioridad 74x148 en GHDL usando solo estandares IEEE

En el siguiente código se muestra la implementación y simulación de un codificador de prioridad 74x148 que viene de ejempl en el libro Diseño Digital: Principios y prácticas de John F. Wakerly.

El problema que encontré al tratar de compilar en primera instancia este código para el codificador de prioridad, es que usa la función conv_std_logic_vector. La cual, en la libreria IEEE.numeric_std no está definida.

Esto es un problema y de acuerdo a lo leido en los siguientes links
link1, link2, y link3, el uso de esta función se implementa al incluir a std_arith, la cual no es un estándar del IEEE, y que solo fue un "invento" de synopsys. Aunque cabe señalar los siguiente:

Muchos colaboradores de los hilos de los foros consultados, argumentan que nunca han tenido algún problema de compatibilidad al hacer uso de std_arith, y que esto se puede implementar, al pasarle el respectivo parámetro al "compilador" del VHDL.

Pero siguiendo estándares, la implementación del codificador se puede realizar de la siguiente manera:

library IEEE;
use IEEE.std_logic_1164.all;  -- Para std_logic
use IEEE.numeric_std.all;     -- Para unsigned

entity v74x148b is
   port( 
 EI_L: in std_logic;
 I_L : in std_logic_vector(7 downto 0);
 A_L : out std_logic_vector(2 downto 0);
 EO_L, GS_L : out std_logic
 );
end v74x148b;

architecture arq1 of v74x148b is

 signal EI: std_logic;
 signal I : std_logic_vector(7 downto 0);
 signal A : std_logic_vector(2 downto 0);
 signal EO,GS:std_logic;
begin
 codif: process (EI_L, I_L, EI, EO, GS,I,A)
 variable j: integer range 7 downto 0;
 begin
 
  EI <= not EI_L;
  I <= not I_L;
  
  EO<= '1'; GS<= '0'; A<= "000";
  if(EI) = '0' then EO <= '0'; 
  else for j in 7 downto 0 loop
   if I(j) = '1' then
    GS<= '1';
    EO<= '0';
    A<= std_logic_vector(to_unsigned(j,A 'length));
    exit;
   end if;
  end loop;
  end if;

 

 A_L <= not A;
 GS_L <= not GS;
 EO_L <= not EO;
 end process;
end arq1;


El testbench usado para la prueba de este código es el que se muestra a continuación:


library IEEE;
use IEEE.std_logic_1164.all;  -- Para std_logic
use IEEE.numeric_std.all;     -- Para signed, unsigned

entity v74x148b_tb is
end    v74x148b_tb;

architecture Testbench of v74x148b_tb is

   -- Component Declaration for the Unit Under Test (UUT)
   component v74x148b
      port( 
 EI_L: in std_logic;
 I_L : in std_logic_vector(7 downto 0);
 A_L : out std_logic_vector(2 downto 0);
 EO_L, GS_L : out std_logic
);
   end component;

 signal EI_L: std_logic;
 signal I_L : std_logic_vector(7 downto 0);
 signal A_L : std_logic_vector(2 downto 0);
 signal EO_L,GS_L:std_logic;

begin

  
   uut: v74x148b port map ( 
 EI_L => EI_L, 
 I_L => I_L, 
 A_L => A_L,
 EO_L => EO_L,
 GS_L => GS_L);
stim_proc: process
begin
 I_L <= "11111111"; EI_L <= '1'; wait for 10 ns;
 I_L <= "00000000"; EI_L <= '1'; wait for 10 ns;
 I_L <= "11111111"; EI_L <= '0'; wait for 10 ns;
 I_L <= "10000000"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11000000"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11100000"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11110000"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11111000"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11111100"; EI_L <= '0'; wait for 10 ns;
 I_L <= "11111110"; EI_L <= '0'; wait for 10 ns;
end process;
end Testbench;



Y la salida de la señales son las siguientes:

SSSSSS

Se señala que se utilizó la herramienta UMHDL v2.00 de Pablo Garrido de la Universidad Miguel Hernández, de Elche, en su versión para sistema operativo Linux

La siguiente dirección es la indicada por el software, en la sección de acerca de..
http://labatc.umh.es:50005/pgarrido/

viernes, 24 de julio de 2015

Instalando impresora Samsung SL M2022 en Manjaro Linux

Muy bien, despues de dos dias de andar con jale de esta impresora, me encontré con un problema similar al que marcan en este link, sin embargo, los pasos que ahi marcan, no me funcionaron, y a pesar de haber bajado los drivers oficiales de Samsung, y luego encontre esta otra información, y de igual modo no me funcionó.

El detalle, despues de seguir buscando, es que se debe a un bug con el paquete the Gutenprint, la información la encontré aqui, y pues al desinstalar tal paquete, y al reinstalar el driver unificado de samsung desde AUR, todo funcionó de maravilla.

Como recomendación, la versión que instalé fue la 1 de aur, existen las versiones 4, pero estas, a mi, no me funcionaron.

viernes, 17 de julio de 2015

Mi aventura para elaborar un componente nuevo para Fritzing (el CPLD EPM240 de Altera)

(Ví que en una página mencionaron este pequeño aporte - ¡gracias!)
Pues antes que nada, el desarrollo de material para prácticas de Electrónica digital, requiere de un buen tiempo y en este caso, me enfrente a la situación de que el material debe contener la conexión de una CPLD, en especifico, de un tipo de tarjeta, una Altera, la EPM240.

El breakout que requiero es el siguiente:

Y con la finalidad de que se mostrará la forma de conectar esta CPLD con un protoboard, pense en usar la herramienta Fritzing, la cual, para los estudiantes que recien inician, les facilita mucho la visualización de conexión.

El problema es que este elemento no se encuentra en las bibliotecas de Fritzing, y pues los vendedores en aliexpress, mercadolibre y otros mas, no me dan las medidas de este elemento.

Ahora bien, siguiente los tutoriales de aquí, aquí y aquí  pude, después de algunas horas (inicie hoy a las 11 am y finalice mas o menos a las 2030 hrs) y con ayuda de Inkscape, logré el siguiente gráfico

El problema, después de terminar el gráfico, fue añadirlo al Fritzing, para lo cual, de acuerdo a los anteriores tutos, se puede tomar algún elemento y modificarlo para grabar nuestro nuevo componente.

De igual modo, un problema que encontré, es que la tarjeta contiene muchos terminales (aproximadamente 100), por lo cual me vi en la necesidad de usar un conector, sin embargo Fritzing contiene conectores con una capacidad máxima de 64 terminales. Para esto, de momento y de forma muy chapucera, deje muchos terminales sin conectar.

Otra situación que me encontre, es que Fritzing solo importa imágenes SVG con fuentes OCRA y/o tipo Droid, y lamentablemente mi PC no contaba con esa fuente; este problema se arregla agregando las fuentes requeridas (lee aquí y aquí).

Parecería que ya casi terminaba, pero me encontré con la situación de que a pesar de cambiar las fuentes que había anexado, las ubicaciones de los textos no correspondian con las terminales, y esto lo resolví al modificar una propiedad de los textos en Inkscape:


En el combobox espacio entre líneas, lo tenia a un porcentaje diferente al 100% y esto ocasionaba que al importar la imagen a Fritzing se modificaran las posiciones.

Ya con la imagen bien diseñada, ahora corresponde a la ubicación de los pines según su posición en la tarjeta y reutilizar aquellos que no se encuentran en la numeración. Esto si me llevo un tiempo ;)

Ya finalizado, ahora solo hay que jalar el componente nuevo y armar el proto, el resultado fue el siguiente (para un multiplexor de 4 a 1).

Gracias por leer y no aburrirse  ........

Grabando un CPLD Altera en Manjaro Linux de 64 bits

lunes, 13 de julio de 2015

GHDL en Manjaro Linux 64 bits y error sufijo de instrucción inválido para `push' (Solucionado)

Bueno, mientras mi esposa canta canciones rancheras, mi hija juega plantas contra zombies y mi bebe esta viendo la tv, yo me dada de topes por simular un codigo de VHDL con GHDL en mi lap viejita de 64 bits. El problema que tenia al tratar de analizar con ghdl un codigo que en Quartus II compila adecuadamente me salia lo siguiente en la consola
[miguel@casita PracticaMux]$ ghdl -a mux4_1tb.vhd 
mux4_1tb.s: Mensajes del ensamblador:
mux4_1tb.s:55: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:57: Error: sufijo de instrucción inválido para `pop'
mux4_1tb.s:555: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:602: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:663: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:724: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:785: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:846: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:887: Error: sufijo de instrucción inválido para `push'
mux4_1tb.s:929: Error: sufijo de instrucción inválido para `push'
ghdl: compilation error
El problema según lei en los foros de ghdl, se debe a que ghdl es un programa para 32 bits y el equipo que tengo tiene gcc de 64 bits, y buscando una solución encontre el wiki de UMHDL que está SourceForge y que es un IDE para trabajar de forma inicial con VHDL; en su wiki se indica lo siguiente de forma textual
"Possible problems in Linux 64-bits
1. Problem: in Linux 64-bits the following errors are got when compiling:
/home/myworkspace/e~and_gate.s: Assembler messages:
/home/myworkspace/e~and_gate.s:40: Error: invalid instruction suffix for 'push'
/home/myworkspace/e~and_gate.s:42: Error: invalid instruction suffix for 'pop'
Solution: the problem is that GHDL is a 32-bit program. The solution is to append some extra options when invoking to GHDL.
$ ghdl -a -Wa,--32 ...
$ ghdl -e -Wa,--32 -Wl,-m32 ...

However, UMHDL already checks the Operating System when executing and take it into account, so that errors should not happen.
"
A partir de esta indicación, no es necesario instalar entonces el IDE para compilar y simular un codigo de VHDL, es por ellos que de acuerdo a la wikibooks de vhdl (https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL/Ap%C3%A9ndices/Instalaci%C3%B3n_y_uso_de_GHDL)
Se puede simular de la forma
[miguel@casita PracticaMux]$ ghdl -a -Wa,--32 mux4_1.vhd
[miguel@casita PracticaMux]$ ghdl -a -Wa,--32 mux4_1tb.vhd
[miguel@casita PracticaMux]$ ghdl -e -Wa,--32 -Wl,-m32 mux4_1tb
[miguel@casita PracticaMux]$ ghdl -r mux4_1tb --vcd=mux4_1.vcd
[miguel@casita PracticaMux]$ gtkwave mux4_1.vcd
Los códigos son los siguientes
-- mux4.vhd
-- Multiplexor 4 a 1
-- Direcciona una de cuatro señales de entrada (d0 a d3) hacia la salida
-- dependiendo del estado de los bits de selecci´on

ENTITY mux4_1 is port(
 d0,d1,d2,d3 : in bit;
 --s    : in bit_vector (1 downto 0);
   s0,s1       : in bit;
 y    : out bit);
 END mux4_1;
 
architecture mux4to1 of mux4_1 is
begin
-- Asignaci´on de señales concurrentes
y<= ((not(s1)) and  (not(s0)) and d0)
 or ((not(s1)) and s0 and d1)
 or (s1 and (not s0) and d2)
 or (s1 and s0 and d3);
 end mux4to1;
--mux4_1tb.vhd
-- Multiplexor 4 a 1
-- Direcciona una de cuatro señales de entrada (d0 a d3) hacia la salida
-- dependiendo del estado de los bits de selecci´on

ENTITY mux4_1tb is
END mux4_1tb;

ARCHITECTURE muxtb OF mux4_1tb is
 COMPONENT mux4_1
 PORT(
 d0,d1,d2,d3 : in bit;
 --s    : in bit_vector (1 downto 0);
   s0,s1       : in bit;
 y    : out bit);
 END COMPONENT;

  SIGNAL d0,d1,d2,d3: bit;
  SIGNAL s0,s1: bit;
  SIGNAL y: bit;

 BEGIN
   u0: mux4_1 PORT MAP (d0,d1,d2,d3,s0,s1,y);
 d0 <= '1' after 0 ns, '0' after 5  ns, '1' after 10 ns, '0' after 15 ns;
        d1 <= '1' after 0 ns, '0' after 10 ns, '1' after 20 ns, '0' after 30 ns;
        d2 <= '1' after 0 ns, '0' after 20 ns, '1' after 40 ns, '0' after 60 ns;
  d3 <= '1' after 0 ns, '0' after 40 ns, '1' after 80 ns, '0' after 90 ns;

        s0 <= '0' after 0 ns, '0' after 1 ns;
        s1 <= '0' after 0 ns, '1' after 2 ns;
END muxtb;
La salida es la siguiente

viernes, 22 de mayo de 2015

usando printf y scanf en avrgcc con ATmega48

El siguiente codigo hace uso de la libreria usart.h y usart.c que estaban disponibles en el sitio de programacion de microcontroladores AVR de Shawn Johnson Lo interesante de este ejemplo, es el uso de las funciones estandar de C printf y scanf para el envio de cadenas preformateadas a través del puerto serie de este microcontrolador.
A continuación se muestran las fuentes utilizadas para este tipo de comunicacion
/*
 * En las opciones de compilación del linker
 * se deben agregar las siguientes lineas en eclipse
 *
 * -Wl, -u, vfprintf -lprintf_min, -u, vfscanf -lscanf_min -lm
 *
 * En la siguiente ruta
 * Propiedades del proyecto
 *  C/C++ Build
 *   Valores
 *    Toolsettings
 *     AVR C Linker
 *      General

  En codebloacks
Para agregarlas solo da clic derecho en el nombre del proyecto
elige la opcion que dice Properties....
En la ventana que se abre, da clic en el boton Project's Build options...
Te abre una nueva ventana
Da clic en el Tab Linker Setting
y del lado izquierdo encuentras las opciones del linker
quedan de la siguiente manera
-mmcu=atmega48
-Wl,-Map=$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).map,--cref
-u
vfprintf -lprintf_min
-u
vfscanf -lscanf_min -lm
 * */


#include <avr/io.h>
#define F_OSC 1000000UL
#include <util/delay.h>

#include "usart.h"

int main(void)
{
 char name[30];

 usart_init();

 puts("\n\r Enviando datos");
 puts("\n\r Mecatronica\n\r ITST\n\r");

 puts("Como te llamas?:\n\r");
 scanf("%s\n\r", name);

 printf(" Hola %s",name);

 while(1);
}

Librerias

/******************************************************************************
 * FileName:   usart.h
 * Overview:   Macros y prototipos de funciones para el USART0 en modo Asíncrono
 * Processor:  ATmel AVR con USART0
 * Compiler:   AVR IAR C y AVR GCC (WinAVR)
 * Author:     Shawn Johnson. http://www.cursomicros.com.
 *
 * Copyright (C) 2008 - 2013 Shawn Johnson. All rights reserved.
 *
 * License:    Se permiten el uso y la redistribución de este código con 
 *             modificaciones o sin ellas, siempre que se mantengan esta 
 *             licencia y las notas de autor y copyright de arriba.
 *****************************************************************************/

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#include <stdio.h>
/* Define la velocidad de transmisión del USART (en bits/segundo), si aún no 
 * ha sido definida.
 */
#ifndef USART_BAUD
#define USART_BAUD  9600UL
#endif

/* Usar kbhit para ver si hay algún dato en el buffer de recepción antes de
 * llamar directamente a la función getchar para evitar esperas innecesarias.
 */
#define  kbhit()     (UCSR0A & (1<,<RXC0))

/* Descomentar el siguiente #define para que la funcion 'getchar' haga eco de
 * los caracteres recibidos.
 */
//#define __GETCHAR_ECHO__

/* Macros para AVR GCC */
#if defined( __GNUC__ )
#ifdef putchar
#undef putchar
#endif
#ifdef getchar
#undef getchar
#endif
#endif

/* Definiciones de funciones */
void usart_init(void);
int putchar(int);
int getchar(void);

/******************************************************************************
 * FileName:   usart.c
 * Overview:   Implementa funciones para el USART0 en modo Asíncrono
 * Processor:  ATmel AVR con USART0
 * Compiler:   AVR IAR C y AVR GCC (WinAVR)
 * Author:     Shawn Johnson. http://www.cursomicros.com.
 *
 * Copyright (C) 2008 - 2013 Shawn Johnson. All rights reserved.
 *
 * License:    Se permiten el uso y la redistribución de este código con 
 *             modificaciones o sin ellas, siempre que se mantengan esta 
 *             licencia y las notas de autor y copyright de arriba.
 *****************************************************************************/

#include "usart.h"

//****************************************************************************
// Inicializa el USART0.
//****************************************************************************
void usart_init(void)
{
    /* Configurar baud rate   */
    UCSR0A |= (1<<U2X0); //modo2
    UBRR0 = F_CPU/(8*USART_BAUD)-1;
    
    /* Configurar modo de operación Asíncrono y formato de frame a
     * 8 bits de datos, 1 bit de stop y sin bit de paridad.  */
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
    
    /* Habilitar módulos Receptor y Transmisor  */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);

#if defined( __GNUC__ )
    /* Asociar las funciones 'putchar' y 'getchar' con las funciones de entrada
    * y salida (como printf, scanf, etc.) de la librería 'stdio' de AVR-GCC */
    fdevopen((int (*)(char, FILE*))putchar, (int (*)(FILE*))getchar);
#endif
}

//****************************************************************************
// Transmite el byte bajo de 'dato' por el USART
//****************************************************************************
int putchar(int dato)
{
    /* Esperar a que haya espacio en el buffer de transmisión */
    while ((UCSR0A & (1<<,UDRE0)) == 0 );

    /* Colocar dato en el buffer de transmisión */
    UDR0 = dato;
    return dato;
}

//****************************************************************************
// Recibe un byte de dato del USART
//****************************************************************************
int getchar(void)
{
    /* Esperar a que haya al menos un dato en el buffer de recepción */
    while ((UCSR0A & (1<<RXC0)) == 0 );   
    
    /* Leer y retornar el dato menos reciente del buffer de recepción */   
#if defined ( __GETCHAR_ECHO__ )
    return (putchar(UDR0));
#else
    return UDR0;
#endif
}

Paginas de referencia: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdio_1ga67bae1ad3af79809fd770be392f90e21.html
http://www.atmel.com/webdoc/AVRLibcReferenceManual/using_tools_1using_sel_gcc_opts.html#using_tools_1gcc_minusW

domingo, 12 de abril de 2015

Sensor Ultrasónico en Arduino sin pulseIn ni Interupciones

Este post es probable que no parezca interesante, pero tiene su gracia.

Arduino cuenta con intrucciones como micros(), millis() y seconds(); las cuales incrementan un contador desde que arranca el programa y de acuerdo a su resolución, el desbordamiento va desde minutos hasta días.

Por lo leido en los foros de Arduino, la función PulseIn, usada por algunos para la lectura de sensor ultrasonico.


El siguiente es un código que hice solo como prueba para no usar PulseIn, pero con la ayuda de la intrucción micros()


int trig = 7;
int echo = 6;
int led = 13;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (led, OUTPUT);
  

}
int count1=0, count2=0;
int valor;
void loop() {
  // put your main code here, to run repeatedly:
  count1 =count2 = 0;
  digitalWrite(trig,LOW);
  delay(1);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  
  
  while(!digitalRead(echo)){}
    count1 = micros();
  while(digitalRead(echo))
  {
  }
  count2 = micros();
  valor = count2-count1; 
  int cm = (valor/2)/29.1;
  Serial.print(valor);
  Serial.println(" ticks");
  Serial.print(cm);
  Serial.println(" cm");
  
  delay(250);
  digitalWrite(led,LOW);
}
Se realizo un comprativo entre este código y el que usa pulseIn, tal comparativo se utilizó un vaso con agua y en sensor como medido de distancia hacia el agua, la cantidad de muestras para ambos casos fue de 113 y se debe tomar en cuenta que la colocacion del sensor no fue la mas adecuada.

miércoles, 1 de abril de 2015

Manjaro Linux, casi sin problemas por el momento Intel graphics en Gateway Mx6947

Esta laptop viejita, desde la cual estoy escribiendo, aun funciona muy bien y tiene Manjaro Linux desde el 2013 y casi no ha dado problemas, solo uno con la tarjeta de video Intel que trae
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03) ,

ya que marcaba un error con ciertas aplicaciones, entre ellas
  •  scilab 
  • vlc con algunos videos 
  • captura de mi escritorio con gtkRecordMyDesktop 
Pero como hay de todo en el foro de ArchLinux (de donde viene Manjaro) encontre esto
https://wiki.archlinux.org/index.php/Intel_graphics#InstallationSNA issues 

 From man 4 intel: There are a couple of backends available for accelerating the DDX. "UXA" (Unified Acceleration Architecture) is the mature backend that was introduced to support the GEM driver model. It is in the process of being superseded by "SNA" (Sandybridge's New Acceleration). Until that process is complete, the ability to choose which backend to use remains for backwards compatibility. SNA is the default acceleration method in xf86-video-intel. If you are experience issues with SNA, try using UXA instead, which can be done by creating an X configuration file containing the following:
 /etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
 Identifier "Intel Graphics"
Driver "intel"
 Option "AccelMethod" "uxa"
EndSection 

El problema es que mi distro, no tiene en esa dirección el archivo :S

[miguel@casita ~]$ cd /etc/X11/xorg.conf.d/
[miguel@casita xorg.conf.d]$ ls 20-keyboard.conf 90-mhwd.conf@ 

Note que hay un link simbolico en la carpeta referida en el foro, por ello decidí echarme a la mar y navegar entre los directorios del etc

[miguel@casita xorg.conf.d]$ cd /etc/X11/
 [miguel@casita X11]$ ls mhwd.d/ xinit/ xorg.conf.d/
 [miguel@casita X11]$ cd mhwd.d/
[miguel@casita mhwd.d]$ ls intel.conf
[miguel@casita mhwd.d]$ less intel.conf 

 Aquí fue donde encontre el dichoso Option "AceelMethod" "sna" y lo cambie por uxa tal y como lo recomiendan y listo!!!!

incluso ya puedo correr el glxgear de open gl

Finalmente una imagen de mi lap viejita

jueves, 12 de marzo de 2015

Documentando con Doxygen Cabeceras

/** @file clk.h

@code #include  @endcode

@brief Macros para definir la frecuencia de oscilacion del reloj
principal
*/
#ifndef CLK_H
#define CLK_H




/**
 *  @name  Definitions for MCU Clock Frequency
 *  Adapt the MCU clock frequency in Hz to your target.
 *  Revisa las paginas 37-39
 */

#define F_CPU 16000000L ///< Frecuencia de 16MHz
#if F_CPU == 16000000L
#define ADC_PRESCALER 0x07  ///

Patebin link

Documentando con Doxygen programa Principal

Archivo Principal

/**@mainpage TecladoDriver.c
 * @brief Imprimir en un display de siete segmentos la tecla presionada por un teclado matricial
   @section intro
   Este programa imprime un numero desde un teclado matricial y lo pone en un display de siete segmentos de catodo comun
   es posible el uso de un display de anodo comun, a traves de una interfaz con un ULN2803
   @section Uso
   Solo se presiona una tecla del matricial y el numero aparece en el display
 * @author: Miguel Montiel
 
 */ 


#include 
#include "clk.h"
#include "keyb.h"
#include "sevseg.h"

/**
@file TecladoDriver.c
@brief Programa que escribe un numero a un display de 7 segmentos
@author Miguel Montiel
*/
int main(void)
{
	
	unsigned char tecla;
	
	_init_Teensyduino_internal_();
	vInitKeyPad();
	InitSegSeg();
	
	
    while(1)
    {
        //TODO:: Please write your application code 
		tecla = ui8_TestKeyPad();
		delay_ms(5);
		Print(tecla);
    }
}

domingo, 1 de marzo de 2015

Desde casa!!! Hace casi un año que no he escrito nada, y no por falta de quehacer, sino mas bien por exceso, espero retomar pronto mis notas del blog. Saludos