Did you ever figure out why the input pins were always '1'? I'm
having this problem and it's very confusing!
--- In Jim Jackson <> wrote:
>
>
> see below for some comments...
>
> On Wed, 9 May 2007, pgb_psu wrote:
>
> > I'm trying to learn how to read the DIO pins on the DIO1 header
on my
> > TS-7260. My first step is simply reading pin 1 (DIO_0) and
placing that
> > value on pin 9 (DIO_4). I've got a function generator putting
out a
> > square wave as my input signal. That signal is connected to gnd
(pin 2)
> > and dio_0 (pin 1) on the DIO1 header. I've got one scope probe
watching
> > the function generator (pin 1 and pin 2) and the second probe
connected
> > to pins 2 and 9 (gnd and DIO_4) of DIO1. When I run the following
> > program, DIO_4 (pin 9) does not shadow DIO_0 (pin 1).
>
> From the output you show at the end, it looks like it does, but it
is
> unchanging - always '1'. I'm surprized you get the value 0xbb.
>
> > I've tried a wide range frequencies thinking that maybe the
frequency of
> > the square wave I'm using is too fast. However, even at 1Hz this
> > program does not work so I'm convinced my problem is in the C
code.
> > I'm new to c so I simply took the read_temp.c program provided by
TS and
> > hacked it to produce the code below and the first bit of output.
> >
> > /********************************
> > * program to read the read data on DIO1 header pin 1 and place
that value on pin 9
> > * hacked from tempSensor.c provided by TS.
> > * PGB 8 May 2007
> > * Peter Burkett <>
> > *******************************/
> > /********************************
> > *Simple program to demonstrate
> > *reading a temperature using
> > *tmp124 on a TS-7200
> > *
> > *EWD Oct. 22 2004
> > *Eddie Dawyiduk <>
> > *******************************/
> >
> > #include "peekpoke.h"
> > #include<unistd.h>
> > #include<sys/types.h>
> > #include<sys/mman.h>
> > #include<stdio.h>
> > #include<fcntl.h>
> > #include<assert.h>
> > #include<time.h>
> >
> >
> > /*Register addresses */
> > #define DIO_PAGE 0x80840000UL
> >
> > /*Offsets*/
> > #define PORTB_DR 0x04
> > #define PORTB_DDR 0x14
> > #define PORTF_DR 0x30
> > #define PORTF_DDR 0x34
> >
> >
> > int main(int argc, char **argv)
> > {
> >
> > unsigned int bits_0123;
> > unsigned int bits_4567;
> > unsigned int tmp;
> > volatile unsigned char *dio_page;
> > int fd = open("/dev/mem", O_RDWR);
>
> open("/dev/mem", O_RDWR | O_SYNC)
>
> > assert(fd != -1);
> >
> > /* Lets intialize our pointers */
> > dio_page = mmap(0, getpagesize(), PROT_READ|PROT_WRITE,
MAP_SHARED, fd,
> > DIO_PAGE);
> > assert(dio_page != MAP_FAILED);
> >
> > // Set our DIO pins 0-3 as inputs and 4-7 as outputs
> > // bits 0-3 in 0x8084_0014 should be cleared (0) for input
> > // bits 4-7 in 0x8084_0014 should be set (1) for output
> > tmp = PEEK8( (unsigned long)(dio_page + PORTB_DDR));
>
> I've never used PEEK8 or POKE8, can't see why you'd need them in
this
> situation. But the (unsigned int) looks wrong. dio_page+PORTB_DDR
> is char * so simply doing...
>
> tmp = (unsigned int)(*(dio_page + PORTB_DDR));
>
> should work for reading and similar for writing.
>
> > printf("Value of PORTB_DDR when program starts: 0x%x \n",
tmp);
> >
> > POKE8( (unsigned long)(dio_page + PORTB_DDR), 0xF0 );
> > tmp = PEEK8( (unsigned long)(dio_page + PORTB_DDR));
> > printf("Value of PORTB_DDR after setting it to 0xf0: 0x%x
\n", tmp);
> > tmp = PEEK8( (unsigned long)(dio_page + PORTB_DR));
> > printf("Value of PORTB_DR befor loop: 0x%x \n", tmp);
> >
> > // setup while loop to read DIO_0-DIO_3 and shadow them on
DIO_4-DIO_7
> > while (1) {
> > bits_0123 = PEEK8((unsigned long)(dio_page +
PORTB_DR) );
> > printf("Value of PORTB_DR in loop: 0x%x \n",
bits_0123);
> >
> > bits_0123 <<= 4; // shift bits 0-3 into positions 4-
7
> > bits_4567 = bits_0123 & 0x0F0; //AND bits to clear
bits above bit 7
> > printf("Value written to PORTB_DR after
shift: 0x%x \n", bits_4567);
> >
> > // write the word out
> > POKE8( (unsigned long)(dio_page + PORTB_DR),
bits_4567);
> > tmp = PEEK8((unsigned long)(dio_page + PORTB_DR));
> > printf("Value of PORTB_DR after write: 0x%x
\n\n", tmp);
> >
> > usleep(100);
> >
> > }
> >
> > return 0;
> >
> > }
> >
> > Value of PORTB_DDR when program starts: 0xf0
> > Value of PORTB_DDR after setting it to 0xf0: 0xf0
> > Value of PORTB_DR befor loop: 0xbb
> > Value of PORTB_DR in loop: 0xbb
> > Value written to PORTB_DR after shift: 0xb0
> > Value of PORTB_DR after write: 0xbb
> >
> > Value of PORTB_DR in loop: 0xbb
> > Value written to PORTB_DR after shift: 0xb0
> > Value of PORTB_DR after write: 0xbb
> >
> >
> >
>
------------------------------------
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/ts-7000/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/ts-7000/join
(Yahoo! ID required)
<*> To change settings via email:
<*> To unsubscribe from this group, send an email to:
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|