| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| chingB 
 
 
 Joined: 29 Dec 2003
 Posts: 81
 
 
 
			    
 
 | 
			
				| Wiegand to Serial Driver |  
				|  Posted: Sat Aug 12, 2006 12:53 am |   |  
				| 
 |  
				| 
 I hope this simple code will help.
 
 
  	  | Code: |  	  | #byte PORTB   = 0xF81    // PortB special function register
 
 #bit  RBPU    = 0xFF1.7  // PortB pull-ups enable bit (0-enable, 1-disable)
 #bit  TMR3IF  = 0xFA1.1  // Timer3 Interrupt Flag bit
 
 #bit  INTEDG0 = 0xFF1.6  // ext0 interrupt edge select bit
 #bit  INT0IF  = 0xFF2.1  // ext0 interrupt flag bit
 #bit  INTEDG1 = 0xFF1.5  // ext1 interrupt edge select bit
 #bit  INT1IF  = 0xFF0.0  // ext1 interrupt flag bit
 
 #bit  DATA0   = 0xF81.0  // data0 wiegand signal
 #bit  DATA1   = 0xF81.1  // data1 wiegand signal
 
 // PortB[0..7] weak pullups macro
 #define ENABLE_PULLUPS()      RBPU=0    // enable weak pullups on PortB
 #define DISABLE_PULLUPS()     RBPU=1    // disable weak pullups on PortB
 
 #define TX_SIZE 64               // RS485 TX data size
 byte TXbuffer[TX_SIZE];          // RS485 TX buffer
 byte TXin  = 0;                  // RS485 TX data IN index
 byte TXout = 0;                  // RS485 TX data OUT index
 
 int1 gltmr3f    = 0;
 int1 glprocessf = 0;
 int1 gldata0f   = 0;
 int1 gldata1f   = 0;
 
 unsigned int8  siteCode    = 0;
 unsigned int16 idCode      = 0;
 unsigned int32 wiegandData = 0;
 
 
 | 
 
  	  | Code: |  	  | #int_ext    // Data0 external interrupt
 void data0_isr()
 {
 if (!gldata0f)
 wiegandData <<= 1;
 
 if (!gltmr3f){
 set_timer3(30536);
 clear_interrupt(int_timer3);
 enable_interrupts(int_timer3);
 gltmr3f = 1;
 }
 }
 
 #int_ext1   // Data1 external interrupt
 void data1_isr()
 {
 if (!gldata1f){
 wiegandData <<= 1;
 wiegandData |= 1;
 }
 
 if (!gltmr3f){
 set_timer3(30536);
 clear_interrupt(int_timer3);
 enable_interrupts(int_timer3);
 gltmr3f = 1;
 }
 }
 
 #int_timer3 // 3mSec. timeout
 void timer3_isr()
 {
 disable_interrupts(int_timer3);
 glprocessf = 1;
 gldata0f = 1;
 gldata1f = 1;
 }
 
 #int_tbe
 void Serial_TX_isr()
 {
 putc(TXbuffer[TXout]);           // put char to TXbuffer then send
 TXout=(TXout+1) % TX_SIZE;       // increment & limit to max buffer size
 if(TXin==TXout)                  // if last in data, stop RS485 TX interrupt
 disable_interrupts(int_tbe);   // disable transmit interrupt
 }
 | 
  	  | Code: |  	  | void bputc(char c)                  // bufferred putc routine
 {
 short restart;                   // restart flag
 int ni;                          // temp variable
 
 restart=TXin==TXout;             // set restart flag at start
 TXbuffer[TXin]=c;                // store char to TXbuffer
 ni=(TXin+1) % TX_SIZE;           // limit to max buffer size
 while(ni==TXout);
 TXin=ni;
 if(restart)                      // enable TX interrupt
 enable_interrupts(int_tbe);
 }
 
 int1 check_Parity(unsigned int8 index,unsigned int32 wgCode)
 {
 int1 pResult   =0;
 unsigned int8 i=0;
 
 for (i=index; i<index>>16) & 0xFF;
 printf(bputc,"\r\nSite Code = %U ** ID Code = %LU \r\n",siteCode,idCode);
 wiegandData = 0;
 }
 }
 gldata0f = 0;
 gldata1f = 0;
 gltmr3f = 0;
 }
 }
 }
 | 
 
 Enjoy... =P
 |  | 
	
		|  | 
	
		| Newbaby 
 
 
 Joined: 12 Aug 2006
 Posts: 1
 
 
 
			    
 
 | 
			
				| Wiegand to Serial Driver |  
				|  Posted: Sat Aug 12, 2006 2:49 am |   |  
				| 
 |  
				| Hi ChingB, 
 Could you put an example code to show how to use your driver please
 |  | 
	
		|  | 
	
		| chingB 
 
 
 Joined: 29 Dec 2003
 Posts: 81
 
 
 
			    
 
 | 
			
				| Re: Wiegand to Serial Driver |  
				|  Posted: Sun Aug 13, 2006 2:21 am |   |  
				| 
 |  
				|  	  | Newbaby wrote: |  	  | Hi ChingB, 
 Could you put an example code to show how to use your driver please
 | 
 
 Below is the complete code listing:
 
  	  | Code: |  	  | #byte PORTB   = 0xF81    // PortB special function register
 
 #bit  RBPU    = 0xFF1.7  // PortB pull-ups enable bit (0-enable, 1-disable)
 #bit  TMR3IF  = 0xFA1.1  // Timer3 Interrupt Flag bit
 
 #bit  INTEDG0 = 0xFF1.6  // ext0 interrupt edge select bit
 #bit  INT0IF  = 0xFF2.1  // ext0 interrupt flag bit
 #bit  INTEDG1 = 0xFF1.5  // ext1 interrupt edge select bit
 #bit  INT1IF  = 0xFF0.0  // ext1 interrupt flag bit
 
 #bit  DATA0   = 0xF81.0  // data0 wiegand signal
 #bit  DATA1   = 0xF81.1  // data1 wiegand signal
 
 // PortB[0..7] weak pullups macro
 #define ENABLE_PULLUPS()      RBPU=0    // enable weak pullups on PortB
 #define DISABLE_PULLUPS()     RBPU=1    // disable weak pullups on PortB
 
 #define TX_SIZE 64               // RS485 TX data size
 byte TXbuffer[TX_SIZE];          // RS485 TX buffer
 byte TXin  = 0;                  // RS485 TX data IN index
 byte TXout = 0;                  // RS485 TX data OUT index
 
 int1 gltmr3f    = 0;
 int1 glprocessf = 0;
 int1 gldata0f   = 0;
 int1 gldata1f   = 0;
 
 unsigned int8  siteCode    = 0;
 unsigned int16 idCode      = 0;
 unsigned int32 wiegandData = 0;
 
 #int_ext    // Data0 external interrupt
 void data0_isr()
 {
 if (!gldata0f)
 wiegandData <<= 1;
 
 if (!gltmr3f){
 set_timer3(30536);
 clear_interrupt(int_timer3);
 enable_interrupts(int_timer3);
 gltmr3f = 1;
 }
 }
 
 #int_ext1   // Data1 external interrupt
 void data1_isr()
 {
 if (!gldata1f){
 wiegandData <<= 1;
 wiegandData |= 1;
 }
 
 if (!gltmr3f){
 set_timer3(30536);
 clear_interrupt(int_timer3);
 enable_interrupts(int_timer3);
 gltmr3f = 1;
 }
 }
 
 #int_timer3 // 3mSec. timeout
 void timer3_isr()
 {
 disable_interrupts(int_timer3);
 glprocessf = 1;
 gldata0f = 1;
 gldata1f = 1;
 }
 
 #int_tbe
 void Serial_TX_isr()
 {
 putc(TXbuffer[TXout]);           // put char to TXbuffer then send
 TXout=(TXout+1) % TX_SIZE;       // increment & limit to max buffer size
 if(TXin==TXout)                  // if last in data, stop RS485 TX interrupt
 disable_interrupts(int_tbe);   // disable transmit interrupt
 }
 
 void bputc(char c)                  // bufferred putc routine
 {
 short restart;                   // restart flag
 int ni;                          // temp variable
 
 restart=TXin==TXout;             // set restart flag at start
 TXbuffer[TXin]=c;                // store char to TXbuffer
 ni=(TXin+1) % TX_SIZE;           // limit to max buffer size
 while(ni==TXout);
 TXin=ni;
 if(restart)                      // enable TX interrupt
 enable_interrupts(int_tbe);
 }
 
 
 | 
 
 I got a problem of posting the entire code. I'll post it on a separate reply for the example on how I use it.
 
 --
 |  | 
	
		|  | 
	
		| chingB 
 
 
 Joined: 29 Dec 2003
 Posts: 81
 
 
 
			    
 
 | 
			
				| Re: Wiegand to Serial Driver |  
				|  Posted: Sun Aug 13, 2006 2:40 am |   |  
				| 
 |  
				|  	  | Newbaby wrote: |  	  | Hi ChingB, 
 Could you put an example code to show how to use your driver please
 | 
 
 
  	  | Code: |  	  | int1 check_Parity(unsigned int8 index,unsigned int32 wgCode)
 {
 int1 pResult   =0;
 unsigned int8 i=0;
 
 for (i=index; i<(index+13); i++)
 pResult ^= bit_test(wgCode,i);
 
 return(pResult);
 }
 | 
 |  | 
	
		|  | 
	
		| chingB 
 
 
 Joined: 29 Dec 2003
 Posts: 81
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Aug 13, 2006 2:42 am |   |  
				| 
 |  
				| Below is the listing for the Main Program 
 
  	  | Code: |  	  | void init_mcu() // MCU Initialization Routine
 {
 delay_ms(4000); // delay for 4 seconds (stabilized MCU?)
 
 // B0 & B1 are conficured as input
 // the reset of PortB I/O are set to output
 set_tris_b(0x03); // set PortB I/O directions
 ENABLE_PULLUPS(); // enable weak pullups for PortB[0..7]
 
 INTEDG0 = 0;      // set to falling edge (External-0 Interrupt)
 INT0IF  = 0;      // clear ext0 interrupt flag
 INTEDG1 = 0;      // set to falling edge (External-2 Interrupt)
 INT1IF  = 0;      // clear ext2 interrupt flag
 TMR3IF  = 0;   // clear timer3 Interrupt flag
 
 setup_adc_ports(NO_ANALOGS); // setup PortA to digital I/O
 
 setup_timer_3(T3_INTERNAL | T3_DIV_BY_8); // 104.8576mSec. timer overflow
 
 enable_interrupts(int_ext);
 enable_interrupts(int_ext1);
 enable_interrupts(global);   // enable global interrupt
 }
 
 //------------------
 // Main Program
 //------------------
 main()
 {
 init_mcu();                 // initialize MCU
 
 
 while (TRUE)
 {
 if (glprocessf)
 {
 glprocessf = 0;
 //printf("\r\nWiegand Data = %LX\r\n",wiegandData);
 if (check_Parity(0,wiegandData) == 1)        // odd parity
 {
 if (check_Parity(13,wiegandData) == 0){   // even parity
 idCode = wiegandData & 0xFFFF;
 siteCode = (wiegandData>>16) & 0xFF;
 printf(bputc,"\r\nSite Code = %U ** ID Code = %LU \r\n",siteCode,idCode);
 wiegandData = 0;
 }
 }
 gldata0f = 0;
 gldata1f = 0;
 gltmr3f = 0;
 }
 }
 }
 | 
 
 =P
 |  | 
	
		|  | 
	
		| jrgob 
 
 
 Joined: 21 Jan 2010
 Posts: 10
 Location: Brazil
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri Jul 01, 2011 8:36 am |   |  
				| 
 |  
				| Hello ChingB... 
 I understand your software, the data is received for connverter wiegand protocol for serial ...
 
 I have some questions:
 
 1) It is a generic code, suitable for any pic?
 2) The protocol format is receiving wiegand 26? or receive any wiegand format?
 
 I need to make a protocol wiegand converter for RS232  ... I know if you can help me.
 _________________
 Thanks.
 
 jrgob
 |  | 
	
		|  | 
	
		| cllunlu 
 
 
 Joined: 30 Jun 2014
 Posts: 4
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Jun 30, 2014 1:59 am |   |  
				| 
 |  
				| I have project that reading data with wiegand 26 protocol. I am using PIC18F46K22 and CCS C. Compiler version 5.0.13. 
 I have used this code. But I failed. I wanna ask, why we use timer? Using external interrupt for Data0 and Data1 is not enough?
 
 Can you please help about it?
 
 Thanks
 |  | 
	
		|  | 
	
		|  |