Pages: 1 2 [3] 4 5   Go Down
Author Topic: Audioino?  (Read 5729 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You can get all the files from the website
http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=127

or I made a quick link to download them
http://cl.ly/222H0K3j0f3j

There is a AudioBoot.c file which I think is the source file that can be rebuilt. I googled around but I could not find a good tutorial on how to do such a thing.
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perhaps I am missing something, but this doesn't look like a bootloader to me (excerpted code):

Code:
//***************************************************************************************
//** the data transmition was developed on the arduino plattform
//***************************************************************************************
#ifdef ARDUINO_PLATFORM

#define ARDUINO_DEBUG

const int ledPin =  13;    // LED connected to digital pin 13

// The setup() method runs once, when the sketch starts

void setup()   {               
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);     
  Serial.begin(9600);
          Serial.println("AudioBoot starting");
}
void loop()                     
{
  a_main();
  while(1); // stop
}

#define LEDON  { digitalWrite(ledPin, HIGH );   }
#define LEDOFF { digitalWrite(ledPin, LOW  );   }
    #define TOGGLELED { digitalWrite(ledPin, !digitalRead(ledPin));}


#define INPUTAUDIOPIN (1<<PB4)
#define PINVALUE (PINB&INPUTAUDIOPIN)

#define PINLOW (PINVALUE==0)
#define PINHIGH (!PINLOW)

#endif


There is nothing there about a start compilation address, for one thing.

For example, in the Optiboot makefile I see this:

Code:
atmega328: TARGET = atmega328
atmega328: MCU_TARGET = atmega328p
atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
atmega328: AVR_FREQ = 16000000L
atmega328: LDSECTION  = --section-start=.text=0x7e00
atmega328: $(PROGRAM)_atmega328.hex
atmega328: $(PROGRAM)_atmega328.lst

Note the start address (0x7e00). The file in that download doesn't even have a makefile.

It looks like he did it in Visual Studio. The file chAudioBoot.aps has this in it:

Code:
<LINKEROPTIONS> -Wl,--section-start=.text=0x3c00 </LINKEROPTIONS>

I suggest writing to the author. Perhaps he has an easy way of making a 328-compatible version.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Lindau / Germany
Offline Offline
Jr. Member
**
Karma: 1
Posts: 68
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
#ifdef ARDUINO_PLATFORM

There seems to be a misunderstanding: The compilation for "ARDUINO_PLATFORM" is meant for debugging purpose. If you complile it with this option, you can use an Arduino to make the received values visible, it is not meant to be used for "bootloading".
If you want to compile a bootloader you should use one of the "microcontroller" definitions.
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, fair enough. I got it to compile at the command line on my Mac using this shell script:

Code:
avr-gcc -mmcu=atmega328p \
    -D__AVR_ATmega328P__ \
    -DF_CPU=16000000L \
    -Os \
    -gdwarf-2 \
    -fno-inline-small-functions \
    -fno-split-wide-types \
    -fno-tree-scev-cprop  \
    -fno-exceptions -ffunction-sections -fdata-sections \
    -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mno-tablejump  \
    -fno-keep-inline-functions -fno-common \
    -std=gnu99 \
    -Wl,--section-start=.text=7C00 \
    -Wl,--relax -nostartfiles \
    -Wl,--gc-sections \
    -oaudioboot.elf chAudioBoot.c
rm audioboot.hex
avr-objcopy -O ihex --set-section-flags=.eeprom=alloc,load \
    --no-change-warnings \
    --change-section-lma \
    .eeprom=0 \
    -R .eeprom audioboot.elf audioboot.hex

avr-objdump -j .sec1 -d -m avr5 audioboot.hex > audioboot.lst

I modified the source file slightly to get it to compile. The diffs are:

Code:
*** chAudioBoot.c 2012-12-25 18:08:02.000000000 +1100
--- /Users/nick/Documents/AudioBoot/chaudioboot.c 2012-12-30 07:57:42.000000000 +1100
***************
*** 124,134 ****
  // here starts the code for the stand alone microcontroller
  //***************************************************************************************
 
  #ifdef UNSPECIFIED_PLATTFORM
 
  #include <avr/io.h>
  #include <avr/interrupt.h>
- #include <avr/signal.h>
  #include <stdlib.h>
  #include <avr/boot.h>
 
--- 124,136 ----
  // here starts the code for the stand alone microcontroller
  //***************************************************************************************
 
+ void a_main();
+ int main(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
+
  #ifdef UNSPECIFIED_PLATTFORM
 
  #include <avr/io.h>
  #include <avr/interrupt.h>
  #include <stdlib.h>
  #include <avr/boot.h>
 
***************
*** 177,183 ****
  #define PINVALUE (PIND&INPUTAUDIOPIN)
 
  //turn on pull up and set Poti GND
! #define INITPORT { PORTD|=INPUTAUDIOPIN;\
  DDRD|=(1<<PD2);}
 
  #define PINLOW (PINVALUE==0)
--- 179,185 ----
  #define PINVALUE (PIND&INPUTAUDIOPIN)
 
  //turn on pull up and set Poti GND
! #define INITPORT { PORTD|=INPUTAUDIOPIN;\
  DDRD|=(1<<PD2);}
 
  #define PINLOW (PINVALUE==0)


Basically:

  • Removed an obsolete include for signal.h
  • Did a function prototype for a_main
  • Did a prototype for main which put it in .init9 section and made it naked
  • Got rid of a space after a backslash

The amended file is attached (as well as the build script).

Compile by using the shell script:

Code:
$ ./build.sh

Resulting files:

Code:
$ ls -l
total 104
-rwxr-xr-x  1 nick  staff   5714 30 Dec 08:05 audioboot.elf
-rw-r--r--  1 nick  staff   2055 30 Dec 08:05 audioboot.hex
-rw-r--r--  1 nick  staff  13306 30 Dec 08:05 audioboot.lst
-rwxr-xr-x@ 1 nick  staff    805 30 Dec 07:44 build.sh
-rwxr-xr-x@ 1 nick  staff  16992 30 Dec 07:57 chAudioBoot.c

The resulting file indeed seems to start at 0x7C00:

Code:
audioboot.hex:     file format ihex


Disassembly of section .sec1:

00007c00 <.sec1>:
    7c00: 11 e0        ldi r17, 0x01 ; 1
    7c02: a0 e0        ldi r26, 0x00 ; 0
    7c04: b1 e0        ldi r27, 0x01 ; 1
    7c06: 01 c0        rjmp .+2      ;  0x7c0a
    7c08: 1d 92        st X+, r1
    7c0a: a5 38        cpi r26, 0x85 ; 133
    7c0c: b1 07        cpc r27, r17
    7c0e: e1 f7        brne .-8      ;  0x7c08
    7c10: 25 9a        sbi 0x04, 5 ; 4
    7c12: 59 9a        sbi 0x0b, 1 ; 11
    7c14: fa d0        rcall .+500    ;  0x7e0a

I haven't tested it - I don't have the audio hardware set up - but this is closer to what you want. Now you want the fuses for a 1024 byte (512 word) bootloader (high fuse = 0xDC, I think).

I attach the .hex file as well just in case you don't plan to modify the bootloader. But I can't guarantee it works, as I said.

* chAudioBoot.c (16.59 KB - downloaded 15 times.)
* build.sh (0.79 KB - downloaded 14 times.)
* audioboot.hex (2.01 KB - downloaded 16 times.)
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Looking at the bootloader code a bit more it seems to use interrupts, a bit. You might want to omit the "naked" part. I'm not absolutely sure how well interrupts are going to work with it. Possibly it will work unchanged. Possibly not.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I was able to successfully bootload the hex file that you provided but I dont think the programming through the bootloader is working. I was also trying to compile your bootloader again after removing the naked main script and I also wanted to change the clock speed to 8mhz rather than 16 but I keep getting an error while trying to build it.

