www.mikrocontroller.net

Forum: PC-Programmierung Parallel Port Pin setzten


Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann jemand mal ein kleines c posten das eine LED am Parllel Port zum 
blinken bringt (d.h Ich möchte einfach einen Pin setzten können)

mfg huGO

: Verschoben durch Moderator
Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ungefähr so:

Set Pin1

usleep(233);

Reset Pin1

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wovon redest du? PC?

MfG Spess

Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja von Pc.
Auf dem pc läuft linux.

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

fd = open("/dev/parport0", O_WRONLY | O_APPEND);
char on = 0xFF;
char off = 0;
while (1) {
  write(fd, &on, 1);
  usleep (233);
  write (fd, &off, 1);
  sleep (233);
} close(fd);

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und jetzt mal bitte für Vista :-)

Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Niklas.
Ich hab jetzt noch eine Frage, setzt du den Pin wirklich auf 1 oder 
schikst du daten auf den Pin?

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@huGO

hmm sind "1" keine Daten... Ich denke das ist ja eher eine 
philosophische Frage, oder??

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, der Code schickt Daten an den Port, welche entweder alle Pins 
einschalten (0xFF) oder alle Pins abschalten (0). Man kann natürlich 
auch einzelne Pins schalten, z.B. mit dem Wert 8 wird der 4. Pin 
eingeschaltet.

Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups stimmt.

der code kann aber leider nicht kompiliert werden :(
folgende Fehler erscheinen:
bt Desktop # cc -o io1 io.c
io.c:7: warning: data definition has no type or storage class
io.c:7: error: initializer element is not constant
io.c:10: error: expected identifier or '(' before 'while'
io.c:15: warning: data definition has no type or storage class
io.c:15: warning: parameter names (without types) in function declaration

Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh es hat ja main() gefehlt :D

jetzt kommt nur noch folgender Fehler:

io.c:7: error: initializer element is not constant

bei folgendem Code:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

fd = open("/dev/parport0", O_WRONLY | O_APPEND);

int main() {

char on = 0xFF;
char off = 0;
while (1) {
  write(fd, &on, 1);
  usleep (233);
  write (fd, &off, 1);
  sleep (233);
} close(fd);


}


Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code ist auch nicht vollständig, da muss noch eine Funktion 
drumherum, z.B.:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

int want_quit;

void on_sig_int (int sig) {
  want_quit = 1;
}

int main(int argc, char* argv[]) {
  fd = open("/dev/parport0", O_WRONLY | O_APPEND);
  char on = 0xFF;
  char off = 0;
  want_quit = 0;
  signal (SIGINT, on_sig_quit);
  while (want_quit == 0) {
    write(fd, &on, 1);
    usleep (233);
    write (fd, &off, 1);
    sleep (233);
  }
  close(fd);
}
Mit dem signal-Handler wird die Schnittstelle auch ordentlich 
geschlossen, wenn man Strg+C drückt. Nicht zwangsweise nötig, aber 
sauberer programmiert.

Autor: huGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch dieser Code funktioniert nicht :(

io.c: In function 'main':
io.c:14: error: 'fd' undeclared (first use in this function)
io.c:14: error: (Each undeclared identifier is reported only once
io.c:14: error: for each function it appears in.)
io.c:18: error: 'on_sig_quit' undeclared (first use in this function)
io.c:26:2: warning: no newline at end of file

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sei so lieb und lerne ein bisschen C.
Das ist nicht böß gemeint, aber die Fehler oben drin sind trivial,
wenn du das Programm später erweitern willst brauchst du das Wissen:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

int want_quit;

void on_sig_quit (int sig) {
  want_quit = 1;
}

int main(int argc, char* argv[]) {
  FILE fd = open("/dev/parport0", O_WRONLY | O_APPEND);
  char on = 0xFF;
  char off = 0;
  want_quit = 0;
  signal (SIGINT, on_sig_quit);
  while (want_quit == 0) {
    write(fd, &on, 1);
    usleep (233);
    write (fd, &off, 1);
    sleep (233);
  }
  close(fd);
}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und dann bitte noch sicherheitshalber ein volatile vor want_quit...

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps, vertippt :)
Aber, wie kommst du auf "FILE fd"? Sollte das nicht eher "int fd = open 
..." sein? FILE* braucht man doch nur bei der gepufferten Version mit 
fopen ?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, hatte ich übersehen :o

Autor: Uwe Bonnes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Manuel:
"\\\\.\\$VDMLPT1" hat in Win32 etwa gleiche Funktionalitaet wie 
/dev/parport. Wird in hamlib und xc3sprog (sourceforge) benutzt.

Tschuess

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und dann bitte noch sicherheitshalber ein volatile vor want_quit...

Eigentlich sollte es eher vom Typ sig_atomic_t sein. Den gibt's nämlich 
genau für solche Variablen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> Und dann bitte noch sicherheitshalber ein volatile vor want_quit...
>
> Eigentlich sollte es eher vom Typ sig_atomic_t sein. Den gibt's nämlich
> genau für solche Variablen.

Interessanterweise ist sig_atomic_t alleine aber nicht volatile :-)
Also:
volatile sig_atomic_t xxx;

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atomic ist ja wohl etwas übertriben, bei einem int gibt es keinen 
ungültigen zwischenwert bei gleichzeitigen zugriff.

volatil habe ich auf einem PC auch noch nie genutzt, ging bis jetzt auch 
immer. könnte aber daran liegen das die schleifen meist etwas mehr 
inhalt hatten und auf dem PC weniger Register vorhanden sind.

Autor: ahha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich hab jetzt mal ine dumme frage aber welcher pin wird jetzt eig. 
gesetzt?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char on = 0xFF;

Alle

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> atomic ist ja wohl etwas übertriben, bei einem int gibt es keinen
> ungültigen zwischenwert bei gleichzeitigen zugriff.

Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?

Wenn er das ist, ist was falsch gelaufen.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?
>
> Wenn er das ist, ist was falsch gelaufen.

Nun ja gibt ja durchaus Architekturen die kein zwingendes Alignment 
voraussetzen

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann gibt es aber auch kein "nicht korrektes" Alignment.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.