Hola a todos,
Estoy usando un powertip pc1602f directamente conectado al puerto paralelo del pc utilizando el esquema este:
http://www.beyondlogic.org/parlcd/parlcd.htm
Todo bien lo energizo el lcd y me muestra la primera fila con bloques negros, hasta ahí bien pero ahora quiero mandar información por el puerto paralelo.
Si mirais la página vereis que hay un código fuente para mandar información al lcd, pero usa librerias de windows
Dejo mi código intentado convertido en linux.
Compila perfectamente pero cuando lo quiero provar lo ejecuto como root y me arroja esto
Mirando el dmesg me encuentro con esto.
Dejo el dmesg del ttyS*
PD:És el hilo de http://foro.elhacker.net/electronica/inicializar_lcd_linux-t299539.0.html ; pero puesto aquí haber si me podeis ayudar.
Estoy usando un powertip pc1602f directamente conectado al puerto paralelo del pc utilizando el esquema este:
http://www.beyondlogic.org/parlcd/parlcd.htm
Todo bien lo energizo el lcd y me muestra la primera fila con bloques negros, hasta ahí bien pero ahora quiero mandar información por el puerto paralelo.
Si mirais la página vereis que hay un código fuente para mandar información al lcd, pero usa librerias de windows
Dejo mi código intentado convertido en linux.
Código (c) [Seleccionar]
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define PORTADDRESS 0x3f8
#define DATA PORTADDRESS+0
#define STATUS PORTADDRESS+1
#define CONTROL PORTADDRESS+2
main(int argc, char **argv)
{char string[] = {"Testing 1,2,3"};
int count;
int len;
char init[10];
init[0] = 0x0F; /* Init Display */
init[1] = 0x01; /* Clear Display */
init[2] = 0x38; /* Dual Line / 8 Bits */
if (ioperm(PORTADDRESS,1,1))
fprintf(stderr, "No se puede acceder al: %x\n", PORTADDRESS), exit(1);
outb(CONTROL, inb(CONTROL) & 0xDF);
outb(CONTROL, inb(CONTROL) & 0x08);
for (count = 0; count <= 2; count++)
{
outb(DATA, init[count]);
outb(CONTROL,inb(CONTROL) | 0x01);
sleep(20);
outb(CONTROL,inb(CONTROL) & 0xFE);
sleep(20);
}
outb(CONTROL, inb(CONTROL) & 0xF7);
len = strlen(string);
for (count = 0; count < len; count++)
{
outb(DATA, string[count]);
outb(CONTROL,inb(CONTROL) | 0x01);
sleep(2);
outb(CONTROL,inb(CONTROL) & 0xFE);
sleep(2);
}
}
Compila perfectamente pero cuando lo quiero provar lo ejecuto como root y me arroja esto
Código (bash) [Seleccionar]
root@ubuntu:/media/E80C-30D5/LCD/build# ./lcd
Fallo de segmentación (`core' generado)
root@ubuntu:/media/E80C-30D5/LCD/build#
Mirando el dmesg me encuentro con esto.
Código (bash) [Seleccionar]
[ 3176.691837] lcd[3867] general protection ip:400cb4 sp:7fff887ad290 error:0 in lcd[400000+2000]
root@ubuntu:/media/E80C-30D5/LCD/build#
Dejo el dmesg del ttyS*
Código (bash) [Seleccionar]
root@ubuntu:/media/E80C-30D5/LCD/build# dmesg |grep ttyS
[ 2.335717] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 2.335817] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 2.336100] 00:0b: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 2.336207] 00:0c: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
root@ubuntu:/media/E80C-30D5/LCD/build#
PD:És el hilo de http://foro.elhacker.net/electronica/inicializar_lcd_linux-t299539.0.html ; pero puesto aquí haber si me podeis ayudar.