Difference between revisions of "Blinker"

From ThorstensHome
Jump to: navigation, search
 
(3 intermediate revisions by one user not shown)
Line 1: Line 1:
= Blinker =
+
Für [[das Elektronik Buch]] möchte ich einen Blinker bauen. Ich nehme die Platine, schließe den DTR Port an das Experimentierfeld an, dort wird der Strom über eine LED an den GND Port zurück geschickt. Dann kommt der Software-Teil:
 +
 
 
So schnell wie möglich blinken:
 
So schnell wie möglich blinken:
 
<pre>
 
<pre>
Line 52: Line 53:
 
  ./a.out
 
  ./a.out
  
Dauert immer noch 4 Sekunden.
+
Dauert immer noch 4 Sekunden. Meine Vermutung ist, dass das Umschalten des DTR Ports schon Hardware-mäßig eine gewisse Zeit dauert. TX umzuschalten, dauert dagegen kürzer, da es ja im Laufe der Jahre immer mehr optimiert wurde. Vergesst nicht, die serielle Schnittstelle wurde ursprünglich gebaut, um Telefone zu bedienen.
 +
 
 +
Wenn ihr so schnell "blinken" wollt, dass ihr die LED "dimmen" könnt, muss ein anderer Ansatz ran. Eine Lösung beschreibe ich unter [[Dimmer]].

Latest revision as of 09:47, 5 April 2020

Für das Elektronik Buch möchte ich einen Blinker bauen. Ich nehme die Platine, schließe den DTR Port an das Experimentierfeld an, dort wird der Strom über eine LED an den GND Port zurück geschickt. Dann kommt der Software-Teil:

So schnell wie möglich blinken:

import serial,glob

for devices in glob.glob("/dev/ttyUSB*"):
    garbage=42 # appease python
conn = serial.Serial(devices, baudrate=9600)
while True:
    conn.setDTR(False)
    conn.setDTR(True)

Ok, das flackert... Also mal ausprobiert, wie lange 1000 Schaltoperationen auf DTR dauern:

import serial,glob,time

for devices in glob.glob("/dev/ttyUSB*"):
    garbage=42 # appease python
conn = serial.Serial(devices, baudrate=9600)
print time.time()
for i in range(1,1000):
    conn.setDTR(False)
    conn.setDTR(True)
print time.time()

Dauern 4 Sekunden bei mir... das ist zu lange. Probieren wir es in C.

blink.c

#include <sys/ioctl.h>
#include <fcntl.h>

int main()
{
    int port, i, status1, status2;
    port=open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK);
    ioctl(port, TIOCMGET, &status1); 
    status2=status1;
    status1 |= TIOCM_DTR;
    status2 &= ~TIOCM_DTR;
    for (i=1;i<1000;i++)
    {
      ioctl(port, TIOCMSET, &status1); 
      ioctl(port, TIOCMSET, &status2); 
    }
}

Compilieren mit

gcc blink.c

Ausfuehren mit

./a.out

Dauert immer noch 4 Sekunden. Meine Vermutung ist, dass das Umschalten des DTR Ports schon Hardware-mäßig eine gewisse Zeit dauert. TX umzuschalten, dauert dagegen kürzer, da es ja im Laufe der Jahre immer mehr optimiert wurde. Vergesst nicht, die serielle Schnittstelle wurde ursprünglich gebaut, um Telefone zu bedienen.

Wenn ihr so schnell "blinken" wollt, dass ihr die LED "dimmen" könnt, muss ein anderer Ansatz ran. Eine Lösung beschreibe ich unter Dimmer.