[dorkbotpdx-blabber] assembler on the arduino?

Greg Borenstein greg.borenstein at gmail.com
Mon Jan 28 14:16:49 EST 2008


Paul,

Thanks for this intro, it was exactly what I've been looking for! Very  
clear and well-explained to boot. Now, I think I'm finally starting to  
understand all the steps involved in getting to a position where I  
could be writing and running my first assembler code...

I may have to pick your brain more on this in the future.

yours,

Greg

On Jan 28, 2008, at 11:06 AM, Paul Stoffregen wrote:

> Ultimately, your assembler is going to produce a .hex file which is  
> an ascii encoded copy of the raw data that needs to be programmed  
> into the MEGA168 chip.  All you need to do is write that code into  
> the MEGA168 chip, run it, and have some way to observe what it's  
> doing so you can debug it (unless you never make any mistakes!)
>
> There are 2 ways to program code into the MEGA168 chip.
>
> #1: if the chip already has a bootloader programmed in, you can  
> cause the bootloader to run and it will receive a download of code  
> and write it into the chip (except for the portion which already has  
> the bootloader, of course).  This is how the arduino is normally used.
>
> #2: by connecting to a few pins, you can directly program code into  
> any portion of the chip.  This is the only way to initially write  
> the bootloader.  To do this, you need to buy or build hardware that  
> manipulates the special programming pins.  For example: http://www.arduino.cc/en/Hacking/ParallelProgrammer 
>   This is the way I have always programmed the Atmel AVR chips,  
> though my custom-build hardware is quite different, the idea is the  
> same.
>
> There is actually another way, pretty much the same as #2, but many  
> more pins are used for a small speed increase.  It's pretty much  
> only used to program the chips in high volume production.
>
> Usually, to observe what your code is doing, you'll send data via  
> the UART to your PC serial port.  You can use the arduino software  
> or any terminal emulator to view it.  You can also toggle output  
> pins, which gives a lot less info but also takes a lot less time.   
> There are also expensive in-circuit emulator products that let for  
> more or less directly observe stuff, but if you have the arduino,  
> you're probably not going to buy one of those.
>
>
> Also, there are 2 different approaches to assembly language.
>
> Most commonly, people opt to write mostly in C and code tiny pieces  
> in assembly.  C is a lot less work than assembly, so the reasoning  
> goes that you can do everything "easily" in C that isn't speed  
> critical, then only do the "hard work" on a few little sections.   
> This is true, however, the compiler will impose a lot of constraints  
> on your assembly code.  Entry and exit from functions requires  
> parameter passing using pre-defined registers (and the stack if more  
> params), most other registers have to be saved if you use them, and  
> so on.  Your freedom to allocate the registers is severely  
> constrained.  While you don't have to write very much assembly this  
> way, the bits you do write have many rules to follow.  That makes it  
> more difficult and puts a lot of limits on you (basically the same  
> limits the compiler has, though you're a lot smarter than the  
> compiler and will still do a better job, even playing by its rules).
>
> The other approach is to write everything in assembly.  Without the  
> compiler's requirements, you have a lot more freedom.  Some people  
> would say a lot more rope to hang yourself.  But just to give you an  
> idea, the main difference (which matters most on the AVR) is that  
> you get to decide about register allocation on a global scale.  You  
> can, for instance, decide to dedicate several registers to some  
> interrupt routine that needs a bunch of variables (quite common),  
> rather than having to slowly (and with lots of extra code) push the  
> registers onto the stack, load the variables from memory, and then  
> to the reverse on exit from the interrupt.  All you have to do is  
> simply not use those registers anywhere else (or disable interrupts,  
> but if you're coding such high performance interrupt handlers,  
> disabling interrupts for any length of time is probably the last  
> thing you'll want to do).  There are a lot of ways to achieve much  
> faster, much smaller code than is ever possible with the compiler,  
> if it's never used anywhere and you don't have to obey its rules.
>
>
> So, if you really want to do an all assembly approach the "hard  
> way" (as Don will happily tell you I'm crazy to do), first try  
> writing a very simple bit of assembly code to just toggle a pin in  
> an infinite loop.  It should be only a dozen bytes of output.  Then  
> build that parallel port cable and try getting the MEGA168 chip to  
> run it, using a 'scope or multimeter (DC volts 2.5 if it's toggling  
> high/low rapidly at 50%) or even an LED to observe the pin.  Then  
> try sending some bytes out the UART while watching via a terminal  
> emulator.  Once you get to that stage, well, you'll be well on your  
> way.
>
> But in all likelihood, if your course is using the arduino, it may  
> be other approach of using C with little bits of assembly.
>
>
> -Paul
>
>
>
> _______________________________________________
> dorkbotpdx-blabber mailing list
> dorkbotpdx-blabber at dorkbot.org
> http://music.columbia.edu/mailman/listinfo/dorkbotpdx-blabber



More information about the dorkbotpdx-blabber mailing list