EDITED March 4th 2006: additional info furtheron in this thread; please check it out; there are necessary modifications to the schematics
EDITED May 11th 2006: An abstract of this topic has been placed in the Tutorial Section: [url]" target="_blank">http://www.avrfreaks.net/index.p...
Solutions to problems with STK200/300-programming dongles and alikes.
This time not a Question, just Answers
In the past there have been quite some articles about programming-problems with these dongles and other dongles with a simular design. I am talking about the AVR-programmers with a 74HC244 buffer, on the printer- (or parallel) port of the PC.
Two types of problems:
1 from: "does not recognize chip", ID="some rubbish",
to: it does not work, pls help ....
2 from: It damaged the printerport on my PC
to: it works on one printerport but not on an another
Good suggestions so far:
- Increase the programming-delay
- In BIOS: set printerport to EPP or ECP
- Use a shielded printercable
and other suggestions:
- Buy yourself a better programmer ... it is unreliable
- and some confusing suggestions ... that really do not help.
A few months ago, I purchased a STK200 with Kanda (UK). The board came with this programming dongle and it worked fine. Until the parallel port on the motherboard of my PC was damaged by the dongle.... Luckily I could fall back on a PCI-card which gave me another parallel port. But I was worried ..., and not pleased ...
For a new project with two Atmel uC's, I needed a second programmer. So I built one. The famous design with the 74HC244. And to suit my needs, I made it with another type of connector for the target-board. IT DID NOT WORK ! Why? Did I make a mistake? No, I did not ...
In order to program the new targetboard (with the new connector), I made an adapter for the existing and working STK200-programming dongle. And with the new connector it DID NOT WORK EITHER !! Can a connector make the difference?
I was confused .... for a moment. I started searching on the Forums and discovered that I was not the only one ... But suggestions for a solution did not do the trick so far ... I do use a shielded cable, the BIOS-settings are OK, I increased the programming-dalay, etc
I decided to sort this out. And dig it out, .... to the bottom !
To start: I like the design with the HC244. It looks good. Well done, designer! The 74HC244 buffers the signals between PC and targetboard, and isolates the two when the programming is done.
Many people use this interface as it is cheap and easy to build. And is comfortable to use in combination with Bascom AVR.
Note: although some Forum-members claim that it is not supported in AVR-Studio-4 (the beautiful programming-environment from Atmel): sorry guys, that is not true! Kanda supplies a plug-in for AVR-Studio with the STK200 and it works fine! And comfortable.
Back to business:
Q. What makes this dongle unreliable?
A. LONG LINES, my friends!
Fourier, La Place, thank you for the insight. And thanks to my teachers! Although that's some time ago ...
The combination of short rise- and falltimes (high slewrate) on the signals and the (relative) long lines for these frequency-domains (using Fourier and La Place), that is what's making these dongles unreliable.
What I did:
I hooked up an oscilloscope to the SCK-line on the targetboard and it was obvious: RINGING, i.e. oscillations right after a fast transition of the SCK-line.
Q. What happens during programming in the original design?
A. The uC on the targetboard looses synchronization with the programmer. It sees more than one SCK-edge due to the ringing. And that's what I read some time before ... an Application Note from Atmel. AHA. Now things fall in place. The puzzle is complete, and the picture well visible.
I needed to get rid of the high-frequency-components generated by the edges. The trick: a small RC-filter of 0.1 us, made up with a resistor of 1 Kohm and 100 pF capacitor. That's all it takes: one small filter in the SCK-line. I built it into the STK200-dongle and ran some tests: problem solved. No longer dependant of connector/cable.
Built it into the second programming-dongle: works.
Hooked them up to another PC: works.
Let's go to the second problem:
Q. Why did the dongle blow the printerport on the motherboard?
A. I was not carefull enough.
Some explanation is needed here. The dongle is connected to targetboard and PC. Suppose both are powered down. When the targetboard is switched on, and the PC is not, the dongle will force current into the printerport's /Ack-line.
Q. Can that do any harm?
To understand this, some historical facts about the printerport.
In the original IBM-design, the printerport was made up with a 74LS374 and a 74LS244. To blow that port you really needed to use brute-force. Hook it up to 24 VDC f.i. ;-) It was a very rugged design.
Nowadays, the printerport on a motherboard is built-in an ASIC, which has far more functions, but is not as rugged as the original design. The 74HC244 in the dongle can supply 25 mA (guaranteed) on an output-pin, and I am afraid that was too much for the ASIC. The good news is that the rest of the printerport still works OK. But it can no longer be used for this dongle.
So: limit the current in the /Ack-line by inserting a 1 kOhm resistor. The other lines are all inputs on the 74HC244 and therefor , basically, need no limiters. However, I do think it's better to insert current-limiters there as well. Why?
Of course we all know that the parallel port and RS232-port are not hot-pluggable .... ;-) , but most of the time I treat them as such. I know, ... bad habbit.
By taking some extra measures, the dongle can be made such, that it will not do any harm to plug it in while the PC and/or the target-board are powered.
Q. Is it necessary to add the filter to MISO and MOSI as well?
A. No. The data on these lines are set-up before the SCK-edge occurs. So even if there is ringing on these lines (and there is !!), it has no effect on the transmission. But: it's a good idea to filter these lines as well.
Q. Is this the ultimate solution?
A. Depends how you look at it. Adding a filter (an analog circuit) to a digital clock-line is something I preferably do not do, .... usually.
But in this case it's the best I could think of, ... in getting a simple solution.
The good thing is that it is not acting as a delay for the clock-pulse: that's a designer's nightmare. All it does is reducing the slewrate of the clock-signal. The best solution .... I'll give it some thought
Q. Could this apply to other programmers as well?
A. I think it does.
- Looking at the design of f.i. the AVR-ISP: the 90S1200 connects to the targetboard with no slewrate limiters at all. And if the cable between programmer and target is short, that will work fine. But Atmel's uC's are PDQ-things and have very short rise- and fall-times on their I/O-pins. So if you're using a longer cable, the same problem might occur.
- Looking at the serial programmer (SI-PROG) from PonyProg: here the problem will NOT occur as in the RS232-specification provisions were made for slewrate-limiting. Clever guys at that time, huh?
- The programmer ZL2PRG on the MCS-site: it looks like it is lacking this filter as well.
Quite some text huh?
As attachments you'll find an ImprovedVersion and an EvenBetter version, in case you're gonna build a new one.
I hope this solves many problems ... in my case it did. Have fun and happy computing .... eh, programming.