Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

jueves, 22 de octubre de 2009

Karmic Koala: Spartan 3E Starter Kit y cable usb

El problema fue que al actualizar a Karmic Koala, me dejo de detectar la tarjeta. Que es lo que pasa cuando conectamos la Tarjeta a la PC:

1.- Cuando conectamos la tarjeta a un puerto USB, udev detecta el dispositivo.
2.- Ya que lo detecto el siguiente paso es que le actualize el firmware con fxload (según las reglas que tenga para dicho dispositivo, y se encuentran en el archivo /etc/udev/rules.d/xusbdfwu.rules).
3- Si tuvo exito se enciende un led de color verde que se encuentra a lado derecho del conector usb de la tarjeta y además al hacer lusb veremos que que el dispositivo lo identifica como 03fd:0008, en el caso contrarío veremos 03fd:000d.

¿Como solucionar este problema?

En caso de que hicieron una actualización de Jaunty a Karmic:

1.- Tienen que editar el archivo de reglas, que se encuentra en /etc/udev/rules.d

sudo gedit /etc/udev/rules.d/xusbdfwu.rules

Y reemplazar todos los $TEMPNODE por $tempnode

2.- Reinicar el servicio udev

sudo service udev restart o sudo /etc/init.d/udev restart

En caso de ser una instalación nueva:

0.- Requisitos: Tener instaldo el ISE Webpack y los paquetes fxload, libusb-dev y el build-essential.

sudo apt-get install fxload libusb-dev build-essential


1.- Suponiendo que ya tenemos instalado el ISE Webpack 11.1 (ó el 10.x), nos movemos al la ruta donde quedó instalado.

cd /ruta_instalación_Xilinx/11.1/ISE/bin/lin/ o cd /ruta_instalación_Xilinx/11.1/ISE/bin/lin64/

Ahí encontraremos los siguientes archivos

$ ls *.hex
xusbdfwu.hex xusb_emb.hex xusb_xlp.hex xusb_xp2.hex xusb_xpr.hex xusb_xse.hex xusb_xup.hex

Los cuales copiaremos a /usr/share

sudo cp xusb*.hex /usr/share/

2.- Enseguida editamos el archivo xusbdfwu.rules

gedit xusbdfwu.rules
# version 0003
SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xup.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_emb.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xlp.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0013", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xp2.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0015", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xse.hex -D $TEMPNODE"


Cambiando $TEMPNODE por $tempnode, si lo dejan tan y como esta, no les va a funcionar. El contenido les debe de quedar algo como:

# version 0003 SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xup.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_emb.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xlp.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0013", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xp2.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0015", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xse.hex -D $tempnode"

3.- Ya que lo modificamos lo copiamos a /etc/

sudo cp xusbdfwu.rules /etc/udev/rules.d/

4.- reiniciamos el servicio udev

sudo service udev restart o sudo /etc/init.d/udev restart

5.- Ahora nos movemos al $HOME creamos una carpeta tmp

cd
mkdir tmp

cd tmp

Vamos a http://www.rmdir.de/~michael/xilinx/

Y descargamos de ahí el archivo usb-driver-HEAD.tar.gz en la carpeta que acabamos de crear

6.- estando en tmp descomprimimos el archivo y entramos al directorio recién creado y ejecutamos el make

tar -xvzf usb-driver-HEAD.tar.gz
cd usb-driver
make

7.- Lo anterior nos generará dos archivos, libusb-driver-DEBUG.so y libusb-driver.so los cuales copiaremos a /usr/lib/

sudo cp *.so /usr/lib/

8.- Ya podemos conectar nuestra tarjeta al la PC con el Karmic Kola y ver

$ lsusb | grep Xilinx Bus 001 Device 007: ID 03fd:0008 Xilinx, Inc.

en lugar del

$ lsusb | grep Xilinx
Bus 001 Device 007: ID 03fd:000d Xilinx, Inc.


Que al actualizar de versión me venía saliendo

En la versión 11.1 para que el impact use el libusb-driver.so en vez de los windrvr, ya no es necesario hacer lo de "export LD_PRELOAD=/ruta/libusb-driver.so" antes de ejecutarlo.


lunes, 15 de junio de 2009

Segundo intento sdcc (12f675)

Mi segunda prueba, me demostró que aunque el sdcc me evite usar el ensamblador me siento más comodo programando en ensamblador, la costumbre es más fuerte.

En este caso estoy utilizando el conversor de ADC del PIC 12F675 para enviar la lectura de una foto resistencia (LDR) a la PC por medio de RS232

/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include

/* ----------------------------------------------------------------------- */
/* Bits de configuración: adapte los parámetros a su necesidad */
typedef unsigned int word;
word at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _CPD_OFF;

unsigned char Count,Temp,SerBuf;

#define Tx 1
#define Rx 2

void baud(unsigned char baudrate)
{
_asm
baud:
movlw D'16'
movwf _Count
baud1: decfsz _Count,F
goto baud1

half_baud:
movlw D'16'
movwf _Count
hbaud1: decfsz _Count,F
goto hbaud1
_endasm;
}

void recv_suart()
{
_asm
inch_n: btfsc GPIO,Rx
goto inch_n
movlw 8
movwf _Temp
clrf _SerBuf
call half_baud
;btfsc GPIO,Rx
;goto inch_n
inch_n1:
call baud
bcf STATUS,0
rrf _SerBuf,F
btfsc GPIO,Rx
bsf _SerBuf,7
decfsz _Temp,F
goto inch_n1
call baud
_endasm;
}

void send_suart()
{
_asm
outch_n:
;movwf _SerBuf
movlw 8
movwf _Temp
bcf GPIO,Tx
call baud
outch_n1:
rrf _SerBuf,F
btfss STATUS,0
bcf GPIO,Tx
btfsc STATUS,0
bsf GPIO,Tx
call baud
decfsz _Temp,F
goto outch_n1

rrf _SerBuf,F
bsf GPIO,Tx
call baud
call baud
_endasm;

}
void on_adc() {
_asm
movlw 0x01
movwf ADCON0
_endasm;
}

void off_adc() {
_asm
clrf ADCON0
_endasm;
}

void read_adc() {
_asm
bsf ADCON0,1
waitfc: btfsc ADCON0,1
goto waitfc
_endasm;
}
void initPIC()
{
/*Poner a Ceros el Puerto*/
_asm
BANKSEL GPIO
movlw 0x02
movwf GPIO
movlw 0x07
movwf CMCON
BANKSEL ANSEL
movlw 0x11
movwf ANSEL
movlw 0x0d
movwf TRISIO
BANKSEL GPIO
_endasm;
}

/*Rutina de Retardo*/
void delay(int ret) {
int r;
for(r=0;r<=ret;r++) { } } void main() { initPIC(); SerBuf=0x70; send_suart(); SerBuf=0x69; send_suart(); SerBuf=0x63; send_suart(); SerBuf=0x31; send_suart(); SerBuf=0x32; send_suart(); SerBuf=0x66; send_suart(); SerBuf=0x36; send_suart(); SerBuf=0x37; send_suart(); SerBuf=0x35; send_suart(); SerBuf=0x0D; send_suart(); recv_suart(); send_suart(); while(1){ on_adc(); read_adc(); off_adc(); SerBuf=ADRESH; send_suart(); GP5=1; delay(20000000); GP5=0; delay(20000000); } }
Que es lo que hago:

1.- Envió a la PC pic12f675
2.- Espero a recibir cualquier caracter para iniciar las conversiones
3.- Después de hacer una lectura y enviar el resultado a la PC prendo y apago un led

Necesito más práctica para abandonar el uso del ensamblador cuando use el sdcc.

viernes, 2 de mayo de 2008

Termómetro

Ahora en aarmagnac.no-ip.org:1540 tengo un termometro realizado con un PIC 12f683 y un LM35 conectado al PC por medio del puerto serie. Cada 5 minutos se actualiza.

El programa del PIC lo hice para probar la programación en C de estos microcontroladores ya que siempre los había programado en ensamblador.

El programa de la PC está realizado en C++ el cual es ejecutado por medio del cron cada 5 minutos, generandome la página web que se puede ver en la página.

viernes, 1 de febrero de 2008

GHDL con las librerías UNISIM de Xilinx

¿Porqué usar ghdl?. En primer lugar surgió de la necesidad de poder realizar simulaciones de mi código de VHDL en linux debido a que el simulador del ISEWebPACK 9.1 y 9.2 de Xilinx no se digna en trabajar, siempre me manda el error 607 el cual si no es mi culpa, como lo puedo demostrar, pues fácilmente, abrí el ISE e inicié un nuevo proyecto pero en esta ocasión que fueran esquemáticos y no vhdl, hice una "and" y lo traté de simular y me arrojó el mismo error. Conclusión no es error mío es de la herramienta, ellos mismos está diciendo que no saben como construir una "and", jejejeje.

En segundo lugar, tenía que utilizar las librerías unisim:

Library UNISIM;
use UNISIM.vcomponents.all;

Voy a suponer que tenemos instalado en nuestro sistema alguna de las dos versiones anteriores del ISEWebPACK.

Desde la consola primero nos creamos una carpeta para ubicar nuestro código vhdl y dentro de ella crearemos una carpeta llamada unisim.

$ mkdir vhdl
$ mkdir vhdl/unisim

Ahora copiamos el contenido de la carpeta vhdl/src/unisims en el directorio del ISEWebPack, que en mi caso se encuentra en /opt/Xilinx92i/vhdl/src/unisims/, al directorio unisim que acabamos de crear.

$ cp /opt/Xilinx92i/vhdl/src/unisims/* vhdl/unisim/

Ahora nos movemos a la carpeta vhdl/unisim/

$ cd vhdl/unism

y compilamos estas librerías con

~/vhdl/unisim$ ghdl -a --work=unisim --ieee=synopsys -fexplicit unisim_VCOMP.vhd
~/vhdl/unisim$ ghdl -a --work=unisim --ieee=synopsys -fexplicit unisim_SMODEL.vhd
~/vhdl/unisim$ ghdl -a --work=unisim --ieee=synopsys -fexplicit unisim_VPKG.vhd

~/vhdl/unisim$ ghdl -a --work=unisim --ieee=synopsys -fexplicit --warn-no-vital-generic unisim_VITAL.vhd
unisim_VITAL.vhd:150533:18:warning: universal integer bound must be numeric literal or attribute
unisim_VITAL.vhd:176564:57: variable "write_a_write_b" is not visible here
unisim_VITAL.vhd:176565:57: variable "read_a_write_b" is not visible here
unisim_VITAL.vhd:176566:57: variable "write_a_read_b" is not visible here
unisim_VITAL.vhd:176567:57: variable "write_b_write_a" is not visible here
unisim_VITAL.vhd:176568:57: variable "read_b_write_a" is not visible here
unisim_VITAL.vhd:176569:57: variable "write_b_read_a" is not visible here
/usr/lib/ghdl/bin/ghdl: compilation error
Observamos que nos manda un error, pero no es de preocuparse es solo cuestion de abrir el archivo unisim_VITAL.vhd y comentar las líneas que nos indica (176564,176565,176566,176567,176568,176569).
Las líneas en cuestion son:
variable Write_A_Write_B : memory_collision_type := Write_A_Write_B;
variable Read_A_Write_B : memory_collision_type := Read_A_Write_B;
variable Write_A_Read_B : memory_collision_type := Write_A_Read_B;
variable Write_B_Write_A : memory_collision_type := Write_B_Write_A;
variable Read_B_Write_A : memory_collision_type := Read_B_Write_A;
variable Write_B_Read_A : memory_collision_type := Write_B_Read_A;

En este punto si volvieramos a tratar de compilar nos arrojaría el mismo error sólo que en líneas distintas.

unisim_VITAL.vhd:188630:57: variable "write_a_write_b" is not visible here
unisim_VITAL.vhd:188631:57: variable "read_a_write_b" is not visible here
unisim_VITAL.vhd:188632:57: variable "write_a_read_b" is not visible here
unisim_VITAL.vhd:188633:57: variable "write_b_write_a" is not visible here
unisim_VITAL.vhd:188634:57: variable "read_b_write_a" is not visible here
unisim_VITAL.vhd:188635:57: variable "write_b_read_a" is not visible here

Por lo tanto sería buena idea comentarlas también, ya sea que busquemos en el archivo por "variable Write_A_Write_B : memory_collision_type := Write_A_Write_B;" , comentar esta línea y las subsecuentes o movernos hasta la línea indicada que sería la 188630 y comentarlas.

Hecho lo anterior volvemos a compilar con:
ghdl -a --work=unisim --ieee=synopsys -fexplicit --warn-no-vital-generic unisim_VITAL.vhd

Ya compilado nos retachamos a la carpeta vhdl ($ cd ..) para empezar a realizar nuestras pruebas, en donde compilaremos nuestros proyectos con:

ghdl -a --ieee=synopsys -Punisim -fexplicit

jueves, 2 de agosto de 2007

Puerto Paralelo desde la shell de linux

También podemos trabajar con el puerto paralelo desde la shell de Linux, para ello tenemos las funciones outb e inb. Para ejecutar estas instrucciones es necesario ser root.

outb puerto dato; Para enviar al Puerto y
inb puerto ;Para leer el puerto.

Hay que animarse a probar, ¿que es lo peor que puede pasar?.

Para probar con leds se puede emplear el CI ULN2803 que es un arreglo de 8 NPN transistores con la configuración Darlington.

miércoles, 1 de agosto de 2007

Puerto Paralelo con Freepascal en Linux

Ahora si que al grano, para poder escribir y leer datos del puerto paralelo de nuestra PC en linux usando freepascal tenemos que declarar que vamos a usar la librería oldlinux la cual nos dará acceso a las instrucciones ioperm, WritePortB, ReadPortB que nos ayudará en nuestro propósito de controlar este puerto.

program pp;
uses oldlinux;

begin
ioperm(888,3,1); {Para dar permisos al puerto}
WritePortB(888,0); {Para escribir en el puerto}
ReadPortB(888); {Para leer el puerto o el estado del puerto}
Writeln(ReadPortB(888));
ioperm(888,3,0); {Quitamos los permisos al puerto}
end.

El numero 888 corresponde al 0x378 que es el registro de datos del puerto paralelo, enseguida tenemos los registro de estado y de control.

Con lo cual podemos hacer lo que deseemos sobre el puerto. Como manejar una carga o varias como se muestra en la siguiente figura.