domingo, 24 de septiembre de 2017

Baricentro de un triangulo escaleno (geometría analítica)



Recuperando un ATmega48PA con USBASP y AVRBur-o-matic en windows

Bueno sucede que un estudiante me dijo que tenia 3 circuitos atmega48pa que no los podia programar, y la cuestion es que se hizo bolas con los FUSES y por otra cosa que me dijo, habia conectado de forma incorrecta los micros.

En esta maquina desde la que escribo cuento con el programa AVRBurn-o-matic que es una interfaz para el AVRDUDE que viene con winAVR, sin embargo aqui no teniada dado de alta la programacion del atmega48pa, solo la del atmega48, los cuales tienen diferentes "signatures"

Como segurantemen en los fuses habia un problema con el socilador, lo que hago es poner un cristal de cualquier valor (que no sea mayor a 16MHz) en las terminales PB7 y PB6 con sus respectivos capacitores.

en cuanto al software hay que editar el archivo que se encuentra en C:/winavr/bin/avrdude.conf al agregar las siguientes lineas (http://electronics.stackexchange.com//questions/3721/avrdude-and-atmega48pa)

#------------------------------------------------------------
# ATmega48PA
#------------------------------------------------------------
part
    id               = "m48pa";
    desc             = "ATMEGA48PA";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
                     0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
                     0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode   = 0x59;
    signature        = 0x1e 0x92 0x0a;
    pagel            = 0xd7;
    bs2              = 0xc2;
    chip_erase_delay = 45000;
    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                       "x x x x  x x x x    x x x x  x x x x";

    chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                       "x x x x  x x x x    x x x x  x x x x";

    timeout        = 200;
    stabdelay        = 100;
    cmdexedelay        = 25;
    synchloops        = 32;
    bytedelay        = 0;
    pollindex        = 3;
    pollvalue        = 0x53;
    predelay        = 1;
    postdelay        = 1;
    pollmethod        = 1;

    pp_controlstack     =
    0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
    0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
    0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
    0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    resetdelay          = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
        paged           = no;
        page_size       = 4;
        size            = 256;
        min_write_delay = 3600;
        max_write_delay = 3600;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
    read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

    write           = "  1   1   0   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

    loadpage_lo    = "  1   1   0   0      0   0   0   1",
              "  0   0   0   0      0   0   0   0",
              "  0   0   0   0      0   0  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage    = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x      x   x   x   x",
              " a7  a6  a5  a4     a3  a2   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 5;
    blocksize    = 4;
    readsize    = 256;
      ;
    memory "flash"
        paged           = yes;
        size            = 4096;
        page_size       = 64;
        num_pages       = 64;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0x00;
        readback_p2     = 0x00;
        read_lo         = "  0   0   1   0    0   0   0   0",
                          "  0   0   0   0    0 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        read_hi         = "  0   0   1   0    1   0   0   0",
                          "  0   0   0   0    0 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        loadpage_lo     = "  0   1   0   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        writepage       = "  0   1   0   0      1   1   0   0",
                          "  0   0   0   0      0 a10  a9  a8",
                          " a7  a6  a5   x      x   x   x   x",
                          "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 6;
    blocksize    = 64;
    readsize    = 256;
      ;

    memory "lfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "hfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  1 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "efuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   x x x x  x x x o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 1 0 0",
                          "x x x x  x x x x   x x x x  x x x i";
      ;

    memory "lock"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   x x o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                          "x x x x  x x x x   1 1 i i  i i i i";
      ;

    memory "calibration"
        size            = 1;
        read            = "0  0  1  1   1  0  0  0   0  0  0  x   x  x  x  x",
                          "0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o";
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;
  ; 

Pero esto no basta, ya que el AVRBURN-o-matic accesa a su menu desde un archivo XML que se encuentra en C:\Program Files (x86)\AVR Burn-O-Mat/AVR8_Burn_O_Mat_config.xml

y se agregan las siguientes lìneas

           
     
     
     
     
     
     
     
     

     
     
     
     
     
     
     
     

     
     
     
     
     
     
     
     

     
       
       
       
       
       
       
       
     


     

   


Ejemplo de uso de condiciones no importa en Mapas de Karnaugh de 4 variables




jueves, 25 de mayo de 2017

icestorm, apio-ide y icestudio en Fedora 25

Animado por la adquisición de una tarjeta icestick, así como lo que ha compartido @obijuan_cube sobre el mundo de las FPGA's Libres, me he animado a realizar la instalación del software para realizar las prácticas para mis estudiantes de electrónica digital del ITS Teziutlán, naturalmente apoyado del material que en FPGAWARS existe.

No me queda mas que decir que, la instalación es muy cómoda para el sistema Fedora 25, en relación al iceStorm de Clifford Wolf y Mathias Lasser, las instrucciones para la instalación es muy simple, tal cual están los comandos en su sitio (git clone, make y make install), funcionan perfectamente. Por otro lado, solo unos pequeños traspiés en la instalación de ATOM,  el IDE para trabajar con el ecosistema APIO, que para FEDORA, se debe descargar el RPM y realizar la instalación por medio de dnf

sudo dnf install ./atom.x86_64.rpm

ademas, para que funcione adecuadamente la simulación en APIO-IDE, es necesario realizar un link simbólico a la librerias del bzip2 de la forma siguiente

sudo ln -s /usr/lib64/libbz2.so.1.0.6 /usr/lib64/libbz2.so.1.0

Para el ICESTUDIO, elegi usar el appimage x64 que viene en formato .ZIP, solo se trata de descomprimir y ejecutar, creo mas sencillo no puede ser!!!

Les dejo algunos pantallazos


Referencias
http://www.clifford.at/icestorm/
https://github.com/FPGAwars/apio-ide/wiki
https://atom.io/
https://fedoramagazine.org/install-atom-fedora/
https://github.com/wireapp/wire-desktop/issues/532
https://github.com/FPGAwars/icestudio
https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki

martes, 23 de agosto de 2016

Definiendo pines para GAL16V22 de Lattice

Esta prueba la hice desde una box Fedora, instalando el software de Lattice para programar sus dispositivos Lógicos.

En ABEL, la definición de los pines a utilizar cuando se programa una GAL, se hace desde el inicio, sin embargo, en VHDL la cosa no está tan simple, leyendo varios foros, encontre que habria que usar unas sentencias pero no se indica de forma muy genérica.

El código que se presenta a continuación, es un divisor de frecuencias, que tiene dos entradas y una salida, nótese que en este caso, se asigna al pin 6 la entrada de reset para el reloj, y que la declaración de los atributos LOC se hace en el ámbito del instanciamiento de la Entidad que se crea.

Esto solo lo he probado con Lattice y una GAL22V10 simulada en Proteus.

-------------------------------------------------------------------------------
--
-- Company :
-- Engineer: miguel
--
-- Create Date:    04/11/2015 04:50:28
-- Project Name:   clk381Hz
-- Module Name:    clk381Hz.vhd
-- Description:
--
-- Additional Comments:
--
-------------------------------------------------------------------------------

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

entity clk381Hz is
    Port (
        entrada: in  STD_LOGIC;
        reset  : in  STD_LOGIC;
        salida : out STD_LOGIC
    );

attribute LOC: string;
attribute LOC of reset : signal is "6";


end clk381Hz;



architecture arq1 of clk381Hz is
    signal temporal: STD_LOGIC;
    signal contador: integer range 0 to 250 := 0;
begin
    divisor_frecuencia: process (reset, entrada) begin
        if (reset = '0') then
            temporal <= '0';
            contador <= 0;
        elsif (entrada 'event and entrada = '1') then
            if (contador = 250) then
                temporal <= NOT(temporal);
                contador <= 0;
            else
                contador <= contador+1;
            end if;
        end if;
    end process;
    
    salida <= temporal;
end arq1;

lunes, 22 de agosto de 2016

Ecuaciones de Latex en Inkscape

Inkscape es un software de dibujo vectorial con licencia libre (GNU GPL V2), y por medio de esta herramienta, es posible el incrustrar ecuaciones en formato Latex, en un gráfico.

La realización de esto, es posible a través de el script diseñado dor Julien Vitard, quien, desde un repo de GitHub, comparte al mundo entero este aporte.

La instalación es muy sencilla, solo se tiene que clonar el repo de github con la consola

$ git clone https://github.com/julienvitard/eqtexsvg.git
 
y posteriormente, se copia los archivos a la ruta
 
$ sudo cp *  /usr/share/inkscape/extensions/
 
Se abre inkscape y el resultado es genial!! 

Ecuaciones de Latex en Inkscape

Inkscape es un software de dibujo vectorial con licencia libre (GNU GPL V2), y por medio de esta herramienta, es posible el incrustrar ecuaciones en formato Latex, en un gráfico.

La realización de esto, es posible a través de el script diseñado dor Julien Vitard, quien, desde un repo de GitHub, comparte al mundo entero este aporte.

La instalación es muy sencilla, solo se tiene que clonar el repo de github con la consola

$ git clone https://github.com/julienvitard/eqtexsvg.git
 
y posteriormente, se copia los archivos a la ruta
 
$ sudo cp *  /usr/share/inkscape/extensions/
 
Se abre inkscape y el resultado es genial!! 

sábado, 13 de agosto de 2016

Fritzing Versión 0.9.3no inicia en Fedora 23, 24 y 25 (Actualizado)

Al desempaquetar la nueva versión de Fritzing en Fedora 23, y ejecutar el binario, me indica el siguiente error

Fritzing: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory

Este error sale si, no tienes instaladas las openssl-devel en tu sistema, sin embargo si lo tengo instalado, el problema surge como indicación de Bug en https://github.com/fritzing/fritzing-app/issues/3245, donde se indica que hay una librería que debe ser borrada de la carpeta lib, en mi caso tuve lo siguiente

lib]$ ls libg*
libgit2.so  libgit2.so.0.23.4  libgit2.so.23

Procedi a borrar todo lo indicado en la pagina de issues de github
lib]$ rm libgit2.so*

