Läs/skriv till paralellport i Linux

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

Ja det är sant, mitt program fungerar likadant. Poängen med koden var mest att visa hur det funkar (öppen källkod) och ge möjlighet till felkontroll, det kan bli lite konstigt om man skriver till fel port.

Kommandot outb ligger på min laptop i /usr/X11R6/bin/outb. Kollar jag min server (utan X) så finns inte kommandot, så nån nytta finns det med parrelay iaf :)
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Jovisst, ditt program är väldigt bra i utbildningssyfte så folk kan lära sig hur man fixar sånt i C++.
Men kanske inte lika bra som ersättare till ioport-kommandona... :P
Och visst, ioport-binärerna följer med x11, men jag tycker inte det är jobbigare att kopiera över dem till min server än att ladda ner och kompilera ett nytt program...

Jo... Nu ska ja testa input också :D
De e 5v den ska ha va? Och det här om pullup/-down-motstånd som folk tjötar om hela tiden, hur e de me det? Hur mycke ström kan ja lägga på porten utan att bränna den? Och samma år andra hållet, om jag kopplar in en lysdiod eller optokopplare, vad ska jag ha för motstånd då?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

maxxflow skrev:Tjoho! Det funkar! Portadressen var 888 vilket jag tycker är lite konstigt, eftersom jag bara har 1 port och den borde sitta som lp0...
Men hursomhelst; om jag kör outb 888 1 så tänds pinne 2, outb 888 0 så släcks pinne 2.
Om jag kör outb 888 2 så tänds pinne 3, outb 888 0 släcker nu pinne 3, men _inte_ pinne 2 om den redan var tänd. outb 888 0 verkar därför släcka den pinne som senast tändes? Verkar lite knepigt, men det funkar. Om man vill släcka en pinne som inte e "aktiv" e de ju bara att köra tänd-kommandot för den pinnen, så den fattar att det är den man vill åt...

Ta inte illa upp PHermansson, men ditt program är nästan lite onödigt då det fungerar exakt på samma sätt...
Det hela låter väldigt knepigt, eftersom du skriver direkt till en 8-bitars "latch". Om du gör om värdet till binärt istället (0b00000000) så ser du mer exakt hur det borde "lysa". Alltså outb 888 3 borde ge "lyse" åt pinne 1 och 2, inte pinne 3. Och outb 888 0 borde släcka alla.
Ska man sedan släcka bara en pinne, så måste man då aktuella värdet och maska bort den pinne man ska släcka, osv.
Nu har jag ingen koll på själva "outb"-programmet, men skriver man direkt till parallell-porten (på dataregistret) så ska det fungera som jag beskriver.
Det kan ju vara något annat register du skriver till, där kanske någon pinne är inverterad? Har inte adresserna i huvudet, så någon kanske kan rätta mig om jag har fel.

Själv använder jag parport-drivern när jag styr parallellporten i C, och dom funkar kalasbra! Många fina funktioner i den som man slipper göra manuellt.

Mvh
speakman
Senast redigerad av speakman 24 januari 2005, 13:29:51, redigerad totalt 1 gång.
Användarvisningsbild
AndLi
Inlägg: 18109
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

>Alltså outb 888 2 borde ge "lyse" åt pinne 1 och 2,
Nää

2 decimalt är 0000 0010 binärt. Altså ska bara en pinne lysa.
För övrigt ligger Dataporten på pinne 2-9, inte pinne 1 (vilket är strobe)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

AndLi: Givetvis. Upptäckte det själv så jag påbörjade en ändring. Men du han rätta mig innan jag skickat uppdateringen. :)
Sedan utgick jag ifrån att pinne 1 är pinne 1 av datapinnarna på parallellporten. Inte pinne 1 på kontakten.

Mvh
speakman
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Speakman: Justdet, så var det! :D Var så längesen jag höll på men detta sist, glömde att man ska ange pin-numret i bin :D
Nu ska här testas... :)

Men det här me pullup/-down-motstånd? Hur ska det vara?
Och de 5 volten som ska läggas på input-pinnen, kan man ta dem från paralellporten? Vore mycket enklare om man slapp ha extra strömkälla för det...
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Ingen som vet nåt om detta? :D

Hur ska man göra? Koppla in 5v mellan en datapinne och jord? Går det att ta strömmen från porten, för det vore ju det allra smidigaste?
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Sätt en av kontrollsignalerna till att ge +5 volt ut så har du ett antal mA att knycka därifrån. Du har dessa på pinne 1, 14, 16 och 17. Med lite tur så är någon av dessa satta till att ge +5 volt som standard utan att du behöver göra något i åt det.
Användarvisningsbild
AndLi
Inlägg: 18109
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Du kan styra 1,14,16,17 på LPT porten adress + 2 altså 890 (0x37A)
Bitarna 0-3 är pinne 1,14,16,17
4 styr IRQ så den ska alltid vara 0
5 styr direction och bör vara 0 för output.
6 och 7 är reservd
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

3 av dom pinnarna är inverterade, dvs man ska stoppa in 0 i den biten i registret för att få ut +5 volt på pinnen.
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Hittade ett mycket enklare sätt...
Hittade programmet sled. Då kopplar jag in knappen på serieporten istället...

Åsså skrev jag om programmet så att det körde killall ogg123 ist. för shutdown... Och så tog ja bort led-funktionerna...

Kod: Markera allt

/*
 * Serial line daemon program for executing command when button pressed.
 * The program uses the serial interface line CD (input: carrier detect)
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License.
 * See http://www.gnu.org/copyleft/ for details.
 *
 * Written by maxxflow, maxxflow.com
 * Based on sled by Guido Socher <guido@linuxfocus.org>
 */
#define VERINFO "version 0.1"
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>


static int fd = 0;

/* get the current state of the push button
 * and return it. */
int getpushbutton(int fd)
{
        int state;
        ioctl(fd, TIOCMGET, &state);    /* read interface */
        if (state & TIOCM_CAR) {
                return (1);
        }
        return (0);
}

void help()
{

printf("sswitch ");

#ifdef VERINFO
        puts(VERINFO);
#endif

printf("\n\
USAGE:   sswitch serial-device\n\
EXAMPLE: sswitch /dev/ttyS0\n\
\n\
");

exit(0);
}

int main(int argc, char **argv)
{
        int lstate = 0;
        int i = 0;
        pid_t pid;

        /* exactly one argument must be given */
        if (argc != 2)
                help();
        /* open device */
        fd = open(argv[1], O_RDWR | O_NDELAY);
        if (fd < 0) {
                fprintf(stderr, "ERROR: can not open \"%s\"\n", argv[1]);
                exit(2);
        }

        /* now we fork to background */
        if ((pid = fork())<0){
                perror("sswitch server fork");
                exit(1);
        }else if (pid > 0){
                /* parent dies */
                exit(0);
        }
        /* we are the child and run as a daemon */
        while(1){
                if (getpushbutton(fd)){
                        system("killall ogg123");
                }
                sleep(1);
        }
        /* we never get here */
        return (2);
}
Funkar jättebra :D

Om ni undrar vad ja ska med killall ogg123 till så e de så att jag har tänkt att använda min server som "väckarklocka", den loopar vid bestämd tidpunkt en ogg-fil i högtalarn som e breve min säng ända tills man trycker på knappen :D

Jajustdet, då e de ju loop-skriptet och inte ogg123 som ska dödas... *fixar* :P
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Killlall ogg123 blir ju bara snooze :)
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Ca. ½ sekund snooze :D Perfekt... :P
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Då somnar man inte om iaf :lol:

Du kan ju alltid lägga in lite "sleep 120" i bash-scriptet så får du snooze. Och när du känner att du vaknat och ska gå upp sätter du dig helt enkelt vid datorn och slår av scriptet manuellt =)
Skriv svar