Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 81 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
81
Dung lượng
3,17 MB
Nội dung
Beginners Introduction to the Assembly Language of ATMEL-AVR-Microprocessors by Gerhard Schmidt http://www.avr-asm-tutorial.net February 2011 History: Added page on assembler concept in February 2011 Added chapter on code structures in April 2009 Additional corrections and updates as of January 2008 Corrected version as of July 2006 Original version as of December 2003 Avr-Asm-Tutorial http://www.avr-asm-tutorial.net Content Why learning Assembler? The concept behind the language assembler in micro-controllers .2 2.1 The hardware of micro-controllers .2 2.2 How the CPU works .2 2.3 Instructions in assembler 2.4 Difference to high-level languages .3 2.5 Assembler is not machine language .3 2.6 Interpreting and assembler 2.7 High level languages and Assembler 2.8 What is really easier in assembler? Hardware for AVR-Assembler-Programming .6 3.1 The ISP Interface of the AVR processor family 3.2 Programmer for the PC-Parallel-Port 3.3 Experimental boards .7 3.3.1 Experimental board with an ATtiny13 3.3.2 Experimental board with an AT90S2313/ATmega2313 3.4 Ready-to-use commercial programming boards for the AVR-family 3.4.1 STK200 3.4.2 STK500 3.4.3 AVR Dragon .10 Tools for AVR assembly programming .11 4.1 The editor 11 4.1.1 A simple typewriter 11 4.1.2 Structuring assembler code 12 4.2 The assembler .15 4.3 Programming the chips .16 4.4 Simulation in the studio 16 What is a register? 21 5.1 Different registers .22 5.2 Pointer-registers 22 5.2.1 Accessing memory locations with pointers 22 5.2.2 Reading program flash memory with the Z pointer 22 5.2.3 Tables in the program flash memory 23 5.2.4 Accessing registers with pointers .23 5.3 Recommendation for the use of registers 24 Ports 25 6.1 What is a Port? 25 6.2 Write access to ports 25 6.3 Read access to ports 26 6.4 Read-Modify-Write access to ports 26 6.5 Memory mapped port access 26 6.6 Details of relevant ports in the AVR 26 6.7 The status register as the most used port 27 6.8 Port details 28 SRAM 29 7.1 What is SRAM? 29 7.2 For what purposes can I use SRAM? 29 7.3 How to use SRAM? 29 7.3.1 Direct addressing 29 7.3.2 Pointer addressing .30 7.3.3 Pointer with offset .30 7.4 Use of SRAM as stack 30 7.4.1 Defining SRAM as stack 30 7.4.2 Use of the stack 31 7.4.3 Common bugs with the stack operation 31 Jumping and branching 33 8.1 Controlling sequential execution of the program .33 8.2 Linear program execution and branches .34 8.3 Timing during program execution 35 8.4 Macros and program execution 35 8.5 Subroutines 35 Avr-Asm-Tutorial http://www.avr-asm-tutorial.net 8.6 Interrupts and program execution .37 Calculations 39 9.1 Number systems in assembler 39 9.1.1 Positive whole numbers (bytes, words, etc.) 39 9.1.2 Signed numbers (integers) 39 9.1.3 Binary Coded Digits, BCD 39 9.1.4 Packed BCDs 40 9.1.5 Numbers in ASCII-format 40 9.2 Bit manipulations .40 9.3 Shift and rotate 41 9.4 Adding, subtracting and comparing 42 9.4.1 Adding and subtracting 16-bit numbers 42 9.4.2 Comparing 16-bit numbers 42 9.4.3 Comparing with constants 42 9.4.4 Packed BCD math .43 9.5 Format conversion for numbers 43 9.5.1 Conversion of packed BCDs to BCDs, ASCII or Binaries 43 9.5.2 Conversion of Binaries to BCD 44 9.6 Multiplication .44 9.6.1 Decimal multiplication .44 9.6.2 Binary multiplication 44 9.6.3 AVR assembler program 45 9.6.4 Binary rotation 46 9.6.5 Multiplication in the studio 46 9.7 Hardware multiplication .48 9.7.1 Hardware multiplication of 8-by-8-bit binaries 48 9.7.2 Hardware multiplication of a 16- by an 8-bit-binary 49 9.7.3 Hardware multiplication of a 16- by a 16-bit-binary 50 9.7.4 Hardware multiplication of a 16- by a 24-bit-binary 52 9.8 Division 53 9.8.1 Decimal division 53 9.8.2 Binary division 54 9.8.3 Program steps during division 54 9.8.4 Division in the simulator 55 9.9 Number conversion 56 9.10 Decimal Fractions .57 9.10.1 Linear conversions 57 9.10.2 Example 1: 8-bit-AD-converter with fixed decimal output 58 9.10.3 Example 2: 10-bit-AD-converter with fixed decimal output 59 10 Project planning .60 10.1 How to plan an AVR project in assembler .60 10.2 Hardware considerations 60 10.3 Considerations on interrupt operation 60 10.3.1 Basic requirements of interrupt-driven operation .61 10.3.2 Example for an interrupt-driven assembler program 61 10.4 Considerations on timing 63 11 Annex .64 11.1 Instructions sorted by function 64 11.2 Directives and Instruction lists in alphabetic order 66 11.2.1 Assembler directives in alphabetic order 66 11.2.2 Instructions in alphabetic order 67 11.3 Port details 69 11.3.1 Status-Register, Accumulator flags 69 11.3.2 Stackpointer 69 11.3.3 SRAM and External Interrupt control 69 11.3.4 External Interrupt Control 70 11.3.5 Timer Interrupt Control 70 11.3.6 Timer/Counter 71 11.3.7 Timer/Counter 72 11.3.8 Watchdog-Timer .73 11.3.9 EEPROM 73 11.3.10 Serial Peripheral Interface SPI 74 11.3.11 UART .75 Avr-Asm-Tutorial http://www.avr-asm-tutorial.net 11.3.12 Analog Comparator 75 11.3.13 I/O Ports 76 11.4 Ports, alphabetic order 76 11.5 List of abbreviations 77 Avr-Asm-Tutorial http://www.avr-asm-tutorial.net Why learning Assembler? Assembler or other languages, that is the question Why should I learn another language, if I already learned other programming languages? The best argument: while you live in France you are able to get through by speaking English, but you will never feel at home then, and life remains complicated You can get through with this, but it is rather inappropriate If things need a hurry, you should use the country's language Many people that are deeper into programming AVRs and use higher-level languages in their daily work recommend that beginners start with learning assembly language The reason is that sometimes, namely in the following cases: ● if bugs have to be analyzed, ● if the program executes different than designed and expected, ● if the higher-level language doesn't support the use of certain hardware features, ● if time-critical in line routines require assembly language portions, it is necessary to understand assembly language, e g to understand what the higher-level language compiler produced Without understanding assembly language you not have a chance to proceed further in these cases Short and easy Assembler instructions translate one by one to executed machine instructions The processor needs only to execute what you want it to and what is necessary to perform the task No extra loops and unnecessary features blow up the generated code If your program storage is short and limited and you have to optimize your program to fit into memory, assembler is choice Shorter programs are easier to debug, every step makes sense Fast and quick Because only necessary code steps are executed, assembly programs are as fast as possible The duration of every step is known Time critical applications, like time measurements without a hardware timer, that should perform excellent, must be written in assembler If you have more time and don't mind if your chip remains 99% in a wait state type of operation, you can choose any language you want Assembler is easy to learn It is not true that assembly language is more complicated or not as easy to understand than other languages Learning assembly language for whatever hardware type brings you to understand the basic concepts of any other assembly language dialects Adding other dialects later is easy As some features are hardware-dependent optimal code requires some familiarity with the hardware concept and the dialect What makes assembler sometimes look complicated is that it requires an understanding of the controller's hardware functions Consider this an advantage: by learning assembly language you simultaneously learn more about the hardware Higher level languages often not allow you to use special hardware features and so hide these functions The first assembly code does not look very attractive, with every 100 additional lines programmed it looks better Perfect programs require some thousand lines of code of exercise, and optimization requires lots of work The first steps are hard in any language After some weeks of programming you will laugh if you go through your first code Some assembler instructions need some months of experience AVRs are ideal for learning assembler Assembler programs are a little bit silly: the chip executes anything you tell it to do, and does not ask you if you are sure overwriting this and that All protection features must be programmed by you, the chip does exactly anything like it is told, even if it doesn't make any sense No window warns you, unless you programmed it before To correct typing errors is as easy or complicated as in any other language Basic design errors, the more tricky type of errors, are also as complicated to debug like in any other computer language But: testing programs on ATMEL chips is very easy If it does not what you expect it to do, you can easily add some diagnostic lines to the code, reprogram the chip and test it Bye, bye to you EPROM programmers, to the UV lamps used to erase your test program, to you pins that don't fit into the socket after having them removed some dozen times Changes are now programmed fast, compiled in no time, and either simulated in the studio or checked in-circuit No pin is removed, and no UV lamp gives up just in the moment when you had your excellent idea about that bug Test it! Be patient doing your first steps! If you are familiar with another (high-level) language: forget it for the first time Behind every assembler language there is a certain hardware concept Most of the special features of other computer languages don't make any sense in assembler The first five instructions are not easy to learn, after that your learning speed rises fast After you had your first lines: grab the instruction set list and lay back in the bathtub, wondering what all the other instructions are like Serious warning: Don't try to program a mega-machine to start with This does not make sense in any computer language, and just produces frustration Start with the small „Hello world“-like examples, e g turning some LEDs on and off for a certain time, then explore the hardware features a bit deeper Recommendation: Comment your subroutines and store them in a special directory, if debugged: you will need them again in a short time Have success! Avr-Asm-Tutorial http://www.avr-asm-tutorial.net The concept behind the language assembler in micro-controllers Attention! These pages are on programming micro-controllers, not on PCs with Linux- or Windows operating systems and similar elephants, but on a small mice It is not on programming Ethernet mega-machines, but on the question why a beginner should start with assembler and not with a complex high-level language This page shows the concept behind assembler, what those familiar with high-level languages have to give up to learn assembler and why assembler is not machine language 2.1 The hardware of micro-controllers What has the hardware to with assembler? Much, as can be seen from the following The concept behind assembler is to make the hardware resources of the processor accessible Resources means all hardware components, like * the central processing unit (CPU) and its math servant, the arithmetic and logic unit (ALU), * the diverse storage units (internal and external RAM, EEPROM storage), * the ports that control characteristics of port-bits, timers, AD converters, and other devices Accessible means directly accessible and not via drivers or other interfaces, that an operating system provides That means, you control the serial interface or the AD converter, not some other layer between you and the hardware As award for your efforts, the complete hardware is at your command, not only the part that the compiler designer and the operating system programmer provides for you 2.2 How the CPU works Most important for understanding assembler is to understand how the CPU works The CPU reads instructions (instruction fetch) from the program storage (the flash), translates those into executable steps and executes those In AVRs, those instructions are written as 16 bit numbers to the flash storage, and are read from there (first step) The number read then translates (second step) e g to transporting the content of the two registers R0 and R1 to the ALU (third step), to add those (fourth step) and to write the result into the register R0 (fifth step) Registers are simple bit wide storages that can directly be tied to the ALU to be read from and to be written to The coding of instructions is demonstrated by some examples CPU operation Code (binary) Code (hex) Send CPU to sleep 1001.0101.1000.1000 9588 Add register R1 to register R0 0000.1100.0000.0001 0C01 Subtract register R1 from register R0 0001.1000.0000.0001 1801 Write constant 170 to register R16 1110.1010.0000.1010 EA0A Multiply register R3 with register R2 and write the result to registers R1 (MSB) and 1001.1100.0011.0010 R0 (LSB) 9C32 So, if the CPU reads hex 9588 from the flash storage, it stops its operation and does not fetch instructions any more Don't be afraid, there is another mechanism necessary before the CPU executes this And you can wake up the CPU from that Executing instructions If the CPU reads hex 0C01, R0 and R1 is added and the result is written to register R0 This is executed like demonstrated in the picture First the instruction word (16 bit) is read from the flash and translated to executable steps (1) adds their content (2) Next, the result is written to the register (3) The next step connects the registers to the ALU inputs, and Avr-Asm-Tutorial http://www.avr-asm-tutorial.net If the CPU reads hex 9C23 from the flash, the registers R3 and R2 are muliplied and the result is written to R1 (upper bits) and R0 (lower bits) If the ALU is not equipped with hardware for multiplication (e g in an ATtiny13), the 9C23 does nothing at all It doesn't even open an error window (the tiny13 doesn't have that hardware)! In principle the CPU can execute 65,536 (16-bit) different instructions But because not only 170 should be written to a specific register, but values between and 255 to any register between R16 and R31, this load instruction requires 256*16 = 4,096 of the 65,536 theoretically possible instructions The direct load instruction for the constant c (c7 c0) and registers r (r3 r0, r4 is always and not encoded) is coded like this: Bit 15 14 13 12 11 10 LDI R,C 1 c7 c6 c5 c4 r3 r2 r1 r0 c3 c2 c1 c0 Why those bits are placed like this in the instruction word remains ATMEL's secret Addition and subtraction require 32*32 = 1,024 combinations and the target registers R0 R31 (t4 t0) and source registers R0 R31 (s4 s0) are coded like this: Bit 15 14 13 12 11 10 ADD Rt,Rs 0 0 1 s4 t4 t3 t2 t1 t0 s3 s2 s1 S0 SUB Rt,Rs 0 1 s4 t4 t3 t2 t1 t0 s3 s2 s1 s0 Please, not learn these bit placements, you will not need them later Just understand how an instruction word is coded and executed 2.3 Instructions in assembler There is no need to learn 16-bit numbers and the crazy placement of bits within those, because in assembler you'll use human-readable abbreviations for that, so-called mnemonics, an aid to memory The assembler representation for hex 9588 is simply the abbreviation "SLEEP" In contrast to 9588, SLEEP is easy to remember Even for someone like me that has difficulties in remembering its own phone number Adding simply is "ADD" For naming the two registers, that are to be added, they are written as parameters (No, not in brackets C programmers, forget those brackets You don't need those in assembler.) Simply type "ADD R0,R1" The line translates to a single 16 bit word, 0C01 The translation is done by the assembler The CPU only understands 0C01 The assembler translates the line to this 16 bit word, which is written to the flash storage, read from the CPU from there and executed Each instruction that the CPU understands has such a mnemonic And vice versa: each mnemonic has exactly one corresponding CPU instruction with a certain course of actions The ability of the CPU determines the extent of instructions that are available in assembler The language of the CPU is the base, the mnemonics only represent the abilities of the CPU itself 2.4 Difference to high-level languages Here some hints for high-level programmers In high-level languages the constructions are not depending from the hardware or the abilities of a CPU Those constructions work on very different processors, if there is a compiler for that language and for the processor family available The compiler translates those language constructions to the processor's binary language A GOTO in Basic looks like a JMP in assembler, but there is a difference in the whole concept between those two A transfer of program code to another processor hardware does only work if the hardware is able to the same If a processor CPU doesn't have access to a 16 bit timer, the compiler for a high-level language has to simulate one, using an 8bit timer and some time-consuming code If three timers are available, and the compiler is written for only two or a single timer, the available hardware remains unused So you totally depend on the compiler's abilities, not on the CPU's abilities Another example with the above shown instruction "MUL" In assembler, the target processor determines if you can use this instruction or if you have to write a multiplication routine If, in a high-level language, you use a multiplication the compiler inserts a math library that multiplies every kind of numbers, even if you have only 8-by-8-bit numbers and MUL alone would it The lib offers an integer, a long-word and some other routines for multiplications that you don't need A whole package of things you don't really need So you run out of flash in a small tiny AVR, and you change to a mega with 35 unused port pins Or an xmega, just to get your elefant lib with superfluous routines into the flash That is what you get from a simple "*", without even being asked 2.5 Assembler is not machine language Because assembler is closer to the hardware than any other language, it is often called machine language This is not exact because the CPU only understands 16 bit instruction words in binary form The string "ADD R0,R1" cannot be executed And assembler is much simpler than machine language Similarities between machine language and assembler are a feature, not a bug Avr-Asm-Tutorial http://www.avr-asm-tutorial.net 2.6 Interpreting and assembler With an interpreter the CPU first translates the human-readable code into binary words that can be executed then The interpreter would * first read the text stream "A = A + B" (nine characters of one byte each), * strip the four blanks from the text, * locate the variables A and B (location in registers or in SRAM, precision/length, etc.), * identify the plus sign as operator, * prepare a machine executable sequence that is equivalent to the formulation in the text In the consequence, probably a simple machine code like "ADD R0,R1" (in Assembler) would result But most probably the resulting machine code would be multiple words long (read and write variables from/to SRAM, 16-bit-integer adding, register saving/restoring on stack, etc., etc.) The difference between the interpreter and the assembling is that, after assembling, the CPU gets its favored meal, executable words, directly When interpreting the CPU is, during most of the time, performing the translation task Translation probably requires 20 or 200 CPU steps, before the three or four words can be executed Execution speed so is more than lame While this is no problem if one uses a fast clock speed, it is inappropriate in time critical situations, where fast response to an event is required No one knows what the CPU is just doing and how long this requires Not having to think about timing issues leads to the inability of the human programmer to resolve timing issues, and missing information on timing keeps him unable to those things, if required 2.7 High level languages and Assembler High level languages insert additional nontransparent separation levels between the CPU and the source code An example for such an nontransparent concept are variables These variables are storages that can store a number, a text string or a single Boolean value In the source code, a variable name represents a place where the variable is located, and, by declaring variables, the type (numbers and their format, strings and their length, etc.) For learning assembler, just forget the high level language concept of variables Assembler only knows bits, bytes, registers and SRAM bytes The term "variable" has no meaning in assembler Also, related terms like "type" are useless and not make any sense here High level languages require you to declare variables prior to their first use in the source code, e g as Byte (8-bit), double word (16-bit), integer (15-bit plus sign bit) Compilers for that language place such declared variables somewhere in the available storage space, including the 32 registers If this placement is selected rather blind by the compiler or if there is some priority rule used, like the assembler programmer carefully does it, is depending more from the price of the compiler The programmer can only try to understand what the compiler "thought" when he placed the variable The power to decide has been given to the compiler That "relieves" the programmer from the trouble of that decision, but makes him a slave of the compiler The instruction "A = A + B" is now type-proofed: if A is defined as a character and B a number (e g = 2), the formulation isn't accepted because character codes cannot be added with numbers Programmers in high level languages believe that this type check prevents them from programming nonsense The protection, that the compiler provides in this case by prohibiting your type error, is rather useless: adding to the character "F" of course should yield a "H" as result, what else? Assembler allows you to that, but not a compiler Assembler allows you to add numbers like or 48 to add and subtract to every byte storage, no matter what type of thing is in the byte storage What is in that storage, is a matter of decision by the programmer, not by a compiler If an operation with that content makes sense is a matter of decision by the programmer, not by the compiler If four registers represent a 32-bit-value or four ASCII characters, if those four bytes are placed low-to-high, high-to-low or completely mixed, is just up to the programmer He is the master of placement, no one else Types are unknown, all consists of bits and bytes somewhere in the available storage place The programmer has the task of organizing, but also the chance of optimizing Of a similar effect are all the other rules, that the high level programmer is limited to It is always claimed that it is saver and of a better overview to program anything in subroutines, to not jump around in the code, to hand over variables as parameters, and to give back results from functions Forget most of those rules in assembler, they don't make much sense Good assembler programming requires some rules, too, but very different ones And, what's the best: most of them have to be created by yourself to help yourself So: welcome in the world of freedom to what you want, not what the compiler decides for you or what theoretical professors think would be good programming rules High level programmers are addicted to a number of concepts that stand in the way of learning assembler: separation in different access levels, in hardware, drivers and other interfaces In assembler this separation is complete nonsense, separation would urge you to numerous workarounds, if you want to solve your problem in an optimal way Because most of the high level programming rules don't make sense, and because even puristic high level programmers break their own rules, whenever appropriate, see those rules as a nice cage, preventing you from being creative Those questions don't play a role here Everything is direct access, every storage is available at any time, nothing prevents your access to hardware, anything can be changed - and even can be corrupted Responsibility remains by the programmer only, that has to use his brain to avoid conflicts when accessing hardware The other side of missing protection mechanisms is the freedom to everything at any time So, smash your ties away to start learning assembler You will develop your own ties later on to prevent yourself from running into errors Avr-Asm-Tutorial http://www.avr-asm-tutorial.net 2.8 What is really easier in assembler? All words and concepts that the assembler programmer needs is in the datasheet of the processor: the instruction and the port table Done! With the words found there anything can be constructed No other documents necessary How the timer is started (is writing "Timer.Start(8)" somehow easier to understand than "LDI R16,0x02” and “OUT TCCR0,R16"?), how the timer is restarted at zero ("CLR R16” and “OUT TCCR0,R16"), it is all in the data sheet No need to consult a more or less good documentation on how a compiler defines this or that No special, compiler-designed words and concepts to be learned here, all is in the datasheet If you want to use a certain timer in the processor for a certain purpose in a certain mode of the 15 different possible modes, nothing is in the way to access the timer, to stop and start it, etc What is in a high level language easier to write "A = A + B" instead of "MUL R16,R17"? Not much If A and B aren't defined as bytes or if the processor type is tiny and doesn't understand MUL, the simple MUL has to be exchanged with some other source code, as designed by the assembler programmer or copy/pasted and adapted to the needs No reason to import an nontransparent library instead, just because you're to lazy to start your brain and learn Assembler teaches you directly how the processor works Because no compiler takes over your tasks, you are completely the master of the processor The reward for doing this work, you are granted full access to everything If you want, you can program a baud-rate of 45.45 bps on the UART A speed setting that no Windows PC allows, because the operating system allows only multiples of 75 (Why? Because some historic mechanical teletype writers had those special mechanical gear boxes, allowing quick selection of either 75 or 300 bps.) If, in addition, you want and a half stop bytes instead of either or 2, why not programming your own serial device with assembler software No reason to give things up Who is able to program in assembler has a feeling for what the processor allows Who changes from assembler to a higher level language later on, e g in case of very complex tasks, has made the decision to select that on a rational basis If someone skips learning assembler he has to what he can, sticks to the available libraries and programs creative workarounds for things that the compiler doesn't allow, and in a way that assembler programmers would laugh at loud The whole world of the processor is at the assembler programmer's command, so why complicated and highly sensitive workarounds on something you can formulate in a nice, lean, esthetic way? Avr-Asm-Tutorial http://www.avr-asm-tutorial.net Hardware for AVR-AssemblerProgramming Learning assembler requires some simple hardware equipment to test your programs, and see if it works in practice This section shows two easy schematics that enable you to home brew the required hardware and gives you the necessary hints on the required background This hardware really is easy to build I know nothing easier than that to test your first software steps If you like to make more experiments, leave some more space for future extensions on your experimental board If you don't like the smell of soldering, you can buy a ready-to-use board, too The available boards are characterized in this section below 3.1 The ISP Interface of the AVR processor family Before going into practice, we have to learn a few essentials on the serial programming mode of the AVR family No, you don't need three different voltages to program and read an AVR flash memory No, you don't need another preprogrammed microprocessor to program the AVRs No, you don't need 10 I/O lines to tell the chip what you like it to And you don't even have to remove the AVR from the socket on your your experimental board, before programming it It's even easier than that All this is done by a build-in interface in the AVR chips, that enable you to write and read the content of the program flash and the built-in-EEPROM This interface works serially and needs only three signal lines: • SCK: A clock signal that shifts the bits to be written to the memory into an internal shift register, and that shifts out the bits to be read from another internal shift register, • MOSI: The data signal that sends the bits to be written to the AVR, • MISO: The data signal that receives the bits read from the AVR These three signal pins are internally connected to the programming machine only if you change the RESET (sometimes also called RST or restart) pin to zero Otherwise, during normal operation of the AVR, these pins are programmable I/O lines like all the others If you like to use these pins for other purposes during normal operation, and for in-systemprogramming, you'll have to take care, that these two purposes not conflict Usually you then decouple these by resistors or by use of a multiplexer What is necessary in your case, depends from your use of the pins in the normal operation mode You're lucky, if you can use them for insystem-programming exclusively Not necessary, but recommendable for in-system-programming is, that you supply the programming hardware out of the supply voltage of your system That makes it easy, and requires two additional lines between the programmer and the AVR board GND is the common ground or negative pole of the supply voltage, VTG (target voltage) the supply voltage (usually +5.0 volts) This adds up to lines between the programmer hardware and the AVR board The resulting ISP6 connection, as defined by ATMEL, is shown on the left Standards always have alternative standards, that were used earlier This is the technical basis that constitutes the adapter industry In our case the alternative standard was designed as ISP10 and was used on the STK200 board, sometimes also called CANDA interface It's still a very widespread standard, and even the more recent STK500 board is equipped with it ISP10 has an additional signal to drive a red LED This LED signals that the programmer is doing his job A good idea Just connect the LED to a resistor and clamp it the positive supply voltage 3.2 Programmer for the PC-Parallel-Port Now, heat up your soldering iron and build up your programmer It is a quite easy schematic and works with standard parts from your well-sorted experiments box Yes, that's all you need to program an AVR The 25-pin plug goes into the parallel port of your PC, the 10-pin ISP goes to your AVR experimental board If your box doesn't have a 74LS245, you can also use a 74HC245 (with no hardware changes) or a 74LS244/74HC244 (by changing some pins and signals) If you use HC, don't forget to tie unused inputs either to GND or the supply voltage, otherwise the buffers might produce extra noise by capacitive switching The necessary program algorithm is done by the ISP software Be aware that this parallel port interface is not supported by ATMEL's studio software any more So, if you want to program your AVR directly from within the studio, use different programmers The Internet provides several solutions Avr-Asm-Tutorial 63 http://www.avr-asm-tutorial.net cbr rflg,1