Open-collector

Hello,

I read a web page about ps/2 mouse and keyboard protocol [1] with the intention of doing a few experiments with my arduino board. I've found some code for arduino that implements a mouser driver and I could understand most of that web page. However, I didn't quite get the very first picture presented there [2] and what seems to be quite trivial component of electronics: open-collectors. I read a little more about it in the book ``Contemporary Logic Design'', but things still aren't all that clear.

``When the keyboard or mouse wants to send information, it first checks the Clock line to make sure it's at a high logic level.'' [1]. I think those resistors at the top have something to do with not allowing a short-circuit when C or D are on, but other than that there was little that I understood about open-collectors and pull-up resistors. Looking at [2], if C is on, then what happens? The wire A will be HIGH? What if C is off? Then it will depend on what A is set on the microcontroler? Doesn't the connection of A with 5V mean that it will always be set to high? How can the host set that wire to high (or low)? How can the keyboard or mouse check if the host set clock to high?

For what I understood the code from arduino that makes the clock line to go high is: pinMode(CLOCK_PIN, INPUT); digitalWrite(CLOCK_PIN, HIGH); A similar piece of code is described by arduino's manual like this: ``Often it is useful to steer an input pin to a known state if no input is present. This can be done by adding a pullup resistor (to +5V), or pulldown resistor (resistor to ground) on the input, with 10K being a common value. There are also convenient 20K pullup resistors built into the Atmega chip that can be accessed from software. These built-in pullup resistors are accessed in the [above] manner.''

So setting clock to high seems to mean that you connect it to a 5V passing through a 20 ohms resistor. Why couldn't I just set pinMode(CLOCK_PIN, OUTPUT); and then digitalWire(CLOCK_PIN, HIGH); and allow the full 5V to go through without any resistors?

Thank you for your time, Rafael

[1]
formatting link
[2]
formatting link
[3]
formatting link
Reply to
Rafael Cunha de Almeida
Loading thread data ...

I'm only just now reading about Arduino. Interesting.

It's not too hard to understand. I'll get to that, soon.

This is to make sure some other device isn't holding it actively low. (I'll explain 'actively' in a moment.)

Well, there is that. However, that's not the best way to understand the resistor's function.

In the circuit shown in your second web link, each transistor represents a switch. What is missing from that schematic and what may be confusing you a little is that they didn't include any other transistors sharing the same party line. For example, while C controls a transistor whose collector is hooked up to B, they don't show any other transistor collectors also hooked up to B as well. But they should to get the point across -- which is that doing it this way allows more than one such switch to be hooked up to the same, shared line. In this diagram, sadly, there is only one output that shares the line. So it looks almost like a waste. But if there were more, then it would start to make sense.

So now let's make this more interesting. Looking at the picture, assume there are some more microcontrollers with the same schematic but where all the Data and Clock lines are directly connected without anything intervening. Just wired together, all sharing the same two lines. Let's call these microcontrollers Q, R, S, and T.

Also, for discussion let's say that "active" means a transistor is ON and "inactive" means that transistor is OFF.

Note that things have gotten more interesting. What happens if Q.C, R.C, and S.C are inactive but T.C is active? What value would be seen by Q, R, S, or T when reading Q.B, R.B, S.B, or T.B? What if all of Q.C, R.C, S.C, and T.C were inactive? What is seen reading Q.B, then?

Now chance the context and imagine you have a phone line that is also shared by five other homes down the road. (This is why 'open-collector' exists, to allow more than one talker on a shared line -- not only listeners.) How would you handle using the line? What rules would you work out with your neighbors so that you'd all be able to get along okay sharing this phone line?

For one, you'd probably first just lift the handset up and listen before talking. If you don't hear someone else talking already, you'd then assume you could use the line and dial out. You'd also want the other homes to apply the same rules, as well. So that before they start dialing or talking on the phone, they also first listen to make sure you aren't already using it before them. Same thing, here.

Getting back to Q, R, S, and T all sharing the same "party line" of (clock, data): How would you set up rules so that they could all share this party line well?

I'll stop there. See if that helps (or makes things worse.)

Jon

Reply to
Jon Kirwan

the zig-zag in the wire to 5v represents a resistor in the circuit shown it performs as a very poor conductor such that the transisto below it (or another connected between "data" and ground) can be turned on to change the voltage on the data wire and pin a to something close to 0V

this makes the AVR microcontroller on the arduino board not try to force the voltage on that pin

in input mode this enables an internal resistor between the +5V supply and the clock pin

the image in the URL omits the resistors that are often needed in series with the connection from C&D to the transistors.

With the arduino (and other similar microcontrollers) you can fake open-collector by putting the IO pins into "input mode" when you want the open-collector off and into output mode with a 0 value when you want it on, this means you can use the other pins for something else.

Reply to
Jasen Betts

An open-collector output is one which behaves like a switch connecting the output pin to ground. If the switch is closed, the pin is pulled low; if the switch is open, the pin isn't connected to anything (within the chip).

The advantage of an open-collector output is that you can connect several outputs to the same line, with a pull-up resistor connecting the line to the positive supply. If one or more of the outputs are low, the line will be pulled low; if none of the outputs are low, the line will be pulled high by the pull-up resistor.

In the PS/2 mouse and keyboard interface, this allows each line to be bidirectional. I.e. either the device controls the state of the line and the host reads the state, or vice-versa.

If totem-pole outputs were used (where the line is pulled either high or low), and the host and device both tried to control the line simulatneously, you could have a short-circuit if one pulls the line high and the other pulls it low.

Reply to
Nobody

TO add to that, keep in mind that NPN and PNP exist for open collectors.

being a NPN, it would be low when ON, how ever, if it's a NOT output, it is a PNP and you'll get what ever the Vcc/(+) Line rail voltage is minus some losses.

In both cases how ever, the output is in HI-Z when off.

Reply to
Jamie

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.