|
|
View previous topic :: View next topic |
Author |
Message |
koray_duran
Joined: 04 Feb 2010 Posts: 37
|
EM4150 reading problem |
Posted: Thu Dec 23, 2010 4:03 am |
|
|
Hello again,
I have a problem about reading my 4150 tag which I supplied from ccs c rfid development kit. I've some changed the code for my own hardware but the drivers and basic hardware not modified.
I can read 4102 tags, I can login to 4150 and I can write to 4150 (not tested) but I can't read 4150.
The problem I get is : PARITY ERROR
Please give me some idea. Here is my code :
Code: |
#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT
#use delay(clock=20M)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=RS)
#define BUZZER PIN_C4
#define RS485_EN1 PIN_B4
#define RS485_EN2 PIN_B5
#define SENSE INPUT(PIN_C3)
#include <em4095.c>
#include <em4102.c>
#include <em4150.c>
#include <stdlib.h>
int8 msg[32];
int8 code[5];
int8 rcv_data=0;
int8 err;
typedef enum {OFF, GREEN, RED, BLUE, YELLOW, WHITE} LEDcolor;
// LED Control
void led_control(LEDcolor color) {
switch(color) {
case OFF:
output_low(PIN_A1);
output_low(PIN_A0);
output_low(PIN_A2);
break;
case GREEN:
output_low(PIN_A1);
output_low(PIN_A0);
output_high(PIN_A2);
break;
case RED:
output_high(PIN_A1);
output_low(PIN_A0);
output_low(PIN_A2);
break;
case BLUE:
output_low(PIN_A1);
output_high(PIN_A0);
output_low(PIN_A2);
break;
case YELLOW:
output_high(PIN_A1);
output_low(PIN_A0);
output_high(PIN_A2);
break;
case WHITE:
output_high(PIN_A1);
output_high(PIN_A0);
output_high(PIN_A2);
break;
}
}
void rs_init(int8 way) {
if(way==0) {
output_low(RS485_EN1);
output_low(RS485_EN2);
}
if(way==1) {
output_high(RS485_EN1);
output_high(RS485_EN2);
delay_ms(25);
}
}
void clear() {
rs_init(0);
led_control(GREEN);
rcv_data=0;
}
#INT_RDA
void receiving_data() {
rcv_data=getc(RS);
}
void main(void) {
int32 tagNum=0x00;
int8 customerCode=0x00;
int8 tag_adr=0x00; // tag_adr is between 0-33
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
rf_init();
//rf_powerUp();
rs_init(0);
led_control(GREEN);
while(true) {
restart_wdt();
if(rcv_data==0x45) {
led_control(OFF);
reset_4150();
CLEAR();
}
if(rcv_data==0x4C) {
led_control(YELLOW);
rs_init(1);
err = login_4150(0x00);
switch(err) {
case ERR_OK: sprintf(msg,"\n\rOK"); break;
case ERR_LIW: sprintf(msg,"\n\rLIW"); break;
case ERR_NAK: sprintf(msg,"\n\rNAK"); break;
case ERR_PARITY: sprintf(msg,"\n\rPARITY"); break;
}
puts(msg,RS);
CLEAR();
}
if(rcv_data==0x54) {
led_control(WHITE);
rs_init(1);
if((err = read_4150(msg,tag_adr)) == ERR_OK) {
tagNum = make32(msg[3], msg[2], msg[1], msg[0]);
sprintf(msg, "\n\rData: %lu", tagNum);
}
switch(err) {
case ERR_LIW: sprintf(msg,"\n\rLIW"); break;
case ERR_NAK: sprintf(msg,"\n\rNAK"); break;
case ERR_PARITY: sprintf(msg,"\n\rPARITY"); break;
}
puts(msg,RS);
CLEAR();
}
if(rcv_data==0x52) {
led_control(BLUE);
if(read_4102(code)) {
rs_init(1);
tagNum = make32(code[1],code[2],code[3],code[4]);
sprintf(msg,"\r\nScanned ID: %u-%lu",customerCode,tagNum);
puts(msg,RS);
sprintf(msg,"( [%u][%u]",code[0],code[1]);
puts(msg,RS);
sprintf(msg,"[%u][%u][%u] )",code[2],code[3],code[4]);
puts(msg,RS);
CLEAR();
}
}
if(rcv_data==0x57) {
led_control(RED);
rs_init(1);
tagNum = make32(0x01,0x02,0x03,0x04);
tag_adr=0;
err = write_4150(tagNum,tag_adr);
switch(err) {
case ERR_OK: sprintf(msg,"\n\rOK"); break;
case ERR_LIW: sprintf(msg,"\n\rLIW"); break;
case ERR_NAK: sprintf(msg,"\n\rNAK"); break;
case ERR_PARITY: sprintf(msg,"\n\rPARITY"); break;
}
puts(msg,RS);
PWprotect_4150(FALSE);
CLEAR();
}
}
}
|
|
|
|
olivervd
Joined: 10 Oct 2014 Posts: 10
|
|
Posted: Tue Oct 14, 2014 5:43 am |
|
|
hello,
me too.
I have same problem.
Can you help me?sorry |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Oct 14, 2014 6:10 am |
|
|
see #4 in this post
http://www.ccsinfo.com/forum/viewtopic.php?t=26245
this of course dos not compile as is.
AND
also - you have quite a few LIBS that you call -but no code for them shown.
AND the "logic" of your tests on
rcv_data seems quite faulty.
To see this ,
trace out what happens in main when a given recognized value for it IS received, but then no new chars follow ?
What will main() do about it ?
what does your schematic look like
OR how are you simulating / testing this ? |
|
|
olivervd
Joined: 10 Oct 2014 Posts: 10
|
|
Posted: Thu Oct 16, 2014 12:56 am |
|
|
Hello,
Thanks for you answer, this is my code.
I use PCW compiler(CCS).
My hardware is the recommended EM Marin for Em4150. If you need my schematic I can send for email.
When I run my circuit emerge the next message "ERROR PARITY".
I can read em4100 and em4102, also I can write em4150, but I can't read em4150.
Can you help me?
This is my email: [email protected]
Code: |
#include <16F876.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT
#use delay(clock=20000000)
#users232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=S)
#include <em4095.c>
#include <em4102.c>
#include <em4150.c>
#include <stdlib.h>
int32 msg;
int8 err;
int32 tagNum=0x00;
int8 tag_adr=5;// tag_adr is between 0-33
#INT_RDA
void receiving_data() {
rcv_data=getc(RS);
printf("valor de rcv_data principal= %d",rcv_data);
}
void main(void) {
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
delay_ms(1000);
rf_init();
rf_powerUp();
while(true) {
restart_wdt();
err = read_4150(*msg,tag_adr);
tagNum=msg;
switch(err) {
case ERR_OK: //sprintf(msg, "\n\rData: %lu", tagNum);
sprintf(msg, "\n\rData: %x", tagNum);
break;
case ERR_LIW: sprintf(msg,"\n\rLIW LECTURA");
break;
case ERR_NAK: sprintf(msg,"\n\rNAK LECTURA");
break;
case ERR_PARITY:
sprintf(msg,"\n\rPARITY LECTURA");
//printf("PARITY\n\r");
break;
}
puts(msg,RS);
clear();
}
}
|
|
|
|
olivervd
Joined: 10 Oct 2014 Posts: 10
|
|
Posted: Thu Oct 16, 2014 1:07 am |
|
|
For simulation I use serial transmission, by Arduino (I use Arduino example "Software Serial"). |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 16, 2014 11:32 am |
|
|
First, your code doesn't compile, so that's not your real program.
For example, you have stream=S, but then you call fgetc(RS).
There are several errors like this.
But the main problem is that you are not calling read_em4150()
correctly. The first parameter is declared to be a pointer, so you
should be giving it the address of msg.
You are doing this. It's wrong:
Quote: | err = read_4150(*msg, tag_adr); |
You should do it like this:
Code: | err = read_4150(&msg, tag_adr); |
|
|
|
olivervd
Joined: 10 Oct 2014 Posts: 10
|
|
Posted: Fri Oct 17, 2014 12:36 am |
|
|
PCM thank you for your answer,
I have tried your advise but I have a same problem. I run my circuit and emerge the same error "PARITY".
Code: |
#include <16F876a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=RS)
#include <em4095.c>
#include <em4102.c>
#include <em4150.c>
#include <stdlib.h>
int32 msg;
int8 err;
int32 tagNum=0x00;
int8 tag_adr=5;// tag_adr is between 0-33
void main(void) {
rf_init();
rf_powerUp();
while(true) {
// restart_wdt();
//LOGIN
err = login_4150(0x00);
// resultado=readProtect_4150(1, 2);
// printf("valor de Resultado = %d\n\r",resultado);
// printf("valor de ERR LOGIN = %d\n\r",err);
switch(err) {
case ERR_OK: printf("\n\rOK LOGIN"); break;
case ERR_LIW:printf("\n\rLIW LOGIN"); break;
case ERR_NAK:printf("\n\rNAK LOGIN"); break;
case ERR_PARITY: printf("\n\rPARITY LOGIN"); break;
}
puts(msg,RS);
delay_ms(500);
//ESCRITURA
tagNum = make32(0x01,0x02,0x03,0x04);
tag_adr=5;
err = write_4150(tagNum,tag_adr);
switch(err) {
case ERR_OK: printf("\n\rOK ESCRITURA");
break;
case ERR_LIW:printf("\n\rLIW ESCRITURA"); break;
case ERR_NAK: printf("\n\rNAK ESCRITURA"); break;
case ERR_PARITY: printf("\n\rPARITY ESCRITURA"); break;
}
puts(msg,RS);
PWprotect_4150(FALSE);
delay_ms(500);
err=setPassword_4150(oldPassword, newPassword);
printf("valor de ERR Password = %d\n\r",err);
//LECTURA
err = read_4150(&msg,5);
tagNum=msg;
switch(err) {
case ERR_OK: printf("Data: %lu \n\r", tagNum);
printf("Data: %x \n\r", tagNum);
break;
case ERR_LIW: printf("\n\rLIW LECTURA");
break;
case ERR_NAK: printf("\n\rNAK LECTURA");
break;
case ERR_PARITY:
printf("\n\rPARITY LECTURA");
//printf("PARITY\n\r");
break;
}
puts(msg,RS);
//RESET
err= reset_4150() ;
switch(err) {
case ERR_OK: printf("\n\rOK RESET");
break;
case ERR_LIW: printf("\n\rLIW RESET");
break;
case ERR_NAK: printf("\n\rNAK RESET");
break;
}
}
} |
|
|
|
olivervd
Joined: 10 Oct 2014 Posts: 10
|
|
Posted: Fri Oct 17, 2014 12:50 am |
|
|
The error R change RS, it was error by copy-paste. |
|
|
|
|
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
|