here is what i get when i run ./build.sh

http://cl.ly/image/211E2U35070R

Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

You can copy and paste those messages you know, you don't need to take screen shots of them.

Let's see what version of avr-gcc you have. I have:

Code:
$ avr-gcc --version

avr-gcc (GCC) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
~ $ avr-gcc --version
avr-gcc (GCC) 4.6.2
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you paste that error message into a forum message please? Helps talk about it.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here you go, I'll stop doing screenshots haha.

Code:
~/Desktop/AudioBoot $ ./build.sh
cc1: error: unrecognized command line option '-mno-tablejump'
avr-objcopy: 'audioboot.elf': No such file
avr-objdump: 'audioboot.hex': No such file
avr-objdump: section '.sec1' mentioned in a -j option, but not found in any input file

before running the script
Code:
~/Desktop/AudioBoot $ ls -1
audioboot.hex
build.sh
chAudioBoot.c

After running the script
Code:
~/Desktop/AudioBoot $ ls -1
audioboot.lst
build.sh
chAudioBoot.c
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Try omitting '-mno-tablejump' from the build.sh file.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So I omitted that part, and when i tried to bootload it did not work properly. I then remembered I commented out your naked main function and so I UNCOMMENTED it and then recompiled and bootloaded and it bootloaded successfully and was able to boot. However, the same error blink occured when i tried to program. Not sure what the problem could be anymore. I even tried to change everything to the internal 8mhz clock and again it successfully boots but cannot actually be reprogrammed.

I was thinking it might help to run the bootloader in the arduino definition and when i changed the chAudioboot.c file to change the definition and then tried to build the project again this is the error I got.

