Por si a alguien le interesa:
http://malbabu.x10.mx/
viernes, 24 de enero de 2014
sábado, 3 de septiembre de 2011
CoolRunnerII CPLD development board:
FT2232 breakout board:
Posteriormente estare poniendo entradas acerca de su uso,
domingo, 13 de abril de 2008
Controlando el puerto paralelo en linux III
En las entradas anteriores hemos visto 4 ejemplos de como controlar el puerto paralelo, esos ejemplos estan escritos en C, a continuacion pongo un ejemplo de como controlar el puerto con Gambas:
' Gambas module file
puerto AS File
dato AS Byte
CONST pin12 AS Byte = 32
CONST pin10 AS Byte = 64
x AS Byte
PUBLIC SUB Main()
DIM i AS Integer
WHILE (pin10 AND dato) <> pin10
puerto = OPEN "/dev/port" FOR READ WRITE
SEEK #puerto, 888
x = 0
WRITE #puerto, x
CLOSE puerto
puerto = OPEN "/dev/port" FOR READ WRITE
SEEK #puerto, 889
READ #puerto, dato
CLOSE puerto
IF (pin12 AND dato) = pin12
x = 1
FOR i = 1 TO 8 STEP 1
puerto = OPEN "/dev/port" FOR READ WRITE
SEEK #puerto, 888
WRITE #puerto, x
CLOSE puerto
SLEEP 1
x = x * 2 + 1
NEXT
ENDIF
WEND
END
El ejemplo anterior solo funciona si el ejecutable lo ejecutamos como root, en este ejemplo accedemos al puerto por medio de /dev/port casi de la misma forma que lo haciamos en C. Por medio de /dev/port podemos controlar el puerto desde casi cualquier lenguaje de programacion, solo lo abrimos como un archivo y leemos y ecribimos en el.
miércoles, 9 de abril de 2008
Controlando el puerto paralelo en linux II
En la entrada anterior puse 2 ejemplos de como controlar el puerto paralelo, en esta entrada pondre otros 2 ejemplos.
El siguiente ejemple es:
#include <stdlib.h>
#include <parapin.h>
#include <unistd.h>
int i;
main () {
pin_init_user(LPT1);
pin_output_mode(LP_DATA_PINS);
pin_input_mode(LP_PIN10 |LP_PIN12);
while( !pin_is_set(LP_PIN10)) {
clear_pin(LP_DATA_PINS);
if ( pin_is_set(LP_PIN12)){
for (i = 2; i <= 9; i++){ set_pin(LP_PIN[i]); usleep(200000); } } } }
Lo guardamos como prueba.c y compilamos con :
gcc -o prueba prueba.c -lparapin
En los 3 ejemplos que hemos visto hasta ahora es necesario el ejecutarlos como root, si queremos hacer uso del puerto paralelo como usuarios normales podemos hacer uso de ioctl() y de ppdev, de la siguiente forma:
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/ppdev.h>
#include <unistd.h>
#define pin12 32
#define pin10 64
int fd;
int i, x=0, dato=1;
main (){
fd = open("/dev/parport0", O_RDWR );
ioctl(fd, PPCLAIM); //pido puerto
ioctl(fd, PPWDATA, &i); // escribo puerto
while( (pin10 & dato) != pin10){
x = 0;
ioctl(fd, PPWDATA, &x); //escribo puerto
ioctl(fd, PPRSTATUS, &dato); //Leo puerto
if ((pin12 & dato) == pin12){
for ( i = 1; i <= 8; i++){ x = x*2+1; ioctl(fd, PPWDATA, &x); //escribo puerto usleep(200000); } } } close(fd); }
Si queremos saber mas de como acceder mas al puerto paralelo por medio de ppdev ver este enlace
lunes, 7 de abril de 2008
Controlando el puerto paralelo en linux
El controlar el puerto paralelo en linux es algo relativamente sencillo y existen varias formas de hacerlo, en los siguientes ejemplos supondré que tenemos conectados una serie de leds en las terminales 2 al 9 (data port) del puerto paralelo para ser usados como salidas, asi como 2 push boton (PB) en las terminales 10 y 12 para usarlos como entradas.
Todos los ejemplos que ponga haran lo siguiente: al presionar el PB en el pin 12 se empezaran a prender los leds puestos en los pines 2 al 9, al llegar al pin 9 se volverán a apagar, al presionar el PB en el pin 10 se terminara el programa.
El primer ejemplo es usando inb y outb:
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>
#define puerto 0x378
int i, x, dato, pin12, pin10;
main(){
pin12 = 32;
pin10 = 64;
ioperm(puerto,2,1);
while ((pin10 & dato) != pin10) {
x=0;
outb(x,puerto);
dato = inb(puerto + 1);
if ((dato & pin12) == pin12)
for ( i = 1; i <= 9; i++) {
outb(x,puerto);
x = x*2+1;
usleep(200000);
}
}
ioperm(puerto,2,0);
}
ioperm(puerto,2,1): Nos sirve para pedir "permiso" para hacr uso del puerto, el 2 indica el rango de direcciones que queremos usar, en nuestro caso son las direcciones 0x378 y 0x379, el 1 indica que estamos "habilitando" el puerto.
Para ver si se activado algún PB que tenemos en los pines 10 y 12 hacemos uso de una mascara.
Otro forma de acceder al puerto paralelo lo veremos con el siguiente ejemplo:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#define puerto 0x378
#define pin12 32
#define pin10 64
int i ,fd, dato, x;
main (){
while ((pin10 & dato) != pin10) {
x = 0;
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto + 1, 1);
read(fd,&dato,1);
close(fd);
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto, 1);
write(fd,&x,1);
close(fd);
if ((dato & pin12) == pin12)
for ( i = 1; i <= 9; i++) {
x = x*2+1;
usleep(200000);
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto, 1);
write(fd,&x,1);
close(fd);
}
}
}
En el ejemplo anterior hacemos uso del nodo /dev/port, hacemos uso de lseek() para posicionarnos en la dirección del puerto paralelo. Una vez que lo tengamos abierto funciona como si estuviéramos escribiendo o leyendo un archivo cualquiera.
Los 2 ejemplos anteriores solo nos sirven cuando los ejecuta el usuario root.
martes, 18 de marzo de 2008
Otro ejemplo de ncurses.
#include <ncurses.h>
main () {
char nombre[40];
char apellido[40];
initscr();
start_color();
init_pair(1,COLOR_RED,COLOR_YELLOW);
init_pair(2,COLOR_BLACK,COLOR_RED);
attron(COLOR_PAIR(1));
move(2,10);
printw("Dime tu nombre\n");
move(3,10);
scanw("%s",nombre);
attroff(COLOR_PAIR(1));
attron(COLOR_PAIR(2));
mvprintw(4,10,"Ahora dime tu apellido:\n");
mvscanw(5,10,"%s", apellido);
attroff(COLOR_PAIR(2));
mvprintw(6,10,"Tu nombre completo es: %s %s\n",nombre,apellido);
refresh();
getch();
endwin();
return(0);
}
En este ejemplo hacemos uso de la siguientes funciones:
start_color(); Inicializamos los colores :)
init_pair(1,COLOR_RED,COLOR_YELLOW); Establecemos que en el pair 1 la letra es de color rojo con fondo amarillo.
init_pair(2,COLOR_BLACK,COLOR_RED); En el pair 2 la letra sera de color negro y el color de fondo rojo.
attron(COLOR_PAIR(1)); Activamos el pair 1.
move(y, x); Esta función es como el gotoxy() de Borland C, con la diferencia de que en move() es priemro la y (columnas) y luego la x (fila).
mvprintw(y,x,"lo que sea"); Esta función viene siendo la unión de move() y printw().
mvscanw(y,x,loquesea); Esta función viene siendo la unión de move() y scanw().
attroff(COLOR_PAIR(x)); Desactivamos el pair x.
El resto de funciones: tarea para la casa :)
martes, 4 de marzo de 2008
Segundo ejemplo con Ncurses
#include
int main () {
char nombre[40];
char apellido[40];
initscr();
printw("Dime tu nombre\n");
scanw("%s",nombre);
printw("Ahora dime tu apellido:\n");
scanw("%s", apellido);
printw("Tu nombre completo es: %s %s\n",nombre,apellido);
refresh();
getch();
endwin();
return(0);
}
En el ejemplo anterior hacemos uso de scanw(), la cual funciona de manera similar a scanf(),