CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Reading an RFID chip

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Ringo42



Joined: 07 May 2004
Posts: 263

View user's profile Send private message

Reading an RFID chip
PostPosted: Tue Sep 09, 2008 11:07 am     Reply with quote

I'm using a PIc 18f2221 at 20Mhz and want to talk to a EN4095 RFID chip. The tags I'm using are Manchester encoded and have 64 clock cycles per bit.
I'm just starting to think about how to do this. Since it is Manchester I need to see if the bit goes high or low in the middle of the period. What would be the best way to do this? I originally laid out the board and hooked up clock to A0 and the data in to A2, but now I'm thinking I probably should have put the clock on B0 so I could use an interrupt to count the clocks. Would this have been the easiest way? the clock runs at 125 Khz. So what I'm thinking is once I determine I'm starting, I can count 20 clock or so and see what the bit is, (about 1/3 into the period), wait 24 clocks (2/3) and check it again and at that point decide if it went up or down and if it is a 0 or a 1. then count the last 20 clocks and call the bit done and start over.

Just looking for opinions before I start down the wrong path writing the code.
Thanks
Ringo
_________________
Ringo Davis
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Tue Sep 09, 2008 11:43 am     Reply with quote

From Google, here is some manchester CCS code:
http://www.radiotronix.com/downloads/an401.c

Also how about trying a search of the CCS forum? Lots of stuff if you just search on the word Manchester.
Ringo42



Joined: 07 May 2004
Posts: 263

View user's profile Send private message

PostPosted: Tue Sep 09, 2008 1:24 pm     Reply with quote

I did not realize ex_rfid.c existed. I'm hoping to strip that down to just what I need. Does anybody know of a reason that an 18F2221 at 20mhz would not work in place of the 18F452 at 20 mhz? I just need to move my pins over to the correct connections.
Ringo
_________________
Ringo Davis
Ringo42



Joined: 07 May 2004
Posts: 263

View user's profile Send private message

PostPosted: Wed Sep 10, 2008 8:33 pm     Reply with quote

I'm trying to get ex_rfid.c to work. I'm using an 18f2221 instead of a 16f876a. The code never returns any data from the RFID chip so I'm trying to figure out why. The data stream looks ok on my O-scope.
I have traced it all the way down to the isr_ccp1() in em_4095.c

That code is below
I enabling the int and setting RF_readMode = RF_FIND_WIDTH.
So theoretically the array widths[] should have the widths of the data stream, but I get either 0's or 255's

Comparing the 876a and 2221 data sheet the only thing I see that is different is the 876 says C0 is timer 1 input and the 2221 says c0 is timer1/3 input. I can not find anywhere if I need to tell it to use timer 1 instead of timer 3. Could this be the issue?
The pic runs at 20mhz. The clk on c0 is approx 120khz
The pulses range from 240us to 520 us, so I would expect the width values to range from 30 to 65.

Any theories, or anybody have any experience with this example code?

Thanks
Ringo




Code:
#INT_CCP1
void isr_ccp1()
{
   int8  width;
//printf("c");
   // Toggle between capturing rising and falling edges to meausure width
   if(RE_FE_TOGGLE)
   {
      setup_ccp1(CCP_CAPTURE_FE);
      RE_FE_TOGGLE = 0;
   }
   else
   {
      setup_ccp1(CCP_CAPTURE_RE);
      RE_FE_TOGGLE = 1;
   }

   // Calculate the width
   width = CCP_1 - old_clock;
   old_clock = CCP_1;

   switch(RF_readMode)
   {
   
      // Use to receive manchester formatted data from a transponder
      case RF_MANCHESTER_DATA:
      {
//         if(width > 54)           // Check for a phase change
         if(width > 54)           // Check for a phase change
         {
            bitValue = ~bitValue; // Invert the save bit value
            storeData = TRUE;     // Force a bit store
         }

         if(storeData)
         {
            shift_right(RFbuffer+RFbuffer_index, 1, bitValue);
            ++dataTransferred;

            if(++RFbuffer_bitIndex == 8)
            {
               RFbuffer_bitIndex = 0;
               ++RFbuffer_index;
            }
         }

         storeData = ~storeData;
         break;
      }

      // Use to read high and low widths
      case RF_MEASURE_WIDTHS:
      {
         RFbuffer[RFbuffer_index++] = width;
         ++dataTransferred;

         break;
      }

      // Use to search for a certain pulse width
      case RF_FIND_WIDTH:
      {
         if(width > (RF_widthToFind - RF_uncertainty)
         && width < (RF_widthToFind + RF_uncertainty))
         {
            RF_widthFound = TRUE;
         }
         widths[RFbuffer_index++]=width;   
         break;
      }

      case RF_FIND_PATTERN:
      {
         if(width > RF_findWidths[RFbuffer_index] - RF_uncertainty
         && width < RF_findWidths[RFbuffer_index] + RF_uncertainty)
         {
            if(++RFbuffer_index == dataTransferred)
            {
               RF_patternFound = TRUE;
            }
         }
         else
         {
            if(RFbuffer_index > 0)
            {
               int8 pos, i, j;
               pos = RFbuffer_index-1;   // Save the initial position

               // Try to match partial pattern
               while(--RFbuffer_index != 0)
               {
                  if(width > RF_findWidths[RFbuffer_index] - RF_uncertainty
                  && width < RF_findWidths[RFbuffer_index] + RF_uncertainty)
                  {
                     for(i=pos, j=RFbuffer_index-1; j!=255; --i, --j)
                     {
                        if(RF_findWidths[j] != RF_findWidths[i])
                        {
                           break;
                        }
                     }
                     if(j == 255)
                     {
                        break;
                     }
                  }
               }
            }
         }
         break;
      }
   }
}


_________________
Ringo Davis
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group