Code:
~/Desktop/AudioBoot $ ./build.sh
chAudioBoot.c: In function 'setup':
chAudioBoot.c:98:4: warning: implicit declaration of function 'pinMode' [-Wimplicit-function-declaration]
chAudioBoot.c:98:20: error: 'OUTPUT' undeclared (first use in this function)
chAudioBoot.c:98:20: note: each undeclared identifier is reported only once for each function it appears in
chAudioBoot.c:99:4: error: 'Serial' undeclared (first use in this function)
chAudioBoot.c: In function 'loop':
chAudioBoot.c:104:4: warning: implicit declaration of function 'a_main' [-Wimplicit-function-declaration]
chAudioBoot.c: At top level:
chAudioBoot.c:127:6: warning: conflicting types for 'a_main' [enabled by default]
chAudioBoot.c:104:4: note: previous implicit declaration of 'a_main' was here
chAudioBoot.c:299:1: error: unknown type name 'uint8_t'
chAudioBoot.c:312:1: error: unknown type name 'uint8_t'
chAudioBoot.c: In function 'receiveFrame':
chAudioBoot.c:314:3: error: unknown type name 'uint16_t'
chAudioBoot.c:316:3: error: unknown type name 'uint16_t'
chAudioBoot.c:317:3: error: unknown type name 'uint16_t'
chAudioBoot.c:318:3: error: unknown type name 'uint16_t'
chAudioBoot.c:319:3: error: unknown type name 'uint8_t'
chAudioBoot.c:320:3: error: unknown type name 'uint8_t'
chAudioBoot.c:321:3: error: unknown type name 'uint8_t'
chAudioBoot.c:322:3: error: unknown type name 'uint16_t'
chAudioBoot.c:327:5: error: 'PINB' undeclared (first use in this function)
chAudioBoot.c:327:5: error: 'PB4' undeclared (first use in this function)
chAudioBoot.c:332:3: error: 'TCNT2' undeclared (first use in this function)
chAudioBoot.c:390:5: error: unknown type name 'uint16_t'
chAudioBoot.c:390:19: error: 'uint16_t' undeclared (first use in this function)
chAudioBoot.c:390:28: error: expected ',' or ';' before 'FrameData'
chAudioBoot.c:396:5: error: 'Serial' undeclared (first use in this function)
chAudioBoot.c:407:31: error: 'HEX' undeclared (first use in this function)
chAudioBoot.c:425:26: error: 'true' undeclared (first use in this function)
chAudioBoot.c:426:15: error: 'false' undeclared (first use in this function)
chAudioBoot.c: At top level:
chAudioBoot.c:437:25: error: unknown type name 'uint32_t'
chAudioBoot.c:437:40: error: unknown type name 'uint8_t'
chAudioBoot.c: In function 'runProgramm':
chAudioBoot.c:477:2: error: 'DDRB' undeclared (first use in this function)
chAudioBoot.c:478:2: error: 'DDRC' undeclared (first use in this function)
chAudioBoot.c:479:2: error: 'DDRD' undeclared (first use in this function)
chAudioBoot.c:480:2: warning: implicit declaration of function 'cli' [-Wimplicit-function-declaration]
chAudioBoot.c: In function 'a_main':
chAudioBoot.c:505:3: error: 'Serial' undeclared (first use in this function)
chAudioBoot.c:508:3: error: unknown type name 'uint8_t'
chAudioBoot.c:510:3: error: unknown type name 'uint16_t'
chAudioBoot.c:511:3: error: unknown type name 'uint8_t'
chAudioBoot.c:514:3: error: unknown type name 'uint8_t'
chAudioBoot.c:518:8: error: 'TCNT2' undeclared (first use in this function)
chAudioBoot.c:524:10: warning: implicit declaration of function 'digitalWrite' [-Wimplicit-function-declaration]
chAudioBoot.c:524:10: warning: implicit declaration of function 'digitalRead' [-Wimplicit-function-declaration]
chAudioBoot.c:535:12: error: 'LOW' undeclared (first use in this function)
chAudioBoot.c:541:11: error: 'PINB' undeclared (first use in this function)
chAudioBoot.c:541:11: error: 'PB4' undeclared (first use in this function)
chAudioBoot.c:550:3: error: 'HIGH' undeclared (first use in this function)
rm: audioboot.hex: No such file or directory
avr-objcopy: 'audioboot.elf': No such file
avr-objdump: 'audioboot.hex': No such file
avr-objdump: section '.sec1' mentioned in a -j option, but not found in any input file
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

It looks like in "Arduino" mode you are expected to compile it inside the IDE, that gives you access to the data types, Serial stuff and so on.

I copied and pasted the original loader into the IDE, changed 3 lines, and it compiled:

Code:
#define ARDUINO_PLATFORM // ( with Atmega168 ) bootloader development on arduino plattform   // uncommented it
...
#define LEDPORT (1<<DDB5);     // was  PB5
...
#define INPUTAUDIOPIN (1<<PORTD1)  // was PD1
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Full Member
***
Karma: 0
Posts: 100
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ive was able to successfully add the arduino verison of the bootloader and same problem of not being able to program it after bootloading. I think we have hit a wall and Im not sure if its worth my time anymore to continue this unless someone else can do some testing. I wish I knew more about bootloaders so I could write my own. I really like the idea of an audio based bootloader since it would be especially attractive in a commerical product and overall is easier to implement 1 wire rather than 6 for ICSP.

Do you know of any other neat bootloaders? I am trying to make my project easier to program than using ICSP, hoping to bring it down to 2 datawires.
Logged

Global Moderator
Melbourne, Australia
Online Online
Brattain Member
*****
Karma: 511
Posts: 19315
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

The standard bootloader only uses 3 wires: Tx, Rx, Gnd. So when you say 1 wire you mean 2 wires (as you acknowledge).

I'm not sure you are saving a heap by going down this path.

In a commercial product reliability would count for something, and having 1-wire (plus Gnd) means you don't get any acknowledgement so you don't know for sure if you changed the program.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Pages: 1 2 [3] 4 5   Go Up
Jump to: