Re: [crisos] DarwinFox |
[ Thread Index | Date Index | More lists.tuxfamily.org/crisos Archives ]
Hi Claudio, Please find enclosed the edited file including ioctl calls instead of gpio and also Douglas's correction. Regards, Frederic. Claudio a écrit : Hi Frederic 2009/3/2 Frederic AYRAULT <fred@xxxxxxxxxxx>:Hi Claudio, I changed the gpiosetdir, gpiogetbits, gpiosetbits and gpioclearbits functions with the ioctl in the sht71.c and it works with darwinfox 8.09-4 :-)Can you post the file with this changes? Regards --- CrisOs mailing list Official multi-language http://www.crisos.org/ mailing list For unsubscribe send empty mail to: crisos-request@xxxxxxxxxxxxxxxxxxx with subject unsubscribe. |
// Example of user space C program to read a humidity and temperature // sensor Sensirion SHT71 (http://www.acmesystems.it/?id=89) //#include <stdio.h> //#include <unistd.h> //#include "linux/gpio_syscalls.h" #include "sys/ioctl.h" #include "asm/etraxgpio.h" //#include "stdarg.h" //#include "string.h" //#include "stdlib.h" #include "fcntl.h" //#include "stdarg.h" //#include "string.h" int fd; // ----------------------------------------------------------------------- // SHT71 sensor define // ----------------------------------------------------------------------- #define CLOCK_BIT 1<<25 // Clock line is OG25 (J7.13) #define DATA_BIT 1<<24 // Data line is IOG24 (J7.21) #define ETRAXGPIO_IOCTYPE 43 // Macro to set the data line direction //#define DATA_LINE_IN gpiosetdir(PORTG,DIRIN,DATA_BIT) #define DATA_LINE_IN ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_SETINPUT),DATA_BIT) //#define DATA_LINE_OUT gpiosetdir(PORTG,DIROUT,DATA_BIT) #define DATA_LINE_OUT ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_SETOUTPUT),DATA_BIT) //#define DATA_LINE_LOW gpiosetdir(PORTG,DIROUT,DATA_BIT);gpioclearbits(PORTG,DATA_BIT) #define DATA_LINE_LOW ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_SETOUTPUT),DATA_BIT);ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_CLRBITS),DATA_BIT) //#define DATA_LINE_HIGH gpiosetdir(PORTG,DIRIN,DATA_BIT) #define DATA_LINE_HIGH ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_SETINPUT),DATA_BIT) //#define DATA_LINE_READ gpiogetbits(PORTG,DATA_BIT)?(1):(0) #define DATA_LINE_READ ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_READBITS))&DATA_BIT?(1):(0) //#define CLOCK_LINE_LOW gpioclearbits(PORTG,CLOCK_BIT) #define CLOCK_LINE_LOW ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_CLRBITS),CLOCK_BIT) //#define CLOCK_LINE_HIGH gpiosetbits(PORTG,CLOCK_BIT) #define CLOCK_LINE_HIGH ioctl(fd,_IO(ETRAXGPIO_IOCTYPE,IO_SETBITS),CLOCK_BIT) #define CMD_READ_TEMP 0x03 #define CMD_READ_HUM 0x05 // ----------------------------------------------------------------------- // Send the start sequence // ----------------------------------------------------------------------- void SendStart(void) { DATA_LINE_OUT; CLOCK_LINE_HIGH; usleep(1000); DATA_LINE_IN; DATA_LINE_LOW; CLOCK_LINE_LOW; CLOCK_LINE_HIGH; usleep(1000); DATA_LINE_HIGH; CLOCK_LINE_LOW; DATA_LINE_IN; } // ----------------------------------------------------------------------- // Sensor reset // ----------------------------------------------------------------------- void SendReset (void) { int i; for (i=0;i<12;i++) { CLOCK_LINE_HIGH; usleep(1000); CLOCK_LINE_LOW; } } // ----------------------------------------------------------------------- // Send a byte to the sensor // ----------------------------------------------------------------------- int SendByte(char byte) { char tempbyte; int i; DATA_LINE_OUT; tempbyte=byte; for (i=0x80;i>0;i/=2) { if (tempbyte & i) DATA_LINE_HIGH; else DATA_LINE_LOW; CLOCK_LINE_HIGH; usleep(1000); CLOCK_LINE_LOW; } DATA_LINE_IN; CLOCK_LINE_HIGH; CLOCK_LINE_LOW; return 1; } // ----------------------------------------------------------------------- // Read a byte from the sensor // withack // 1 = send the ACK // 0 = don't send the ACK // ----------------------------------------------------------------------- char ReadByte(int withack) { char tempbyte; int i; tempbyte=0; DATA_LINE_IN; for (i=0x80;i>0;i/=2) { CLOCK_LINE_HIGH; if (DATA_LINE_READ) tempbyte |= i; CLOCK_LINE_LOW; } if (withack) { // Acknowledge del byte DATA_LINE_OUT; DATA_LINE_LOW; CLOCK_LINE_HIGH; CLOCK_LINE_LOW; DATA_LINE_IN; } else { // Senza acknowledge DATA_LINE_OUT; DATA_LINE_HIGH; CLOCK_LINE_HIGH; CLOCK_LINE_LOW; DATA_LINE_IN; } return tempbyte; } // ---------------------- // Read the temperature // ---------------------- int ReadTemperature(void) { unsigned char Lsb,Msb; char Chk; SendStart(); if (!SendByte(CMD_READ_TEMP)) return 0; while (DATA_LINE_READ); Msb=ReadByte(1); Lsb=ReadByte(1); Chk=ReadByte(0); return ((Msb<<8)+Lsb); } // ------------------ // Read the humidity // ------------------ int ReadHumidity(void) { char Lsb,Msb,Chk; SendStart(); if (!SendByte(CMD_READ_HUM)) return 0; while (DATA_LINE_READ) ; Msb=ReadByte(1); Lsb=ReadByte(1); Chk=ReadByte(0); return ( (Msb<<8)+Lsb ); } // ---------- // main code // ---------- int main(void) { float real_humidity; float real_temperature; int soh; int sot; if ((fd = open("/dev/gpiog", O_RDWR))<0) { printf("Open error on /dev/gpiog\n"); exit(0); } soh=ReadHumidity(); sot=ReadTemperature(); real_humidity= -4 + 0.0405*soh + -2.8E-6; real_temperature = -39.66 + 0.01*sot; printf ("Temperature: %.2f C\n",real_temperature); printf ("Humidity : %.2f %%\n",real_humidity); close(fd); }
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |