Path: home => avr main => how-to => converting source code Logo

How-to convert an assembler source code file for a different AVR type

This page gives some hints on what to do if you want to assemble a given source code file for a different AVR type.

Three cases are to be discriminated:
  1. If you are well familar with assembler, you always have to outweigh the upcoming work in conversion against the work load that you would have in re-writing the code on your own. In cases where you have no or only rudimentary documentation of the source code: give it up and make your own. In such cases conversion only eats your time and you will not be very lucky with the results and the lengthy debug sessions.
  2. If you are fairly familar with assembler: try it out. Do'nt be disappointed if the results are not how you expected. Consider the following hints on potential incompatibilities thoroughly.
  3. If you are not familar with assembler: learn the basics of assembler and of the AVR hardware design first. Any other method will only frustrate you, and you will not get the project finalized to your contention.

1 Device types with different suffices

If the old and the new type are just differing in the suffix (e.g. ATtiny13A instead of ATtiny13) you are fine if you

2 Device types with different numbers

If the numbers are different, are those numbers for the same AVR family? Examples for such families are ATtiny4-5-9-10, ATtiny24-44-84, ATtiny1614-1616-1617, ATmega48-88-168 or ATmega169-329-649-3290-6490.

In such cases you are fine if you move from a smaller to a larger device. Nearly nothing has to be changed then.

In case you move from a larger to a smaller device you have to ensure that the extra SRAM and EEPROM is not used. Consult the specific code sections (.dseg and .eseg) to see what is used to which extent. If the original software uses more than your target device offers: forget the conversion task.

A move to a device outside the AVR family scope is a more tricky task. You will need to go deep into the hard- and software. The following basic information is required: collecting basic information by identifying hardware use and clock frequency. If you have absolved this, you can change the interrupt vector table.

2.1 Collecting basic information

2.1.1 Identifying all hardware used

Search for the term "out" and collect those lines where the term occurs (and preceeding lines that have an influence on the content written) in an ordered list. For each identified hardware component identify the modes to which those components are switched.

Hardware components that require attention are timers (8 and 16 bit wide, in numerous modes), ADC (in several different modes, input sources, with/without differential gain, as temperature sensor), portbits (with all their alternative uses, e.g. as PWM output).

Check if the target device has all hardware components and offers the same modes in which those are operated. If the target device does not cover all those needs, give up the conversion task and design your own.

2.1.2 Checking clock frequencies

Linear programs nearly always use delay loops. In interrupt driven programs nearly always timers control the program execution In both cases, the clock frequency is decisive.

The first step is therefore to compare the clock frequency of the original and the target type. The default values can be found in the two device databooks (search for "default clock").

Then check in the source code if you find any hints on fuse settings that alter the default frequency (search for the terms "fuse" and "clock"). If the fuse CLKDIV8 is mentioned, this is significant information.

By searching for "out CLKPR" make sure that the clock prescaler is not altered.

If the target device can be braught to run with the same frequency as the original device, you are fine. If not, e.g. because better give up the conversion task and design your own.

If the program is linear (no interrupts used), you can try to change delay loops to the new frequency. Depending from the quality of the original documentation that may turn into a lengthy procedure. And you may fail, if 8- / 16- bit limitations are exceeded.

If the program involves timers, ensure that you convert any timer settings to the differing clock frequency. If your 8-bit timer exceeds the 256-stage limit or your 16-bit timer exceeds the 65536-stage limit: design the whole timing anew.

2.3 Re-writing interrupt vectors

One of the basic criteria is: does the source code use interrupts or not. For checking that search for the reset and interrupt vectors. If one or more interrupt vectors are used, the following has to be done.

Copy the interrupt vector table for the target device in the device databook and paste it to the source code file, e.g. for an ATtiny48:
1 0x000 RESET External/Power-on/Brown-out/Watchdog Reset
2 0x001 INT0 External Interrupt Request 0
3 0x002 INT1 External Interrupt Request 1
4 0x003 PCINT0 Pin Change Interrupt Request 0
5 0x004 PCINT1 Pin Change Interrupt Request 1
6 0x005 PCINT2 Pin Change Interrupt Request 2
7 0x006 PCINT3 Pin Change Interrupt Request 3
8 0x007 WDT Watchdog Time-out Interrupt
9 0x008 TIMER1_CAPT Timer/Counter1 Capture Event
10 0x009 TIMER1_COMPA Timer/Counter1 Compare Match A
11 0x00A TIMER1_COMPB Timer/Counter1 Compare Match B
12 0x00B TIMER1_OVF Timer/Counter1 Overflow
13 0x00C TIMER0_COMPA Timer/Counter0 Compare Match A
14 0x00D TIMER0_COMPB Timer/Counter0 Compare Match B
15 0x00E TIMER0_OVF Timer/Counter0 Overflow
16 0x00F SPI_STC SPI Serial Transfer Complete
17 0x010 ADC ADC Conversion Complete
18 0x011 EE_RDY EEPROM Ready
19 0x012 ANA_COMP Analog Comparator
20 0x013 TWI 2-wire Serial Interface
Remove the numbers and addresses in those lines and try to sort the existing interrupt vector jump labels to their correct position, preceded by an rjmp instruction. If your target has 16 KB and more flash memory use rjmp label, followed by an nop.

The first vector should rjmp to the init routine, all other vectors are preceded - and with that decativated - with reti instructions.

Finally: good luck with the conversion task. To the top of that page, to the Q+A page

©2014-2017 by http://www.avr-asm-tutorial.net