Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2014-08-25 14:32:25

  R0bby - Użytkownik

R0bby
Użytkownik
Zarejestrowany: 2014-06-19

Obsługa portu LPT

Witam,

Czy ktoś bawił się z programową obsługą portu LPT? Usiłuję uruchomić odczyt czujnika wilgotności/temperatury podłączonego do tego portu i szlag mnie już trafia, bo niby prosta rzecz i powinno chodzić, a nie chodzi :(

Pozdr.
Robert

Offline

 

#2  2014-08-25 15:29:05

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Skąd: Białystok
Zarejestrowany: 2007-06-24

Re: Obsługa portu LPT

Napisz coś więcej:
- jaki to jest czujnik?
- w jaki sposób jest podłączony ?
- czym próbujesz odczytać dane z czujnika?

Offline

 

#3  2014-08-25 16:50:25

  R0bby - Użytkownik

R0bby
Użytkownik
Zarejestrowany: 2014-06-19

Re: Obsługa portu LPT

Czujnik wilgotności i temperatury DHT11. Próbowałem podłączać do linii danych D0 - nie działało. Poradzono mi, aby wykorzystał linię czysto dwukierunkową. Próbuję z linią STOBE, ale też lipa. Czujnik na pewno sprawny. Z AVR pracuje. Kod też jest poprawny i z mikrokontrolerem pracuje. Nie możliwe żeby tak prosty element nie odpowiadał na reset i coś muszę nie tak robić z portem tylko nie wiem co. Fizyczne zwarcie linii do masy jest poprawnie pokazywane przez funkcje inb(). Linia STROBE podciągnięta do Vcc rezystorem 3.9k. Czujnik powinien wystawić LOW na linii po inicjalizacji, a tego nie robi.

Kod:

root@hp:~# cat dht11.c
/*
DHT11 Library 0x01
copyright (c) Davide Gironi, 2011
Released under GPLv3.
Please refer to LICENSE file for licensing information.
*/
#include <stdio.h>
#include <string.h>
#include <sys/io.h>
#include <unistd.h>

#define PORT    0x37a           // Status Port
#define PIN     0               // Strobe - INWERTER !!!!
#define DHT11_Hi outb( inb(PORT) & ~(1<<PIN), PORT)
#define DHT11_Lo outb( inb(PORT) | 1<<PIN, PORT)
#define DHT11_INP (~inb(PORT) & 1<<PIN)

#define DHT11_ERROR 255

int temperature, humidity;

unsigned dht11_getdata(void)
{
    unsigned bits[5];
    unsigned i,j = 0;

    //reset port
    DHT11_Hi;   //high
    usleep(100000);

    //send request
    DHT11_Lo;   // low
    usleep(18000);
    printf("\nCheckpoint #0, p=%u", inb(PORT));

    DHT11_Hi;           //high
    usleep(40);
     //input

    //check start condition 1
    if( DHT11_INP ) {
        printf("\nBlad #1, p=%u", inb(PORT));
        return DHT11_ERROR;
    }

    usleep(80);
    //check start condition 2
    if( !(DHT11_INP )) {
        printf("\nBlad #2");
        return DHT11_ERROR;
    }
    usleep(80);

    //read the data
    for (j=0; j<5; j++) { //read 5 byte

        unsigned result=0;
        for(i=0; i<8; i++) {//read every bit
            while(!( DHT11_INP )); //wait for an high input
            usleep(30);
            if( DHT11_INP ) //if input is high after 30 us, get result
                result |= (1<<(7-i));
            while( DHT11_INP ); //wait until input get low
        }
        bits[j] = result;
    }

    //reset port
    DHT11_Lo;   //low
    usleep(100000);

    //check checksum
    if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
            temperature=bits[2];
            humidity=bits[0];

    }
    else {
        printf("\nBlad #3");
        return DHT11_ERROR;
    }
}


main(int argc, char **argv)
{

      if (ioperm(PORT, 3, 1))
          printf("ERROR: Can't gain access to port %x\n", PORT);

        dht11_getdata();
        printf("\nTemperatura: %uoC, Wilgotność: %u\n", temperature, humidity);
}

Ostatnio edytowany przez R0bby (2014-08-25 19:07:07)

Offline

 

#4  2014-08-25 20:22:34

  Lorenzo - Moderator

Lorenzo
Moderator
Zarejestrowany: 2005-12-23

Re: Obsługa portu LPT

Port jest ustawiony w biosie na EPP/ECP?
Ewentualnie możesz użyć dwóch wyjść z portu - jednego do wysyłania komend drugiego do odczytu czujnika i bramkować go na dwóch diodach i pull-upie (jednym/dwóch) przed wejśćiem czujnika.

Offline

 

#5  2014-08-26 09:22:19

  R0bby - Użytkownik

R0bby
Użytkownik
Zarejestrowany: 2014-06-19

Re: Obsługa portu LPT

Port jest ustawiony na SPP. Ale galwaniczne zwarcie na liniach D0-D7 było prawidłowo odczytywane przez inb(). Na wszelki wypadek próbowałem wykorzystać linię dwukierunkową STROBE. Przecież ona zawsze jest dwukierunkowa, bez względu na tryb pracy portu. Ale spróbuje zrobić tak jak piszesz i dam znać.

Edit:

Port był ustawiony w BIOSie na EPP/ECP. Wcześniej nie mogłem sprawdzić, bo nie miałem klawiatury. Jest jeszcze jedno ustawienie w BIOSie dot. LPT "ECP Mode Use DMA. Mam ustawione na 3. Można jeszcze wybrać 1.

Próbowałem użyć dwóch linii. Linia wyjściowa D0 przez rezystor 2.2k na bazę tranzystora PNP. Kolektor tranzystora na masie, emiter przez 3.9k do VCC. Emiter stanowi linię danych do czujnika i linię wejściową ACK portu LPT. Taki układ połączeń używałem sprzęgając Rx i Tx UARTu w 1-wire i działało.

Niestety, zarówno z pojedynczą linią wej-wyj, jak i z rozbiciem na dwie, czujnik nie odpowiada.

Próbowałem modyfikować czas resetu linii, oczekiwania na LOW od czujnika - cały czas lipa. Tak jakby go nie było. Kurna, czary jakieś :(

W programie zmieniłem tylko definicje linii:

Kod:

#define PORT    0x378           // Data Port

#define PORTout         PORT            // Data Port
#define PINout  0                       // D0
#define DHT11_Hi outb( inb(PORTout) | 1<<PINout, PORTout)
#define DHT11_Lo outb( inb(PORTout) & ~(1<<PINout), PORTout)

#define PORTin          PORT+1          // Status  Port
#define PINin   6                       // ACK
#define DHT11_INP inb(PORTin) & 1<<PINin

Ostatnio edytowany przez R0bby (2014-08-26 15:55:14)

Offline

 

#6  2014-08-27 13:52:41

  R0bby - Użytkownik

R0bby
Użytkownik
Zarejestrowany: 2014-06-19

Re: Obsługa portu LPT

Ruszyło. I to jest jedyna dobra wiadomość Użyłem linii D0, zezwalam na dwu-kierunkową transmisję. Niestety, komunikacja z czujnikiem mi się rozjeżdża. Używam terminala HP5710 i odmierzanie nim mikrosekundowych interwałów chyba nie było najlepszym pomysłem. W dodatku czujnik pracuje w oparciu o własny generator RC, który stabilnością nie grzeszy. Miewałem z tym czujnikiem już problemy gdy używałem z AVR taktowanego własnym generatorem RC.
W każdym razie podglądając stan linii poniższym kodem uzyskuję za każdym razem inne odczyty, co nie daje szans, na prawidłowy odczyt danych z czujnika.



Kod:

    DHT11_Hi;      //high
    ENABLE_Bi_Dir;
    //input
    for(i=0; i<100; i++){
        p=DHT11_INP;
        printf("\ni=%u, DHT11_INP=%u", i, p );
        usleep(1);
    }

Pomyśle nad wykorzystaniem innego czujnika, np DHT11 pracującego na jakiejś niby I2C.

W każdym razie dzięki za pomoc :)

Offline

 

#7  2014-08-27 15:41:31

  Lorenzo - Moderator

Lorenzo
Moderator
Zarejestrowany: 2005-12-23

Re: Obsługa portu LPT

Może użyj zwykłego czujnika + ADC.

Offline

 

#8  2014-08-27 16:01:58

  R0bby - Użytkownik

R0bby
Użytkownik
Zarejestrowany: 2014-06-19

Re: Obsługa portu LPT

Gdybym miał używać jakiegokolwiek dodatkowego scalaka to użyłbym po prostu ATmegi (bo jako tako znam) lub innego mikrokontrolera. Ale SHT10 myślę, że powinien pracować, tylko o realizacji LPT  => I2c muszę poczytać.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)