Category Archives: AVR

AVR: Binary to BCD and vice versa

unsigned int bcd2i(unsigned int bcd) {
    unsigned int decimalMultiplier = 1;
    unsigned int digit;
    unsigned int i = 0;
    while (bcd > 0) {
        digit = bcd & 0xF;
        i += digit * decimalMultiplier;
        decimalMultiplier *= 10;
        bcd >>= 4;
    }
    return i;
}
unsigned int i2bcd(unsigned int i) {
    unsigned int binaryShift = 0;
    unsigned int digit;
    unsigned int bcd = 0;
    while (i > 0) {
        digit = i % 10;
        bcd += (digit << binaryShift);
        binaryShift += 4;
        i /= 10;
    }
    return bcd;
}

How to convert binary to BCD ?

AVR Tools

Installation

Windows

WinAVR

Linux

# apt-get install avr-libc binutils-avr gcc-avr
# apt-get install arduino arduino-core extra-xdg-menus libjna-java librxtx-java

binutils

C -> Object -> ELF Executable -> HEX
CC                      = avr-g++
DEVICE                  = atmega168
CPU_FREQ                = 16000000L

#  Use MCU name (atmega2560), not Architecture (avr6)
# Source: http://www.nongnu.org/avr-libc/user-manual/using_tools.html
GLOBAL_CFLAGS           = -O0 -DF_CPU=$(CPU_FREQ) -mmcu=$(DEVICE)
GLOBAL_LDFLAGS          = -mmcu=$(DEVICE)
$ sudo apt-get install gcc-avr
$ sudo apt-get install avr-libc
$ readelf.exe -S arduino_test
There are 3 section headers, starting at offset 0xb0:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0     Offset address + size can be seen in Hex-Editor
  [ 1] .data             PROGBITS        00800200 0001ac 000006 00  WA  0   0  1 <== Data
  [ 2] .text             PROGBITS        00000000 000074 000138 00  AX  0   0  2 <== Program Code
  [ 3] .shstrtab         STRTAB          00000000 0001b2 000027 00      0   0  1 <== Section Header String Table
  [ 4] .symtab           SYMTAB          00000000 0002cc 0005c0 10      5  12  4 <== Symbol Table
  [ 5] .strtab           STRTAB          00000000 00088c 000412 00      0   0  1 <== String Table
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
$ avr-readelf.exe -s arduino_test 

Symbol table '.symtab' contains 92 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00800200     0 SECTION LOCAL  DEFAULT    1 
     2: 00000000     0 SECTION LOCAL  DEFAULT    2 
     3: 00000000     0 FILE    LOCAL  DEFAULT  ABS ArduinoTestMain.c
  [...]
    10: 00800200     6 OBJECT  LOCAL  DEFAULT    1 TEST
    11: 00000136     0 NOTYPE  LOCAL  DEFAULT    2 __stop_program
  [...]
    39: 000000e4     0 NOTYPE  WEAK   DEFAULT    2 __init
    55: 00000116     0 NOTYPE  WEAK   DEFAULT    2 __vector_33
  [...]
    60: 000000f4     0 NOTYPE  GLOBAL DEFAULT    2 __do_copy_data
    61: 0000011a    26 FUNC    GLOBAL DEFAULT    2 main
    62: 00000116     0 NOTYPE  WEAK   DEFAULT    2 __vector_4
  [...]
avr-objdump -s -m avr6 arduino_test
arduino_test:     file format elf32-avr

Contents of section .data:
 800200 48616c6c 6f00                        Hallo.          
Contents of section .text:
 0000 0c947200 0c948b00 0c948b00 0c948b00  ..r.............
 0010 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0020 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0030 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0040 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0050 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0060 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0070 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0080 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0090 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00a0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00b0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00c0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00d0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00e0 0c948b00 11241fbe cfefd1e2 debfcdbf  .....$..........
 00f0 00e00cbf 12e0a0e0 b2e0e8e3 f1e000e0  ................
 0100 0bbf02c0 07900d92 a630b107 d9f70e94  .........0......
 0110 8d000c94 9a000c94 0000df93 cf93cdb7  ................
 0120 deb7e4e2 f0e08fef 8083e5e2 f0e083e0  ................
 0130 8083ffcf f894ffcf                    ........
