viernes, 24 de enero de 2014

Mudanza

Por si a alguien le interesa:
http://malbabu.x10.mx/

sábado, 3 de septiembre de 2011

Acabo de comprar los siguientes "juguetes"de Dangerous Prototypes:

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(),