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 support@ccsinfo.com

data from tag RFID to 16F887 and LCD

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



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

data from tag RFID to 16F887 and LCD
PostPosted: Sat Apr 06, 2013 5:12 pm     Reply with quote

Hi mates, I need your help.. I have a reader HID and I'm trying read a tag using a PIC16F887 + LCD16x2

Thanks for your time and any help

My problem:
-At the moment and after pass my tag several times I am reading HEX 66 F2 62 62 62 42 but I must read HEX 90 62 FD 59


My configuration
Lector->Max232->PIC16F887->LCD (LCD to port D)

Test:
-reader connected to PC using a converser RS232-USB I can read my correct data in hyperterminal
-reader connected max232->PIC--max-->conversorRs232-USB-->PC Hyperterminal just I can see data like: F0 00 F0 F0 00 00 00 F0 F0 F0 F0 F0 F0

PIC16F887 (DIP 40)
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en026561
reader HID R10
http://www.keyscan.ca/Languages/Spanish/PDFs/es_iclass_r10.pdf

CCS version 4.068

Code:
#include <16F887.h>
#FUSES HS,NOWDT,MCLR
#use delay(clock=20000000)
#use rs232(baud=57600, xmit=pin_c6, rcv=pin_c7, bits=8,parity=N, ERRORS)

#use fast_io(b)
#use fast_io(c)
#include <lcd.c>

int const lenbuff=6;
char  a=0;

int  xbuff=0x00;     
char cbuff[lenbuff];

#int_rda
void serial_isr()
{             
   char rcvchar= ' ';           
   rcvchar=0x00;
   if(kbhit())
   {                 
      rcvchar=getc();             
      cbuff[xbuff]=rcvchar;     
      xbuff++;
   }   
   if(xbuff>=1) //
   {
   putc(rcvchar); //test to PC
   //xbuff=0x00;
   }
 }

void init_cbuff(void){
   int i;
 
   for(i=0;i<lenbuff;i++){
      cbuff[i]=0x00;         
   }
   xbuff=0x00;           
}

void main() {

set_tris_c(0x10111111);       
lcd_init();
disable_interrupts(global);
enable_interrupts(int_rda);
enable_interrupts(global); 

init_cbuff();               
lcd_putc("\f");

a=128; //test LCD
     while(TRUE)
        {         
         lcd_gotoxy(1,1);
         printf(lcd_putc,"%X",a); //test LCD
         
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%X",cbuff[2]); // just one
        //tag example (HEX): 90 62 FD 59     
         }     
}


Last edited by f0raster0 on Thu May 30, 2013 3:00 am; edited 6 times in total
temtronic



Joined: 01 Jul 2010
Posts: 9199
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Apr 06, 2013 7:13 pm     Reply with quote

This post sounds familiar....but..

1) replace the 'HID reader' with a PC running a terminal program. Test by sending data from the PC keyboard. When you get your PIC program to work correctly then reconnect your 'HID reader'.

Without a link or datasheet about your "HID reader' I (we) have no idea as to the data is is supplying. In fact I have no idea what an 'HID reader' is other than a piece of test equipment designed for testing of HID light bulbs.

2) whenever you post saying 'bad data, or not as expected', you should show both good data (what you expect) and bad data (what you get). With 'serial data' it could be an incorrect setup, timing error, bit shifting,???....so the more information you supply, the better the responses from this forum.

3) also, when using serial (aka RS-232), put 'errors' in the #use rs232(....options...), it'll keep the hardware UART (if used) from stopping due to errors.

hth
jay
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Sat Apr 06, 2013 8:17 pm     Reply with quote

thanks I have edited my information above Sad

Last edited by f0raster0 on Sun May 05, 2013 6:28 am; edited 3 times in total
temtronic



Joined: 01 Jul 2010
Posts: 9199
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Apr 07, 2013 5:45 am     Reply with quote

hmm... going to that link causes my IE8 to 'bluescreen' ! Even the homepage....arrgh....

Simple test...if you connect the reader to a PC running a terminal program, do you get correct data ?

If so, great...hardware is good..

Have a look at the ex_sisr.c example in the examples folder. It's an example that CCS supplies to show how to implement an interrupt driven,buffered serial port.

oh.. have you added 'errors' to the use RS232(...options...)? It's a _must do_ .

hth
jay
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Mon May 06, 2013 2:04 am     Reply with quote

I can't find the problem.

To sending data from hyperterminal to PIC it doesn't backs my test-message puts("Hello test"); just give me "ppppppppppppppp".

-CCS version 4.068
Could CCS has some problem with interruptions for my PIC16F887?
-PIC 16F887 DIP40 (I have two 16F887)
-I am waiting for a new crystal (4Mhz and 20MHz) at moment I am using 20Mhz.
-My max232 work fine with Arduino and my reader R10

Here is my test PC-max232-PIC16F887-PC
Code:
#include <16F887.h>
#FUSES HS,NOWDT,MCLR
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8,parity=N, ERRORS)

#include <lcd.c>

char  ch;

#int_rda
void serial_isr()
   {             
   ch = getchar();           
   puts("Hello test"); //doesn`t work
   }
   
void main()
{     
lcd_init();
   enable_interrupts(global);   
   enable_interrupts(int_rda);

     while(TRUE)
        {
        lcd_gotoxy(1,1);
        printf(lcd_putc, "test LCD"); //work ok
       
        lcd_gotoxy(2,1);
        printf(lcd_putc, "\n\r value %c",ch); //doesn't work         
        }     
}
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Mon May 06, 2013 8:21 am     Reply with quote

puts(.....) // takes too much char receive time !!!!!!
in your ISR is a disaster !!!

also the kbhit will always be true as thats why the isr was called

a bigger receive buffer and structure for correctly removing chars would help

&&

lastly enable the RDA int BEFORE global ints
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Mon May 06, 2013 2:25 pm     Reply with quote

Using puts() in a INT_RDA handler is normally bad practice because it takes longer to send your string than it takes to receive one character. This will cause your receive UART to overflow and loose data.
Having said that, in your test program I would at least have expected to see part of the "Hello test" message. Not seeing this suggests a major problem for which I see 2 possible causes:
1) What happens when you create a simple test program without interrupts that sends the "Hello test" message to the PC?
2) Your v4.068 compiler is very old and known to have problems. The V4 compiler started only to work a bit as expected around the v4.075 version, that is about 10 releases newer than you are using.
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Tue May 07, 2013 12:27 am     Reply with quote

ohh noo mates..¡¡

Quote:
I would at least have expected to see part of the "Hello test" message

I have changed my crystal of 20MHz to 4MHz then my test:
PC-max232-PIC16F887-PC works fine :-)

I bought two crystal I'm waiting these after I will check my first code..
and yes, I will do a couple changes in my code

Quote:

puts() in a INT_RDA handler is normally bad practice

lastly enable the RDA int BEFORE global ints


hey again on microchip for my pickit2 same remark :-P yes, I backed to the PICs with my old stuff
Quote:
2) Your v4.068 compiler is very old
Cool

thanks a lot

Edit: ok, thanks
Quote:
..resistor in series with the 20MHz crysta.. ..crystal application notes from Microchip


Last edited by f0raster0 on Tue May 07, 2013 1:02 am; edited 2 times in total
Ttelmah



Joined: 11 Mar 2010
Posts: 19439

View user's profile Send private message

PostPosted: Tue May 07, 2013 12:41 am     Reply with quote

Common problem with the 887. You need a resistor in series with the 20MHz crystal.
Basically the oscillator on this chip, has a higher gain than many, and can tend to lock onto the wrong harmonic if driven hard. The resistor just slightly attenuates the signal.
Read the crystal application notes from Microchip.

This is one reason why you will find many of the 'old hands' here telling posters to _always_ start with a 'flash an LED' test when something doesn't work. Verifying just what frequency a chip is running at, is an essential 'first test'.

Best Wishes
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Sat May 11, 2013 7:44 pm     Reply with quote

The problem was 20MHz Crystal. I have changed it and my test works fine

Here my code for test
Code:


#include <16F887.h>
#FUSES HS,NOWDT,MCLR
#use delay(clock=20000000)
#use rs232(baud=57600, xmit=pin_c6, rcv=pin_c7, bits=8,parity=N, ERRORS)
#include <lcd.c>

char  ch;

#int_rda
void serial_isr()
   {             
   ch = getchar();           
   puts("Hello test"); //ok
   }
   
void main()
{     
lcd_init();
   enable_interrupts(int_rda);
   enable_interrupts(global);   
   

     while(TRUE)
        {
        lcd_gotoxy(1,1);
        printf(lcd_putc, "test LCD"); //ok
       
        lcd_gotoxy(2,1);
        printf(lcd_putc, "\n\r value %c",ch); // ok         
        }     
}
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Thu May 30, 2013 2:57 am     Reply with quote

Hey again Very Happy

After solved my test.. I have been trying with my main code..
I want to read a tag and show it in LCD without apply power reset for read the next tag.

How can I finish the While(true) after the string is showed in LCD?
because at the moment my code read just one tag after any power reset.

I have used "break; " into of the While(true) but finish the While(true).. :-(
also used
Do {
if (xbuff<4)
} While(true);

Here my main-code, thanks for any help/idea :-)

Code:
#include <16F887.h>
#FUSES HS,NOWDT,MCLR
#use delay(clock=20000000)
#use rs232(baud=57600, xmit=pin_c6, rcv=pin_c7, bits=8,parity=N, ERRORS)
#include <lcd.c>

int const lenbuff=4;
int  xbuff=0x00;
char cbuff[lenbuff];
char rcvchar;

#int_rda
void serial_isr()
{                                 
 rcvchar=0x00;
 if(kbhit())
   {                   
     rcvchar=getch();             
     cbuff[xbuff++]=rcvchar;     
   }
}
//---------------------------------
void init_cbuff(void)
{
   int i;
   for(i=0;i<lenbuff;i++)
   {
      cbuff[i]=0x00;           
   }
   xbuff=0x00;           
}
//---------------------------------
void main()
{         
   disable_interrupts(int_rda);
   enable_interrupts(int_rda);
   enable_interrupts(global); 
   lcd_init(); 
   init_cbuff();
     
     While(True)
     {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%X %X %X %X",cbuff[1],cbuff[2],cbuff[3],cbuff[4]);     
      }                   
}
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Thu May 30, 2013 6:33 am     Reply with quote

Hi,

Think about the problem a little bit. How big is your character buffer? How many elements are filled the first time you read an RFID tag? How many elements are filled the second time you read an RFID tag? Is there sufficient storage space inside cbuff[] to store the data from subsequent RFID tag reads the way your code is written?

Hint: you need to reset xbuff to zero after each complete read of an RFID tag....

A couple of other things: You should add a little bit of a delay after your lcd_init() routine to give the LCD sufficient time to power-up. Your init_cbuff routine is totally unnecessary. Since you execute this code only once at power-up, you can just zero the array and the counter when you declare these variables.

John
f0raster0



Joined: 05 Nov 2010
Posts: 22

View user's profile Send private message

PostPosted: Fri May 31, 2013 2:32 am     Reply with quote

Hello John, thanks mate..

I have used " if(xbuff>=4) xbuff=0x00;" (again, I had delete it), but yes, without "init_cbuff();", so now it look perfect :-P

Code:
void serial_isr()
{                                 
 rcvchar=0x00;
 if(kbhit())
   {                   
     rcvchar=getch();             
     cbuff[xbuff++]=rcvchar;     
   }
   if(xbuff>=4)   xbuff=0x00;
}
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