Anzeige:
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 15 von 55

Thema: Tutorial zum Parallelport ...

  1. #1
    Registrierter Benutzer
    Registriert seit
    Mar 2001
    Beiträge
    1.397

    Post Tutorial zum Parallelport ...

    ... gibt's von mir und zwar hier:

    http://www.loetstelle.net/praxis/par...rallelport.php

    Die Programme sind für Linux und unter der GPL.
    This is a manual signatur virus. Distribute me!

  2. #2
    Registrierter Benutzer
    Registriert seit
    Jul 2004
    Beiträge
    85
    Vielen Dank, der Thread kam wie gerufen Suche jetzt seit 10 Minuten bei Google, hab aber wohl nach dem Falschen gesucht. Dann gucke ich mal kurz hier rein, und sehe dass es nen neuen Thread gibt

    Ich will ne LED anschließen, die leuchtet wenn ich nen Query oder Highlight bekomme, mit dem Howto wird das ein Kinderspiel
    Geändert von ilmig (31.10.05 um 19:30 Uhr)

  3. #3
    Registrierter Benutzer Avatar von marvelous
    Registriert seit
    Nov 2005
    Beiträge
    17

    Thumbs up fragen über fragen.......

    moinsen leutz,

    habe ma ne dumme frage(sofern es die hier gibt)^^,

    wenn ich die datenausgänge(d0-d7) über ein vorwiderstand gegen masse leg,
    und jetzt mit c die leds einzeln ansteurn will,wie geht das?...
    habe das tut gelesen und auch ne bischen gegoogelt,aber schlau bin ich nicht draus geworden...... bin c-anfänger, mit qbasic habe ich das früher schon gemacht,wollte jetzt auf c umsteigen,darum meine frage, wie sieht ein einfaches listing aus,wenn ich an der ersten parall. schnittstelle d0(pin2) auf high setzen will?,das listing solllte bitte komplett sein, und nicht nur den outb befehl und sollte unter suse linux mit gcc compelliert werden können.

    danke im voraus für eure hilfe.......thxalot

    lg mario
    /SuSE/Kernel 2.6.13-15/ http://krimskrams.2page.de

  4. #4
    Moderat0r Avatar von geronet
    Registriert seit
    May 2001
    Ort
    Grainau
    Beiträge
    6.095

    Arrow

    Ich werf hier einfach mal mein Programm für den Parallelport rein:

    Code:
    /*
     *	Parallel port control program
     *	
     *	Copyright 2002 Stefan Bachmaier <stefan@tracefog.de>
     *
     *	This program is free software; you can redistribute it and/or modify
     *	it under the terms of the GNU General Public License as published by
     *	the Free Software Foundation; either version 2 of the License, or
     *	(at your option) any later version.
     *
     *	This program is distributed in the hope that it will be useful,
     *	but WITHOUT ANY WARRANTY; without even the implied warranty of
     *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *	GNU General Public License for more details.
     *
     *	You should have received a copy of the GNU General Public License
     *	along with this program; if not, write to the Free Software
     *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     *
     */
    
    /*
     This program can read and write the control, data and status bits on the parallel port.
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <getopt.h>
    #include </usr/src/linux/include/asm/io.h>
    
    #define DATA 0x378		/*
    				 * printer port base address 
    				 */
    #define STATUS DATA+1		/*
    				 * status bits are 1 byte behind 
    				 */
    #define CONTROL DATA+2		/*
    				 * control bits are 2 bytes behind 
    				 */
    /*
    
    <= in   DB25    Cent    Name of         Reg
    => out  pin     pin     Signal          Bit     Function Notes
    ------  ----    ----    --------        ---     -----------------------------
    =>       2       2      Data 0          D0      Set to least significant data
    =>       3       3      Data 1          D1      ...
    =>       4       4      Data 2          D2      ...
    =>       5       5      Data 3          D3      ...
    =>       6       6      Data 4          D4      ...
    =>       7       7      Data 5          D5      ...
    =>       8       8      Data 6          D6      ...
    =>       9       9      Data 7          D7      Set to most significant data
    
    <=      15      32      /Error          S3+     Low for Error/Offline/PaperEnd
    <=      13      13      Select          S4+     High for printer selected
    <=      12      12      PaperEnd        S5+     High for out of paper
    <=      10      10      /Ack            S6+     IRQ Low Pulse ~ 5 uS, after accept
    <=      11      11      Busy            S7-     High for Busy/Offline/Error
    
    =>       1       1      /Strobe         C0-     Set Low pulse >0.5 us to send
    =>      14      14      /AutoFd         C1-     Set Low to autofeed one line
    =>      16      31      /Init           C2+     Set Low pulse > 50uS to init
    =>      17      36      /SelectIn       C3-     Set Low to select printer
    
    ==      18-25   19-30,  Ground
                   33,17,16
    
    */
    
    
    short data = 0;
    short status = 0;
    short control = 0;
    short x = 0, y = 0;
    
    int c = 0, cr = 0;
    int set_status = 0;
    short quiet_mode = 0;
    
    void printparams ();
    void printbits ();
    
    int main (int argc, char *argv[])
    {
    
    	if (ioperm (DATA, 3, 1))
    	{
    		fprintf (stderr, "Couldn't get the port at %x\ntry it as root.\n", DATA);
    		exit (1);
    	}
    
    	data = inb (DATA);
    	control = inb (CONTROL);
    
    
    	// invert bit 0, 2 and 3 (1101)
    	control ^= 0x0b;
    
    
    	while (1)
    	{
    		cr = getopt (argc, argv, "q");
    		if (cr == -1)
    			break;
    		switch (cr)
    		{
    		case 'q':
    			quiet_mode = 1;
    			break;
    		}
    	}
    
    	if (argc < 2)
    	{
    		printparams ();
    		printbits ();
    		return 0;
    	}
    
    	if ((argc - optind) != 2)
    	{
    		printf ("wrong params!\n");
    		printparams ();
    		return 0;
    	}
    
    	c = argv[optind][0];
    
    	if (argv[optind][1] != 0 || !((c >= '0' && c <= '8') || c == 'q' || c == 'w' || c == 'e' || c == 'r' || c == 't'))
    	{
    		printf ("wrong params!\n");
    		printparams ();
    		return 0;
    	}
    
    	set_status = 1;
    	if (strcmp (argv[optind + 1], "on") != 0)
    	{
    		set_status = 0;
    		if (strcmp (argv[optind + 1], "off") != 0)
    		{
    			set_status = 2;
    			if (strcmp (argv[optind + 1], "toggle") != 0)
    			{
    				printf ("you must provide the status (on|off|toggle)!\n");
    				return 0;
    			}
    		}
    	}
    
    
    	if (!quiet_mode)
    		printf ("Pin #%c, status: %s (%d)\n", c, argv[optind + 1], set_status);
    
    
    	x = -1;
    
    	// DATA pins 2-9
    	if (c == '0')
    	{
    		x = 1;
    	}
    	if (c == '1')
    	{
    		x = 2;
    	}
    	if (c == '2')
    	{
    		x = 4;
    	}
    	if (c == '3')
    	{
    		x = 8;
    	}
    	if (c == '4')
    	{
    		x = 16;
    	}
    	if (c == '5')
    	{
    		x = 32;
    	}
    	if (c == '6')
    	{
    		x = 64;
    	}
    	if (c == '7')
    	{
    		x = 128;
    	}
    	if (c == '8')
    	{
    		x = 255;
    	}
    
    
    	// SELECT, INIT, /AUTO_FEED, /STROBE at pins 17, 16, 14 and 1   
    
    	y = -1;
    
    	if (c == 'q')
    	{
    		y = 15;
    	}
    	if (c == 'w')
    	{
    		y = 1;
    	}
    	if (c == 'e')
    	{
    		y = 2;
    	}
    	if (c == 'r')
    	{
    		y = 4;
    	}
    	if (c == 't')
    	{
    		y = 8;
    	}
    
    	if (x != -1)
    	{
    
    		switch (set_status)
    		{
    		case 0:
    			// put off
    
    			if (x == 255)
    				data = 0;
    			else
    				data = (data & (~x));
    
    			break;
    		case 1:
    			// set to on
    
    			if (x == 255)
    				data = 255;
    			else
    				data = (data | x);
    
    			break;
    		case 2:
    			// toggle
    			if (x == 255)
    			{
    				data ^= 255;
    			}
    			else
    			{
    				// bit schon gesetzt?      falls schon ausmask.  falls nicht einmask.
    				data = ((data & x) == x) ? (data & (~x)) : (data | x);
    			}
    
    			break;
    		default:
    			printf ("you must provide the status (on|off|toggle)!\n");
    			return 0;
    			break;
    		}
    
    		outb (data, DATA);
    
    	}
    
    
    
    	if (y != -1)
    	{
    
    		switch (set_status)
    		{
    		case 0:
    			// put off
    
    			if (y == 0)
    				control = 15;
    			else
    				control = (control & (~y));
    
    			break;
    		case 1:
    			// set to on
    
    			if (y == 15)
    				control = 15;
    			else
    				control = (control | y);
    
    			break;
    		case 2:
    			// toggle
    			if (y == 15)
    			{
    				control ^= 15;
    			}
    			else
    			{
    				// bit schon gesetzt?      falls schon ausmask.  falls nicht einmask.
    				control = ((control & y) == y) ? (control & (~y)) : (control | y);
    			}
    
    			break;
    		default:
    			printf ("you must provide the status (on|off|toggle)!\n");
    			return 0;
    			break;
    		}
    
    		outb (control ^ 0x0b, CONTROL);
    
    	}
    
    
    	if (!quiet_mode)
    		printbits ();
    
    	ioperm (DATA, 3, 0);
    	return 0;
    }
    
    
    void printparams ()
    {
    	printf ("usage: lpic [-q] <pin number> <off|on|toggle>\n");
    	printf ("toggles level of pin\n");
    	printf ("where <number> is from 0-8 (8=all) or one of q,w,e,r,t (q=all), pin on, off or toggle.\n");
    	
    	return;
    }
    
    
    
    void printbits ()
    {
    	int db = 0;
    	int pb = 0;
    	int cb = 0;
    
    
    	status = inb (STATUS);
    	// invert bit 7 (1000000)
    	status ^= 128;
    	
    	
    	if (data & 1)
    		db += 1;
    	if (data & 2)
    		db += 10;
    	if (data & 4)
    		db += 100;
    	if (data & 8)
    		db += 1000;
    	if (data & 16)
    		db += 10000;
    	if (data & 32)
    		db += 100000;
    	if (data & 64)
    		db += 1000000;
    	if (data & 128)
    		db += 10000000;
    
    	if (status & 8)
    		pb += 1;
    	if (status & 16)
    		pb += 10;
    	if (status & 32)
    		pb += 100;
    	if (status & 64)
    		pb += 1000;
    	if (status & 128)
    		pb += 10000;
    
    	if (status & 1)
    		cb += 1;
    	if (control & 2)
    		cb += 10;
    	if (control & 4)
    		cb += 100;
    	if (control & 8)
    		cb += 1000;
    
    	printf ("-------------\n");
    	printf ("Data Bits: [%08d] (%d)\n", db, data);
    	printf ("Data0:\t\t0(pin 2)\t%s\n", data & 1 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data1:\t\t1(pin 3)\t%s\n", data & 2 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data2:\t\t2(pin 4)\t%s\n", data & 4 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data3:\t\t3(pin 5)\t%s\n", data & 8 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data4:\t\t4(pin 6)\t%s\n", data & 16 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data5:\t\t5(pin 7)\t%s\n", data & 32 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data6:\t\t6(pin 8)\t%s\n", data & 64 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Data7:\t\t7(pin 9)\t%s\n", data & 128 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("-------------\n");
    	printf ("Control Bits: [%04d] (%d)\n", cb, control);
    	printf ("/Strobe:\tw(pin 1)\t%s\n", control & 1 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("/Auto_feed:\te(pin 14)\t%s\n", control & 2 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("Init:\t\tr(pin 16)\t%s\n", control & 4 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("/SelectIn:\tt(pin 17)\t%s\n", control & 8 ? "HIGH\t(+5V)" : "LOW\t(GND)");
    	printf ("-------------\n");
    	printf ("Input Bits: [%05d] (%d)\n", pb, status);
    	printf ("Error:\t\t(pin 15)\t%s\n", status & 8 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
    	printf ("Select:\t\t(pin 13)\t%s\n", status & 16 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
    	printf ("Paperend:\t(pin 12)\t%s\n", status & 32 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
    	printf ("Ack:\t\t(pin 10)\t%s\n", status & 64 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
    	printf ("/Busy:\t\t(pin 11)\t%s\n", status & 128 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
    	printf ("-------------\n");
    
    
    	return;
    
    }
    Geändert von geronet (16.11.05 um 17:13 Uhr)
    Nur Puffin verleiht dir die Kraft und Ausdauer die du brauchst!

  5. #5
    Registrierter Benutzer
    Registriert seit
    Mar 2001
    Beiträge
    1.397
    Der Datenport wird über Schaltlogik auf die Daten-Pins abgebildet. Wenn man nur Bit0 setzen will, braucht man also nur dem Daten-Port den Wert BIT0 (=1) zuweisen.

    Übrigens ist das zum Parallelport, also im falschen Tread.
    This is a manual signatur virus. Distribute me!

  6. #6
    Registrierter Benutzer Avatar von marvelous
    Registriert seit
    Nov 2005
    Beiträge
    17

    fragen........

    moinyen..........

    erstma vielen dank geronet f[r deine schnelle antwort, wenn ich das listing compeliere bekomme ich folgende fehlermeldung

    inux:~ # gcc -O2 pal pal.c
    pal.c: In function ‘main’:
    pal.c:118: error: ‘damage’ undeclared (first use in this function)
    pal.c:118: error: (Each undeclared identifier is reported only once
    pal.c:118: error: for each function it appears in.)
    pal.c:118: error: syntax error before ‘int’
    pal.c:141: error: ‘i’ undeclared (first use in this function)

    was mache ich falsch........

    lg mario
    /SuSE/Kernel 2.6.13-15/ http://krimskrams.2page.de

  7. #7
    Moderat0r Avatar von geronet
    Registriert seit
    May 2001
    Ort
    Grainau
    Beiträge
    6.095
    Zitat Zitat von nobody0
    Übrigens ist das zum Parallelport, also im falschen Tread.
    Schon verschoben...

    marvelous: Probiers mal mit
    gcc lpic.c -O -o lpic -Wall
    Nur Puffin verleiht dir die Kraft und Ausdauer die du brauchst!

  8. #8
    Registrierter Benutzer Avatar von marvelous
    Registriert seit
    Nov 2005
    Beiträge
    17

    .................

    moinzen....

    sorry geromet, genau sie selbe Fehlerleldung......

    was kann ich da noch machen.......was sagt der fehlermeldung vom compiler aus...........

    danke fuer deine muehe im voraus....

    lg mario
    /SuSE/Kernel 2.6.13-15/ http://krimskrams.2page.de

  9. #9
    Registrierter Benutzer
    Registriert seit
    Mar 2001
    Beiträge
    1.397
    Da sind Fehler im Header, wenn man versucht das Programm zu compilieren:

    tmp.c:89: warning: implicit declaration of function ‘ioperm’
    tmp.c:138: warning: implicit declaration of function ‘strcmp’

    Nach den Man-Pages fehlt also:

    #include <string.h>
    #include <sys/io.h>

    Und raus muss

    #include </usr/src/linux/include/asm/io.h>

    da das für den Kernel ist und hier falsch, denn das Programm hier läuft im User-Space und verwendet die glibc, für die nach der Man-Page

    #include <sys/io.h> /* for glibc */

    zu verwenden ist.
    This is a manual signatur virus. Distribute me!

  10. #10
    Registrierter Benutzer Avatar von marvelous
    Registriert seit
    Nov 2005
    Beiträge
    17

    Thumbs up supi.............


    danke-danke-danke,klappt...

    sehr vielen dank f[r die schnelle
    und konkrete hilfe.......thxalot.....

    lg mario
    /SuSE/Kernel 2.6.13-15/ http://krimskrams.2page.de

  11. #11
    Moderat0r Avatar von geronet
    Registriert seit
    May 2001
    Ort
    Grainau
    Beiträge
    6.095
    Zitat Zitat von nobody0
    Da sind Fehler im Header, wenn man versucht das Programm zu compilieren...
    Tatsächlich, hat mich immer gewundert, aber es ist trotzdem gelaufen.
    Da sieht man mal wie man sich auf Beispiele verlassen kann
    Nur Puffin verleiht dir die Kraft und Ausdauer die du brauchst!

  12. #12
    Happy Hippo
    Registriert seit
    Aug 1999
    Ort
    904xx Nermberch
    Beiträge
    942
    @nobody0
    Die Begründung für die Verwendung des Gray-Codes ist nicht ganz richtig. Sieh mal bei Wikipedia nach, die ist etws besser, wenn auch nicht ganz toll.

    Zum Beispiel wird immer davon geredet, daß sich "nur" ein Bit ändert. Aber das ist ja genau DIE Eigenschaft dieses Kodes. Das sich "genau" ein Bit ändert.

    Außerdem hat dies nichts mit der Übertragungsgeschwindigkeit zu tun, sondern der Vorteil liegt in der Symmetrie des Kodes, was Änderungsberechnungen vereinfacht und Symmetrie kann auch verschiede Vorteile bei einer Übertragung haben, insbesondere bei der analogen Übertragung (Thema Gleichstromfreiheit, Datensicherheit)

    Pingu
    Geändert von Pingu (18.11.05 um 14:29 Uhr)

  13. #13
    Registrierter Benutzer
    Registriert seit
    Mar 2001
    Beiträge
    1.397
    Zitat Zitat von Pingu
    @nobody0
    Die Begründung für die Verwendung des Gray-Codes ist nicht ganz richtig. Sieh mal bei Wikipedia nach, die ist etws besser, wenn auch nicht ganz toll.

    Zum Beispiel wird immer davon geredet, daß sich "nur" ein Bit ändert. Aber das ist ja genau DIE Eigenschaft dieses Kodes. Das sich "genau" ein Bit ändert.
    Ja, mir ging es hier aber darum zu betonen, dass man hiermit Daten asynchron und sehr wenig CPU-Last übertragen kann. Das findet man nämlich nur in wenigen Lehrbüchern und Ingenieure wissen davon meist nichts; die würden von allein nie daruf kommen.
    Praktisch wird es zwar in einigen Geräten wie Korrelatoren genutzt, aber leider gibt es z. B. AD-Wandler oder Binärzähler mit Gray-Code-Ausgang anscheinend nirgends fertig zu kaufen; sowas muss man mit einem Mikrocontroller selber programmieren (was aber wenig Aufwand erfordert).
    Ich werde das mal demnächst mit einem MSP430 machen.
    This is a manual signatur virus. Distribute me!

  14. #14
    Benutzter Registrierer
    Registriert seit
    Feb 2004
    Beiträge
    2.263
    Moin,

    Zitat Zitat von nobody0
    Ja, mir ging es hier aber darum zu betonen, dass man hiermit Daten asynchron und sehr wenig CPU-Last übertragen kann. Das findet man nämlich nur in wenigen Lehrbüchern und Ingenieure wissen davon meist nichts; die würden von allein nie daruf kommen.
    Richtig, ich waere auch sicher nicht darauf gekommen, mittels graycode sich "langsam" aendernde Daten zu uebertragen. Da kann ich irgendwie keinerlei Vorteile sehen. Fuer sich "langsam" aendernde Daten wuerd' ich eher was sigma-delta-artiges empfehlen, das kommt dann auch nur mit einem bit aus. Fuer' n Schutz gegen Uebertragungsfehler hilft der Gray auch nicht weiter, die Mindesthammingdistanz ist ja immernoch 1 -also bietet sich fuer solche Faelle doch eher ein Hammingcode oder eine Kreuzparitaet an, wenns korrigieren koennen muss und noch halbwegs simpel bleiben soll.
    Wieso soll die CPU-Last davon abhaengig sein, mit welchem Code ich meine Daten uebertrage? Graycode ist evtl. gut fuer eine Datenerfassung (Winkelmessung, etc) aber doch nicht fuer eine Datenuebertragung.
    Oder ist mir da ganz grob was entgangen?

    Gruss
    WK
    Das ist aber zu viel zum Lesen und ich will, dass er einfach kompeliert!

  15. #15
    Registrierter Benutzer
    Registriert seit
    Mar 2001
    Beiträge
    1.397
    Zitat Zitat von derguteweka
    Moin,
    Richtig, ich waere auch sicher nicht darauf gekommen, mittels graycode sich "langsam" aendernde Daten zu uebertragen. Da kann ich irgendwie keinerlei Vorteile sehen. Fuer sich "langsam" aendernde Daten wuerd' ich eher was sigma-delta-artiges empfehlen, das kommt dann auch nur mit einem bit aus.
    Was soll sigma-delta am Parallelport? Das eine ist ein AD-Verfahren und das andere ist digital; das passt nicht.


    Zitat Zitat von derguteweka
    Fuer' n Schutz gegen Uebertragungsfehler hilft der Gray auch nicht weiter, die Mindesthammingdistanz ist ja immernoch 1 -also bietet sich fuer solche Faelle doch eher ein Hammingcode oder eine Kreuzparitaet an, wenns korrigieren koennen muss und noch halbwegs simpel bleiben soll.
    Am Parallelport gibt's normalerweise keine Übertragungsfehler. Wenn doch, kann man das mit Leitungstreibern und Terminierung beseitigen.


    Zitat Zitat von derguteweka
    Wieso soll die CPU-Last davon abhaengig sein, mit welchem Code ich meine Daten uebertrage? Graycode ist evtl. gut fuer eine Datenerfassung (Winkelmessung, etc) aber doch nicht fuer eine Datenuebertragung.
    Oder ist mir da ganz grob was entgangen?
    Gruss
    WK
    Ja, denn mit Polling wird viel CPU-Zeit verbraten, mit Hanschaking oder IRQ sieht's zwar besser aus, aber da geht zumindest ein Bit für die Synchronisation weg und einfach nur Auslesen, so wie beim Gray-Code, reicht da nicht.
    This is a manual signatur virus. Distribute me!

Ähnliche Themen

  1. Kein Parallelport unter Cups/Kernel-2.6.8
    Von DERRICHTER im Forum System installieren und konfigurieren
    Antworten: 5
    Letzter Beitrag: 14.09.04, 16:01
  2. Bluetooth und Motorola v525 Tutorial
    Von City][Sepp im Forum Tipps und Tricks
    Antworten: 7
    Letzter Beitrag: 20.05.04, 14:54
  3. Laptop - Ethernet (Parallelport) - Kernel 2.4.18
    Von comrad im Forum System installieren und konfigurieren
    Antworten: 0
    Letzter Beitrag: 19.03.02, 10:06
  4. parallelport
    Von Linuxexplorer im Forum System installieren und konfigurieren
    Antworten: 2
    Letzter Beitrag: 09.01.02, 11:29
  5. Vernünftiges Firewall Tutorial für IPTables
    Von Catonga im Forum Linux als Server
    Antworten: 6
    Letzter Beitrag: 20.08.01, 17:52

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •