Sida 2 av 2
Postat: 24 januari 2005, 08:14:19
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

Postat: 24 januari 2005, 08:21:17
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...

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å

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å?
Postat: 24 januari 2005, 13:18:30
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
Postat: 24 januari 2005, 13:27:37
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)
Postat: 24 januari 2005, 13:32:34
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
Postat: 24 januari 2005, 15:28:47
av maxxflow
Speakman: Justdet, så var det!

Var så längesen jag höll på men detta sist, glömde att man ska ange pin-numret i bin

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...
Postat: 24 januari 2005, 22:45:08
av maxxflow
Ingen som vet nåt om detta?
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?
Postat: 24 januari 2005, 23:05:05
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.
Postat: 25 januari 2005, 08:24:03
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
Postat: 25 januari 2005, 08:27:48
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.
Postat: 25 januari 2005, 16:38:47
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
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
Jajustdet, då e de ju loop-skriptet och inte ogg123 som ska dödas... *fixar*

Postat: 25 januari 2005, 23:22:16
av chille
Killlall ogg123 blir ju bara snooze

Postat: 26 januari 2005, 14:07:28
av maxxflow
Ca. ½ sekund snooze

Perfekt...

Postat: 26 januari 2005, 19:11:27
av chille
Då somnar man inte om iaf
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 =)