$ avr-objcopy -j .text -j .data -O ihex arduino_test arduino_test.hex
$ avr-objdump -m avr6 -s arduino_test.hex

arduino_test.hex:     file format ihex

Contents of section .sec1:
 0000 0c947200 0c948b00 0c948b00 0c948b00  ..r.............
 0010 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0020 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0030 0c94ab00 0c94e500 0c948b00 0c948b00  ................
 0040 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0050 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0060 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0070 0c948b00 0c94c800 0c948b00 0c948b00  ................
 0080 0c948b00 0c948b00 0c948b00 0c948b00  ................
 0090 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00a0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00b0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00c0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00d0 0c948b00 0c948b00 0c948b00 0c948b00  ................
 00e0 0c948b00 11241fbe cfefd1e2 debfcdbf  .....$..........
 00f0 00e00cbf 12e0a0e0 b2e0e8e0 f2e000e0  ................
 0100 0bbf02c0 07900d92 a630b107 d9f70e94  .........0......
 0110 8d000c94 02010c94 0000df93 cf93cdb7  ................
 0120 deb7e4e2 f0e08fef 8083e5e2 f0e083e0  ................
 0130 80830e94 9c00ffcf df93cf93 cdb7deb7  ................
 0140 e8e6f0e0 82e08083 ece6f0e0 82e08083  ................
 0150 cf91df91 08951f92 0f920fb6 0f920090  ................
 0160 5b000f92 1124ef93 ff93df93 cf93cdb7  [....$..........
 0170 deb7e8e2 f0e01082 cf91df91 ff91ef91  ................
 0180 0f900092 5b000f90 0fbe0f90 1f901895  ....[...........
 0190 1f920f92 0fb60f92 00905b00 0f921124  ..........[....$
 01a0 ef93ff93 df93cf93 cdb7deb7 e8e2f0e0  ................
 01b0 1082cf91 df91ff91 ef910f90 00925b00  ..............[.
 01c0 0f900fbe 0f901f90 18951f92 0f920fb6  ................
 01d0 0f920090 5b000f92 1124ef93 ff93df93  ....[....$......
 01e0 cf93cdb7 deb7e8e2 f0e01082 cf91df91  ................
 01f0 ff91ef91 0f900092 5b000f90 0fbe0f90  ........[.......
 0200 1f901895 f894ffcf 48616c6c 6f00      ........Hallo.
$ avr-objdump -d -m avr6 arduino_test

arduino_test:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:   0c 94 72 00     jmp     0xe4    ; 0xe4 <__ctors_end>
   4:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
   8:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
   c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  10:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  14:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  18:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  1c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  20:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  24:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  28:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  2c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  30:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  34:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  38:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  3c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  40:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  44:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  48:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  4c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  50:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  54:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  58:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  5c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  60:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  64:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  68:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  6c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  70:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  74:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  78:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  7c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  80:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  84:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  88:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  8c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  90:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  94:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  98:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  9c:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  a0:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  a4:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  a8:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  ac:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  b0:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  b4:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  b8:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  bc:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  c0:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  c4:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  c8:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  cc:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  d0:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  d4:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  d8:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  dc:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
  e0:   0c 94 8b 00     jmp     0x116   ; 0x116 <__bad_interrupt>
000000e4 <__ctors_end>:
  e4:   11 24           eor     r1, r1
  e6:   1f be           out     0x3f, r1        ; 63
  e8:   cf ef           ldi     r28, 0xFF       ; 255
  ea:   d1 e2           ldi     r29, 0x21       ; 33
  ec:   de bf           out     0x3e, r29       ; 62
  ee:   cd bf           out     0x3d, r28       ; 61
  f0:   00 e0           ldi     r16, 0x00       ; 0
  f2:   0c bf           out     0x3c, r16       ; 60

000000f4 <__do_copy_data>:
  f4:   12 e0           ldi     r17, 0x02       ; 2
  f6:   a0 e0           ldi     r26, 0x00       ; 0
  f8:   b2 e0           ldi     r27, 0x02       ; 2
  fa:   e8 e3           ldi     r30, 0x38       ; 56
  fc:   f1 e0           ldi     r31, 0x01       ; 1
  fe:   00 e0           ldi     r16, 0x00       ; 0
 100:   0b bf           out     0x3b, r16       ; 59
 102:   02 c0           rjmp    .+4             ; 0x108 <__do_copy_data+0x14>
 104:   07 90           elpm    r0, Z+
 106:   0d 92           st      X+, r0
 108:   a6 30           cpi     r26, 0x06       ; 6
 10a:   b1 07           cpc     r27, r17
 10c:   d9 f7           brne    .-10            ; 0x104 <__do_copy_data+0x10>
 10e:   0e 94 8d 00     call    0x11a   ; 0x11a <main>
 112:   0c 94 9a 00     jmp     0x134   ; 0x134 <_exit>

00000116 <__bad_interrupt>:
 116:   0c 94 00 00     jmp     0       ; 0x0 <__vectors>

0000011a <main>:
 11a:   df 93           push    r29
 11c:   cf 93           push    r28
 11e:   cd b7           in      r28, 0x3d       ; 61
 120:   de b7           in      r29, 0x3e       ; 62
 122:   e4 e2           ldi     r30, 0x24       ; 36
 124:   f0 e0           ldi     r31, 0x00       ; 0
 126:   8f ef           ldi     r24, 0xFF       ; 255
 128:   80 83           st      Z, r24
 12a:   e5 e2           ldi     r30, 0x25       ; 37
 12c:   f0 e0           ldi     r31, 0x00       ; 0
 12e:   83 e0           ldi     r24, 0x03       ; 3
 130:   80 83           st      Z, r24
 132:   ff cf           rjmp    .-2             ; 0x132 <main+0x18>

00000134 <_exit>:
 134:   f8 94           cli

00000136 <__stop_program>:
 136:   ff cf           rjmp    .-2             ; 0x136 <__stop_program>

Use Architecture (avr6), not MCU name (atmega2560)
Source: http://www.nongnu.org/avr-libc/user-manual/using_tools.html

$ avr-objdump -d -m atmega2560 arduino_test

arduino_test:     file format elf32-avr

avr-objdump.exe: Can't use supplied machine atmega2560

Bug in GCC Version 4.3.3 (WinAVR 20100110): no -mmcu in linking-stage doesn’t exit but gives bad result:

$ avr-objdump -d -m avr6 arduino_test

arduino_test:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:   0c c0           rjmp    .+24            ; 0x1a <__ctors_end>
   2:   1f c0           rjmp    .+62            ; 0x42 <__bad_interrupt>
   4:   1e c0           rjmp    .+60            ; 0x42 <__bad_interrupt>
   6:   1d c0           rjmp    .+58            ; 0x42 <__bad_interrupt>
   8:   1c c0           rjmp    .+56            ; 0x42 <__bad_interrupt>
   a:   1b c0           rjmp    .+54            ; 0x42 <__bad_interrupt>
   c:   1a c0           rjmp    .+52            ; 0x42 <__bad_interrupt>
   e:   19 c0           rjmp    .+50            ; 0x42 <__bad_interrupt>
  10:   18 c0           rjmp    .+48            ; 0x42 <__bad_interrupt>
  12:   17 c0           rjmp    .+46            ; 0x42 <__bad_interrupt>
  14:   16 c0           rjmp    .+44            ; 0x42 <__bad_interrupt>
  16:   15 c0           rjmp    .+42            ; 0x42 <__bad_interrupt>
  18:   14 c0           rjmp    .+40            ; 0x42 <__bad_interrupt>

0000001a <__ctors_end>:
  1a:   11 24           eor     r1, r1
  1c:   1f be           out     0x3f, r1        ; 63
  1e:   cf e5           ldi     r28, 0x5F       ; 95
  20:   d2 e0           ldi     r29, 0x02       ; 2
  22:   de bf           out     0x3e, r29       ; 62
  [...]

Falscher Port ausgewählt

avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: ser_recv(): programmer is not responding
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: Send: 0 [30]   [20] 

ATmega48PA programmieren und flashen

avr-gcc -Wall -Os -DF_CPU=8000000  -mmcu=atmega48pa -c main.c -o main.o
unknown MCU 'atmega48pa' specified

atmega48pa ist aber kompatibel mit atmega48p:
ATmega48PA and avr-gcc
avrdude and atmega48pa

#------------------------------------------------------------
# ATmega48P
#------------------------------------------------------------

part
    id               = "m48p";
    desc             = "ATMEGA48P";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
                     0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
                     0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode   = 0x59;
    signature        = 0x1e 0x92 0x0a;
    
    pagel            = 0xd7;
    bs2              = 0xc2;
    chip_erase_delay = 45000;
    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                       "x x x x  x x x x    x x x x  x x x x";

    chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                       "x x x x  x x x x    x x x x  x x x x";

    timeout		= 200;
    stabdelay		= 100;
    cmdexedelay		= 25;
    synchloops		= 32;
    bytedelay		= 0;
    pollindex		= 3;
    pollvalue		= 0x53;
    predelay		= 1;
    postdelay		= 1;
    pollmethod		= 1;

    pp_controlstack     =
	0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
	0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
	0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
	0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    resetdelay          = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
        paged           = no;
        page_size       = 4;
        size            = 256;
        min_write_delay = 3600;
        max_write_delay = 3600;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
	read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

	write           = "  1   1   0   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          " a7  a6  a5  a4     a3  a2  a1  a0", 
                          "  i   i   i   i      i   i   i   i";

	loadpage_lo	= "  1   1   0   0      0   0   0   1",
			  "  0   0   0   0      0   0   0   0",
			  "  0   0   0   0      0   0  a1  a0",
			  "  i   i   i   i      i   i   i   i";

	writepage	= "  1   1   0   0      0   0   1   0",
			  "  0   0   x   x      x   x   x   x",
			  " a7  a6  a5  a4     a3  a2   0   0",
			  "  x   x   x   x      x   x   x   x";

	mode		= 0x41;
	delay		= 20;
	blocksize	= 4;
	readsize	= 256;
      ;
    memory "flash"
        paged           = yes;
        size            = 4096;
        page_size       = 64;
        num_pages       = 64;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0x00;
        readback_p2     = 0x00;
        read_lo         = "  0   0   1   0    0   0   0   0",
                          "  0   0   0   0    0 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        read_hi         = "  0   0   1   0    1   0   0   0",
                          "  0   0   0   0    0 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        loadpage_lo     = "  0   1   0   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        writepage       = "  0   1   0   0      1   1   0   0",
                          "  0   0   0   0      0 a10  a9  a8",
                          " a7  a6  a5   x      x   x   x   x",
                          "  x   x   x   x      x   x   x   x";

	mode		= 0x41;
	delay		= 6;
	blocksize	= 64;
	readsize	= 256;
      ;

    memory "lfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "hfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  1 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "efuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   x x x x  x x x o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 1 0 0",
                          "x x x x  x x x x   x x x x  x x x i";
      ;

    memory "lock"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   x x o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                          "x x x x  x x x x   1 1 i i  i i i i";
      ;

    memory "calibration"
        size            = 1;
        read            = "0  0  1  1   1  0  0  0   0  0  0  x   x  x  x  x",
                          "0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o";
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;
  ;
DEVICE  = atmega48p
DEV_CODE = 0x31
AVRDUDE  = avrdude -C avrdude.conf -c avr910 -vvv -P com4 -x devcode=$(DEV_CODE) -b 115200 -p $(DEVICE)