This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

TTL interface of swipe card reader

HAI,
I would like to implement TTL interface to a swipe card reader. I want to read track 2 of a card .This contains alphanumeric characters and each character is of 5 bit size which includes one parity bit.
I designed a hardware circuit for this with AT89c2051.
The data is coming as a stream of bits from the readers magnetic head. So I have store this bit stream to a bit array. I used bdata variable for this purpose, but is not possible to write to the bit position.
How I can write these bits to my bit array? What is wrong with code below: I used the pin P1.6 as the input for the data from card reader's magnetic head. Please help me.

sbit dat=P1^6;
bdata unsigned char mydata[13];

for (i = 0; i < 13; i++)
{
for (mask = 0x01; mask != 0x00; mask <<= 1)
 {
  mydata[i] & mask = dat;
 }
}


Here the error I got is errorC141:syntax error near'=';

Please give a replay.

Parents Reply Children
  • C doesn't has any bit arrays.

    Standard C programming can allow you to use a byte array to store any sequence of bits. All you need are the shift operations << and >> together with bit-and & and bit-or |.

    To insert five bits at a time, you can keep two variables.

    Current start byte to write in. (0 .. sizeof(array))
    Current bit position to write in. (0 .. 7)

    if bit offset is 0: write only in first byte and increment bit offset by 5.

    if bit offset is 1: write only in first byte and increment bit offset by 5.

    if bit offset is 2: write only in first byte and increment bit offset by 5.

    if bit offset is 3: write only in first byte. then increment byte offset and set bit offset to 0.

    if bit offset is 4: write four bits in first byte. then write 1 bit to start of second byte. increment byte offset and set bit offset to 1.

    ...

    if bit offset is 7: write one bit to first byte. then write 4 bits to start of second byte. increment byte offset and set bit offset to 4.

    The above can be merged into quite few lines of C code, and is left as an exercise.

    Note that writes to the first byte may require a shift left to skip a number of bit positions. Writes to the second byte may require a shift right, to throw away already written bits.

    If a 16-bit processor was used, it would normally be efficient to have a 16-bit variable where the data is shifted in, and whenever it contains >= 8 bits of data, then one byte is written. This of course also requires that the transfer is finalized by inserting dummy bits after the transfer, until a full byte is available for storing.

  • HAI,
    How can I acess a single bit from a character and store a bit into that location ? can you please post a simple example of that.

  • Access:

    (*Store) & (1<<BitNumber);
    

    Store:

    if (BitVal==0)
      *Store &= ~(1<<BitNumber);
    else
      *Store |= (1<<BitNumber);
    

    BitNumber is a value 0 to 7.

  • Since bit manipulation into normal C data types (char or int) is really standard: Why do you not use Google to search for example code? Are you afraid that you may find too many examples?

  • read bit 5:

    unsigned char c = (mydata[i] & 0x20) >> 5 ;
    

    turning bit 5 on:

    mydata[i] |= 0x20 ;
    

    turning bit 5 off:

    mydata[i] &= ~0x20 ;
    

  • This has two magic constants that needs to be updated if changing to another bit number:

    unsigned char c = (mydata[i] & 0x20) >> 5 ;
    

    Probably better to only have one constant that depends on which bit position to work with.

    unsigned char c = (mydata[i] >> 5) & 1;
    

    I really prefer (1<<5) before 0x20 when working with single bits.