finalmente, revisar si tenia instalado, ademas de openssl-devel, libgit2-devel
realizado esto, Fritzing vuelve a correr.
***************************************************************************
En Fedora 25 Fritzing requiere de libgit2.so.23 y la Fedora contiene libgit2.so.24 por lo cual no responde de forma adecuada marcando el siguiente error


./Fritzing: error while loading shared libraries: libgit2.so.23: cannot open shared object file: No such file or directory

Para arreglarlo se tiene que crear un enlace simbólico, de este modo Fritzing vuelve a funcionar


$sudo ln -s /lib64/libgit2.so.0.24.6 libgit2.so.23

La fuente original la puedes consultar en:
https://github.com/fritzing/fritzing-app/issues/3289

sábado, 7 de mayo de 2016

Scilab -Xcos - Modelica en Fedora 23

Para hacer funcionar los ejemplos que trae Scilab de Modelica, se requiere de un compilador de C, pero ademas de eso se debe instalar con dnf los siguientes:
  •  scilab-devel 
  • rpm-builds 
 Ya que de otro modo, las fallas que provoca son
  1. fatal error: scicos_block.h: No such file or directory 
  2. gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory 

Referencias

  • https://github.com/copiousfreetime/hitimes/issues/54
  • https://bugzilla.redhat.com/show_bug.cgi?id=1180162 
  • http://scilab.ninja/scilab-recipe-1-introduction-to-scilabscicos-or-xcos/

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.