Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Why I am getting Logic Contentions detected at Tx pin of 8051

Status
Not open for further replies.
Joined
Jul 25, 2012
Messages
1,192
Helped
171
Reputation
342
Reaction score
162
Trophy points
1,343
Activity points
0
Why I am getting "Logic Contention detected on Tx Pin of Virtual Terminal and RxD pin of 8051" in Proteus?
 

Attachments

  • lcd.rar
    50.5 KB · Views: 95
Last edited:

Could you have misconfigured the P3.0/RXD pin in the code?
Usually, logic connection errors happen when pins are configured some way but they're used the opposite (for example, output used as input - and vice-versa).
 

I have attached the code. lcd.c is in lcd.rar. Please check it. There is no setting to make port i/p or o/p in 8051. I have not done any settings.

Here is the code

Code:
#include<reg51.h>

//Function declarations
void cct_init(void);
void delay(int);
void lcdinit(void);
void writecmd(int);
void writedata(char);
void ReturnHome(void);
void display();
void display2();

//*******************
//Pin description
/*
P2.4 to P2.7 is data bus
P1.0 is RS
P1.1 is E
*/
//********************

// Defines Pins
sbit RS = P1^0;
sbit E  = P1^1;

unsigned char card_id[12];
unsigned char tag[12] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2', '3' };
unsigned char read_id[12];
unsigned char current_byte = 0;


void recieve() interrupt 4     //Function to recieve data serialy from RS232 
{
        card_id[current_byte]=SBUF;
        RI=0;                // Reset the serial interrupt after recieving the byte
        current_byte++;    
}

// ***********************************************************
// Main program
//
void main(void)
{
	 cct_init();                                     //Make all ports zero
   
	 TMOD=0x20;                            //Enable Timer 1
   TH1=0XFD;
   SCON=0x50;
   TR1=1;
   EA=1;
   ES=1;
	 
	 lcdinit();                                      //Initilize LCD
	 
   writedata('U');                                 //write
   writedata('n');                                 //write
   writedata('i');                                 //write
   writedata('q');                                 //write
   writedata('u');                                 //write
   writedata('e');                                 //write
   writedata(' ');                                 //write
   writedata('C');                                 //write
   writedata('a');                                 //write
   writedata('r');                                 //write
   writedata('d');                                 //write
   writedata(' ');                                 //write
	 writedata('I');                                 //write
   writedata('d'); 

   ReturnHome();                                   //Return to 0 position
			
	while(1)
	{
		while(current_byte!=12);
		display();
		delay(50000);
		if(tag == read_id) {
			  display2();
		}	
				
	}

}


void display()        // Function to display the unique id
{
    unsigned char count;
    writecmd(0xC1);        //Place cursor to second position of second line
    for(count=0;count<12;count++)
     { 		
				          writedata(card_id[count] + 48);
									read_id[count] = card_id[count] + 48;
		 }
    current_byte=0;
}


void display2()        // Function to display the unique id
{
    unsigned char count;
    writecmd(0xC1);        //Place cursor to second position of second line
    for(count=0;count<12;count++)
     { 		
				          writedata(tag[count]);
		 }
}



void cct_init(void)
{
P0 = 0x00;   //not used 
P1 = 0x00;   //not used 
P2 = 0x00;   //used as data port
P3 = 0x00;   //used for generating E and RS
}

void delay(int a)
{
   int i;
   for(i=0;i<a;i++);   //null statement
}

void writedata(char t)
{
   RS = 1;             // This is data

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (t&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((t<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}


void writecmd(int z)
{
   RS = 0;             // This is command

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (z&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((z<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}

void lcdinit(void)
{
  ///////////// Reset process from datasheet /////////
     delay(15000);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(4500);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(300);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(650);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x20&0xF0);    // Write 0x2
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

	 delay(650);

  /////////////////////////////////////////////////////
   writecmd(0x28);    //function set
   writecmd(0x0c);    //display on,cursor off,blink off
   writecmd(0x01);    //clear display
   writecmd(0x06);    //entry mode, set increment
}

void ReturnHome(void)     //Return to 0 location
{
  writecmd(0x02);
    delay(1500);
}


If I use a 10k pullup on RxD line of 8051 and send 123456789123 from Virtual terminal, I am getting abcdefghiabc on LCD.
 
Last edited:

I've looked at your code and actually there's nothing out of place. Probably is an ISIS bug determining I/O pins, or whatever. I wouldn't really bother about it unless it stops the circuit from working correctly. As you made the circuit in zip I'm able to transmit 12 chars from terminal to the PIC, although, the data displayed on the display is not the one I write on the VT; I mostly get 123456789123 even if I type anything else. Go on with the development, if issues occur then you should really bother about this problem ;)

Actually, just one thing worries me a bit. You say you're using the an 8051 PIC while in ISIS you're using an 8951. Are you sure these are compatible?
 

Actually I am using AT89C51 and I got it working. Thanks for replying. The problem was I had set P3 to 0x00; I set P3.0 and P3.1 to 1 and it worked.
here is the link https://www.edaboard.com/threads/272369/

Check the simulation. you have to type 123456789123 then LCD displays "Card Accepted" and UART displays "AAT89C51A"

Yes, you were right T3STY. There was a major bug in the code. It was displaying the card read id and it was accepting any card. Now I have fixed the problem.

here is the link https://www.edaboard.com/threads/272369/#post1167572
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top