Arduino Forum

International => Deutsch => Topic started by: ChrisMicro on Sep 04, 2011, 06:03 pm

Title: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 04, 2011, 06:03 pm
Hallo Zusammen,

hier möchte ich mein minimalistisches Arduino-Clone Projekt vorstellen: Mit Hilfe des Audio Ausgangs kann ein Atmega168 programmiert werden. Die Hardware für die Programmierung besteht nur aus 2 10K-Ohm Widerständen, einem 10nF Kondensator und der Line-In Buchse.

Das Projekt befindet sich im Moment noch hier:
http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=128&p=531#p531

Was meint Ihr dazu?

Viele Grüße,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: dani95 on Sep 04, 2011, 08:05 pm
Wow, cool ;)
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 05, 2011, 08:33 am
Danke für den positiven Kommentar :-)

Um den Atmega168 über Line-Out zu flashen, muss man zuerst ein Programm in der Arduino-Umgebung schreiben und dann das HEX-File mit dem Java-Flash-Programm übertragen.

Jetzt habe ich ein kleines Problem:
Bei der Arduino-Entwicklungsumgebung 017 finden sich die HEX-Files in den Ordnern der Scetches.
Bei der Version 022 kann ich die HEX-Files aber nicht finden.

Weiß jemand, wo die HEX-Files abegelegt werden?
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: squaremeter on Sep 05, 2011, 09:29 am
Quote
The .hex file is the final output of the compilation which is then uploaded to the board. During a "Verify" the .hex file is written to /tmp (on Mac and Linux) or \Documents and Settings\<USER>\Local Settings\Temp (on Windows). During upload, it's written to the applet sub-directory of the sketch directory (which you can open with the "Show Sketch Folder" item in the Sketch menu).


LINK (http://www.arduino.cc/en/Hacking/BuildProcess)

nichts zu danken =)

LG M²
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 05, 2011, 09:55 am
Hallo squaremeter,

den Artikel im Link hatte ich schon gelesen. Allerdings scheint das nur noch für die 017er Version der Entwicklungsumgebung zu stimmen. Mit der 022er finde ich das HEX-File nirgends mehr.

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: squaremeter on Sep 05, 2011, 11:23 am
Quote
den Artikel im Link hatte ich schon gelesen. Allerdings scheint das nur noch für die 017er Version der Entwicklungsumgebung zu stimmen. Mit der 022er finde ich das HEX-File nirgends mehr.


stimmt. aber ich habe einen weg gefunden das teil zu finden.
Einfach zu C:\Dokumente und Einstellungen\<username>\Lokale Einstellungen\Temp\ navigieren (versteckte ordner anzeigen) und Suchen (Strg+F) nach *.hex(ja wirklich *)
auf die art und weise hab ich meine "countdown.cpp.hex" datei gefunden.
da ich aber nicht viel von den Dingern versteh kann ich dir nicht sagen obs das richtige ist... die Zahlen 0-F stehn auf jeden fall drin

LG M²
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 05, 2011, 11:54 am
Danke, das muss ich mal ausprobieren :-) Ich habe auch gesucht, war aber wohl irgendwie zu doof  :smiley-mr-green:
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: MaFu on Sep 05, 2011, 04:36 pm
Einfach die Shift-Taste gedrückt halten wenn man den Compilerlauf startet. Dann werden die Compilermeldungen im Statusfenster angezeigt und ganz zum Schluss steht dann auch der Pfad zur HEX-Datei.
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: voithian on Sep 05, 2011, 05:00 pm
Und nicht die IDE zumachen, sonst wird die HEX-Datei gelöscht...
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 05, 2011, 05:20 pm
Quote
Einfach die Shift-Taste gedrückt halten wenn man den Compilerlauf startet. Dann werden die Compilermeldungen im Statusfenster angezeigt und ganz zum Schluss steht dann auch der Pfad zur HEX-Datei.


Ha, danke, danach suche ich ja schon lange, Danke :-)

Die Prozedur des Flashens gestaltet sich im Moment etwas umständlich, da ja das File dann immer gesucht werden muss.
Zum Flashen verwende ich ein Java Programm, welches das HEX-File in ein WAV-File umwandelt und dann als Sound abspielt.
Besser wäre, wenn man das Java-Programm irgendwie aus der Arduino-Umgebung starten könnte und es von dort gleich den richtigen Pfad zum Hex-Fiie mitbekommen würde.
Gibt es eine Möglichkeit, eigene Flasher in die Entwicklungsumgebung einzufügen?
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 07, 2011, 08:28 pm
Hier ein kleines Demo-Video:
http://vimeo.com/28725586
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: kurti on Sep 07, 2011, 09:27 pm
Hallo,
wenn Du nach Dateien auf Deinem Computer suchst, kann ich Dir das Programm Everything empfehlen.
http://www.voidtools.com/
Es funktioniert allerdings nur mit NTFS-formatierten Festplatten.
Dafür weiß es allerdings sofort, wo die gesuchte Datei ist.
Es wird nur nach Dateinamen gesucht, nicht nach Inhalten.

Gruss
Kurti
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 07, 2011, 10:03 pm
Vielen Dank für den Hinweis, kurti.
Damit das Bootloader-Programm komfortabel zu benutzen ist, müsste ich aber vielleicht doch einen Weg finden, das Ganze automatisch anzubinden.
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 08, 2011, 09:53 pm
Die Doku ist jetzt online:
http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=128
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: another_one on Sep 10, 2011, 10:37 am
Und du wurdest im Bereich "Exhibition" erwähnt (http://arduino.cc/forum/index.php/topic,71864.0.html)... :-)
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Sep 11, 2011, 09:59 pm
Vielen Dank für die Information, das Projekt scheint ja die Leute doch sehr zu interessieren.
Mich würde es freuen, wenn die Leute es ausprobieren und die Erfahrungen damit posten.
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Apr 26, 2012, 08:34 pm
Hallo Chris, ich finde die Idee mit dem Audiobootloader genial, zum peiswerten Flashen von AVRs unübertroffen. Leider ist es mir bisher nicht gelungen, den Code des Bootloaders mit AVR-Studio4 für einen ATmega8L zu compilieren (ATmega168 geht). Es gibt es 3Fehlermeldungen. Beim ursprünglich im September veröffentlichten Code taucht der ATmega8 noch als compilierbare Option auf, bei dem über den Elektor-Link publizierte Code ist nur noch der ATmega 168 vorgesehen. Leider ist beim überaus preisweren Conrad-PingPongSpiel mit 120LEDs onboard ein ATmega8L drauf. Diese preiswerte Hardware verbunden mit dem Audiobootloader wäre eine grandiose Sache. Zumal auch kein Quartz bestückt ist. Vielleicht schauen Sie oder jemand anderes mit einer Idee hier wieder vorbei und können mir einen Hinweis geben, wie ich den Code für die PinPong-Platine compilieren kann.
Falls die PingPongPlatine noch nicht bekannt ist hier mal ein Link zu einer (nicht von mir) geposteten Anwendung. Bei Conrad gibt es diese Platinen manchmal für weniger al 7€: http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/ping-pong-einparkhilfe-fuer-pkw-mit-distanz-sensor
Ansonsten wäre es natürlich super, wenn der Bootloader auf alle möglichen AVRs anpassbar wäre. Insofern könnte man so noch einige Leute mit dieser tollen Idee beglücken.
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: uwefed on Apr 26, 2012, 11:03 pm
Vieleicht hat der ATmega8 zuwenig RAM/ROM um ihn sinvoll in diesem Projekt einzusetzen. Darum ist er nicht mehr in der Liste.
Grüße Uwe
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Apr 26, 2012, 11:31 pm
Hallo Uwe, danke für die schnelle Antwort. Ich glaube das aber doch nicht, da ja z.B. beim Arduino NG mit ATmega8 auch ein 1k Bootloader zum Einsatz kam. http://arduino.cc/hu/Hacking/Bootloader : "The ATmega8 bootloader only takes up 1 KB of flash. It does not timeout when it receives invalid data, you need to make sure that no data is sent to the board during the 6-8 seconds when the bootloader is running. " Aber vielleicht ist der von Chris gebaute Bootloader wieder ein paar Byte größer geworden und überschreitet die 1k-Grenze des ATmega8?
Gruß Johannes
P.S. ich habe nämlich einen "Klassensatz" PingPongs und fände die AudioFlashMethode gut geeignet, um Beginnern ohne teuertolle Hardware einen Einstieg in C zu ermöglichen. So könnten sie nach Flashen des Bootloaders selber eigenen Code brennen. Gerade für kleine billige AVRs ist das attraktiv. Da gerade in der Mai-Elektor der Artikel von Chris erschienen ist, tut sich vielleicht noch was....hier der Link zum Artikel: http://www.elektor.de/jahrgang/2012/mai/audio-bootloader.2139052.lynkx
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: udoklein on Apr 28, 2012, 08:49 am
Am coolsten finde ich, dass es damit ja möglich sein sollte aus ein HEX eine WAV Datei zu generieren und dann von einem MP3 Player aus zu flashen. Hast Du schon mal ausprobiert ob das tatsächlich funktioniert?
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Apr 28, 2012, 03:50 pm
Hallo Uwe, nein das hab ich noch nicht probiert, ich möchte das wirklich erst ausprobieren, wenn auch andere Controller flashbar sind. Ich find das vieleicht noch raus. Ich hab den Artikel in der Elektor gelesen und dachte sofort daran, das mit preiswerten Controllern probieren zu wollen. Das ist dafür fast noch besser als der Weg über VUSB. Spannend ist es natürlich doppelt wenn beliebige Audioquellen (Kassette, mp3-Player, Smartphone, Radio) genommen werden können. Da der zu übertragende Code gerade bei Anfängern nicht sehr umfangreich ist, reichen auch langsamere Übertragungsraten. Hauptsache es läuft stabil, und kein Anfänger kann den Chip verfusen. Dass die Datenreduktion bei mp3-Playern zwangsläufig zu Übertragungsfehlern führen muss glaub ich nicht, weit auseinanderliegende Töne oder Tonfolgen sollten ja erhalten bleiben. Ganz heiß wird die Sache, wenn die Arduino IDE Audioflashen direkt unterstützten würde...
Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: udoklein on Apr 28, 2012, 04:08 pm
Aehm, wie kommst Du darauf, dass Audioflashen nicht geht? Avrdude kann doch eh fast alles nutzen. Zur Not muß er eben in eine Pipe statt eine serielle Schnittstelle schreiben. Die Gegenseite der Pipe wäre dann der besagte Audioflasher. Der einzige Schönheitsfehler wäre, dass der Flasher vor der IDE gestartet werden muesste. Könnte man aber durch ein Skript verstecken.
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Apr 30, 2012, 10:23 am
Hallo 25mmHg,

die Register im Atmeg8 sind leider teilweise anders benannt als beim Atmega168. Die Bits sind ebenfalls teilweise anders eingeteilt. Der Bootloader sollte auch auf dem Atmega8 laufen, wenn man die richtigen Register verwendet.
Ich habe früher vielfach für meine Experimente den Atmega8 verwendet, aber der Prozessor ist eigentlich abgekündigt, deshalb verwende ich fast nur noch die Atmega88/168/328 Typen.
Die Verwendung für das Pong-Spiel wäre natürlich ein Argument. Im Moment habe ich allerdings keine Zeit dafür, den Bootloader anzupassen.
Vielleicht kannst Du mal im mikrocontroller-Forum nachfragen, ob Dir jemand bei der Anpassung der Register hilft.

Beste Grüße,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Apr 30, 2012, 10:31 pm
Hallo Chris, erstmal Danke für die Antwort. Ich versuche mal, aus den Datenblättern der beiden Controller schlau zu werden. Ich bekomme nur (rote)Fehlermeldungen für ZEILE 319:
TCCR2B= _BV(CS21);
FEHLER:
../chAudioBoot.c:319: error: 'TCCR2B' undeclared (first use in this function)
Also such ich nach TCCR2B (TimerCounterCompareRegister?) Vielleicht ist es garnicht so schwer. Ich finde Deine Lösung mit der Manchestercodierung robuster als die SoundRX-Methode. Und da sie trotz geringem Aufwands keinen Abgleich braucht, ist sie auch wieder attraktiv für alle Anfänger...
Mal sehen ob es mir gelingt, die PingPong-Platine zum "Hören" zu bringen
Viele Grüße Johannes
(Wenn ich was raus hab, schreib ichs hier rein)
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 01, 2012, 12:11 am
Zwischenerfolgsmeldung beim Anpassen Audiobootloader: (Hab die Datenblätter verglichen)
Zeile 319(war für ATmega168):
TCCR2B= _BV(CS21);
Zeile 319(wird für ATmega8):
TCCR2= _BV(CS21);
Ergebnis: Keine rote Fehlermeldung mehr im AVR-Studio4, Build-Prozess abgeschlossen(4 gelbe Warnungen)
Vielleicht wars das schon :-)

Habe die Änderung auf diesen Quelltext angewandt: http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=127 (AudioBoot_V1_1.zip entpacken) Nur hier (und nicht im ElektorQuelltext!!!) stehen oben in der chAudioBoot.c die Verfahrenshinweise zum ATmega8. Folgende Zeile dort verstehe ich noch nicht: 5. BootresetvectorFuseBit enable Bootloader bzw. ich weiß nicht, wo ich diese Einstellung im AVR-Studio vornehmen kann. Und ich weiß ebenso noch nicht, ob die Fuses automatisch richtig gesetzt werden, oder ob ich das selbst machen muss.
Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 01, 2012, 12:44 pm
Und ich weiß ebenso noch nicht, ob die Fuses automatisch richtig gesetzt werden, oder ob ich das selbst machen muss.

Hallo Johannes,

die Fuses muss man in AVR-Studio selber setzen. Siehe die Bilder hier:

http://www.mikrocontroller.net/articles/AVR_Fuses
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 01, 2012, 07:31 pm
Danke Chris, hfuse=D8 und lfuse=E4 für den ATmega8 (int.Oszillator=8MHz, slow rising Power, no Brown out, SPI enable, BOOTSZ1=ON, BOOTSZ2=ON, BOOTRST=ON (Bootsize=1kword=2048byte, Resetvector zeigt auf Bootloaderadresse)
Der Linker im AVR-Studio (zu finden unter Project/Config.Options/CustomOptions/LinkerOptions) bekommt folgende Zeile übergeben: -Wl,--section-start=.text=0x1800
ging ganz leicht mit http://burn-o-mat.net/avr8_burn_o_mat_avrdude_gui_online.html

Ob die Programmierung statt mit wav auch mit mp3 möglich ist? (http://25mmhg.net/spektrum9.gif)
Im Bild der Spektralverlauf der letzten 4NF-Blöcke vom ElefantentrompetenCode. Das geht über die gesamte Audiobandbreite. Für mp3 sicher eine harte Nuss. Man erkennt eine Symmetrie um 11kHz (Man sieht dort übrigens auch ganz gut den letzten Piepton) Eventuell ist alles eine Frage der Geschwindigkeit. Auf jeden Fall Potential zum Forschen.
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 01, 2012, 07:50 pm
Ob die Programmierung statt mit wav auch mit mp3 möglich ist?

Vorstellen kann ich es mir nicht. Beim Audiobootloader kommt es auf jede Flanke an. MP3 unterteilt einen Wellenzug in einzelne Pakte und macht eine Spektralanalyse und danach durch die Bewertung mit einem "psychoaktustischen Hörmodell" eine verlustbehaftete Kompression. Für das Ohr hört sich das File gleich an, die Wellenzeuge sehen aber garantiert anders aus.
Das einfache Komprimieren mittels "zip" o.ä. dürfte da schon eher zum Erfolg führen, da im wav-File ziemlich viele gleiche Werte vorkommen und eine Redundanzkomprimierung dann einiges bringt.

Hier habe ich noch etwas Lustiges endeckt:
http://tadpol.org/projects/AvrianJump.html
Da hat einer eine minimalistische graphische Programmiersprache entwickelt, die direkt den Ton für den Audiobootloader erzeugt.

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 01, 2012, 10:16 pm
Hallo Chris, danke für den Link, ich werde mir das mal ansehen.
Habe vorhin noch die Frage mit dem BOOTRST beantworten können und es oben korrigiert (Aus D9 bei hfuse wird D8).
Das WAV-file hab ich mir mal in einem AudioEditor angeschaut. Deine Software liefert  Rechteckimpulse mit Vollaussteuerung (+1 und -1 kleinste Periode 4Samples=11025Hz), die von der Soundkarte dann verschliffen werden. Dabei kam die Frage auf, wie langsam kann man eigentlich übertragen? (Jaaaa der Anfänger schreibt eher kurze Programme und hat Zeit :-) wenn ich nun mit einem Audioeditor langsamer abspiele? Was passiert dann)
Im Elektor-Artikel steht, dass 8MHz und 16MHz funktionieren und die Taktfrequenz nicht sehr genau eingehalten werden muss.
Noch eine Frage:

Im HEX-file steht auf der letzten Zeile eine 1FF das macht dezimal 511. Ist das die Größe des Bootloaders in Worten? Dann könnte man beim ATmega8 auch eine Bootloadergröße von 512words=1Kbyte wählen? Im Elektor-Artikel stehen auch die 512Worte...Mit kbyte und kwords kann man ganz schön durcheinanderkommen. Noch dazu, wenn Im Windows-Dateisystem bei der Hex-Datei 2kbyte Größe angezeigt werden, was aber real weniger ist und eine Hex-Datei hat außerdem einen kleinen Verwaltungsdatenüberhang.

Somit gilt für den ATmega8 mit 512words großem Audiobootloader:
Die Fuses werden alle von Hand richtig gesetzt mit hfuse=DA und lfuse=E4
dadurch kommt der Bootloader automatisch auf die Startadresse in words 0xE00 und der Resetvector zeigt auf den Bootloader.
Dem Linker von AVR-Studio4 muß ich allerdings noch folgende Zeile übergeben (u.a. Startadresse für Bootloader in bytes):
-Wl,--section-start=.text=0x1C00
Und im Quellcode schreibe ich in Zeile 319: TCCR2= _BV(CS21);

Aber was weiter oben geschrieben steht ist nicht falsch! Da hat der Bootloader eben nur etwas mehr Platz...
Gruß Johannes (einen Sonnenbrand hab ich heute nicht bekommen aber ein bischen was verstanden)
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 02, 2012, 07:14 am
Halo Johannes,

jaja, das mit den Words und Bytes ist etwas verwirrend. Ich bin gespannt, ob es jetzt bei Dir klappt.
Ist der TX-Ausgang am Pongspiel noch frei? Soweit ich mich erinnern kann, habe ich diese Ausgang als Eingang für den Autiobootloader konfiguriert. Falls am Pong Spiel nur ein anderer Anschluss frei ist, müsstest Du das im Programm noch anpassen.

Bester Gruß,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 02, 2012, 11:22 pm
Hallo Chris, ich habe mir heute ein PingPongBoard genommen und mit einem AVRISPmkII ist es mir gelungen, den Bootloader zu flashen. Es gab eine Hürde: Die vielen LEDs! Am Anfang unerklärliche Übertragungsfehler und Abbrüche. Nach verzweifeltem Hin- und Herschalten des ISP-Clocks leuchteten auf einmal Streifenweise LEDs auf!!! So bin ich drauf gekommen, das Board nicht alleine mit dem AVRISPmkII zu  betreiben, sondern mit einem Labornetzteil 5V. Ohne die LEDs wäre es sicher auch ohne zusätzliche Spannungsquelle gegangen, aber in diesem Falle ist unbedingt eine autonome Versorgung des Boards nötig.

Das PingPongBoard hat nach  http://www.produktinfo.conrad.com/datenblaetter/900000-924999/902766-an-01-ml-CONRAD_RETRO_SPIEL_PING_PONG_de_en_fr_nl.pdf die folgenden PortPins frei nach draußen gelegt:
PC4 und PC5 (ATmega8) als C4, C5 (PingPong) und PD0 bis PD3 (Atmega8) als D0, D1, D2, D3 (PingPong)
Außerdem sind ADC6 und ADC7 für die Verwertung analoger Signale als P2 und P3 rausgeführt.
All diese PortPins sind völlig unbeschaltet und damit meiner Meinung nach wahlfrei verwendbar. K1 steht noch als GND und P1 als VCC zur Verfügung.

Ich habe mir überlegt, PC4 und PC5 für LEDs zu nutzen (Status und Test) und D0(RXD) als AUDIOIN zum Flashen. Spricht da irgendwas dagegen? Den Code kann ich sicher umschreiben. Das such ich mir zusammen. Aber eine Sache hat mich noch stutzig gemacht. Muß ich dem Bootloader noch irgendwo mitteilen, wie groß der FlashRom des Atmega8 ist?
Ganz unten in Deinem Code stehen folgende Zeilen (Vom pageweisen Speicheraufbau und vom Verhältnis FlashRom 4kwords (ATmega8) zu 8kwords (ATmega168) weiß ich):

case PROGCOMMAND:
       {
           // Atmega168 Pagesize=64 Worte=128 Byte
         uint16_t k;
         k=(((uint16_t)FrameData[PAGEINDEXHIGH])<<8 )+FrameData[PAGEINDEXLOW];
         boot_program_page (SPM_PAGESIZE*k, FrameData+DATAPAGESTART);   // erase and programm page
        }
       break;

Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: mmi on May 03, 2012, 04:02 am

Ohne die LEDs wäre es sicher auch ohne zusätzliche Spannungsquelle gegangen, aber in diesem Falle ist unbedingt eine autonome Versorgung des Boards nötig.

Die autonome Versorgung des Boards bzw. Prozessors ist bei Verwendung des AVRISP MKII grundsätzlich notwendig. Der AVRISP misst lediglich die von Dir angelegte Spannung, um sich z.B. auf einen 5V oder 3,3V Prozessortyp einstellen zu können. Wie sollte er es sonst auch automatisch erfahren können.

Gruß, mmi
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 05, 2012, 12:52 pm
Danke mmi, ich habe einen AVRISP-Clon (cc2AVRprog), und der hatte zumindest die Möglichkeit das VCC-Pin zu versorgen. (sonst hätten nicht 40 LEDs aufgeflackert) aber gereicht hat das eben trotzdem nicht, wahrscheinlich reichte der Speisestrom nicht und es gab Betriebsspannungseinbrüche.
Mit Netzteil klappt das Flashen sicher. Ich hab mir eine Adapterplatine auf einen D-SUB15Stecker gebaut. Mit den verfügbaren Leitungen drauf. So kann ich irgendwelche BE gleich auf eine SUB-D15Buchse löten und rumexperimentieren. Einen Resetschalter braucht man beim PingPongBoard nicht, da GND und RESET sich auf dem ISP-Steckverbinder (den man hier selber bestücken muss) gegenüber befinden, so dass ein einfacher Jumper ausreicht.
Hier noch ein Link für alle die einen echten AVRISPmkII haben und ihr Target trotzdem speisen wollen: http://www.youtube.com/watch?v=ICQXqVy3Hpc
Viele Grüße Johannes

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 05, 2012, 01:13 pm
Hallo Chris, jetzt gibt es in Bezug auf Audiobootloader und PingPongBoard folgenden Stand. Der Bootloader lässt sich auf den ATmega8 überspielen, die geänderten Pinbelegungen sind mit eingeflossen. Nach einem RESET blinkt die StatusLED langsam, und auf dem AudioINPUT werden Daten von der Soundkarte empfangen. Allerdings scheint trotzdem etwas nicht zu klappen:

1.) Das Blinken geht ewig, und hört nie nach 6s auf (vielleicht weil kein Code im Flash vorhanden ist, der angesprungen werden kann?)
update: Ich habe gerade mein Testprogramm mit dem AVRISPmkII geflasht und danach ohne Chip-erase den Audiobootloader drauf. Jetzt wird nach 6s pünktlich zum Testprogramm gesprungen
2.) Ich schaffe es, Programmierfehler auszulösen, die durch schnelles Blinken der StatusLED angezeigt werden, wenn ich den Audiopegel voll aufdrehe
3.) Wenn ich den Pegel des Audioausgangs vom Laptop etwas zurückdrehe finde ich einen Bereich, in dem die StatusLED zu einem Dauerleuchten übergeht, aber zur Ausführung meines Testprogramms gelange ich nicht.

Ich habe auch mal einen 10nF Kondensator in der Audioleitung versucht, ohne Verbesserung.
Jetzt will ich erstmal das RESET-Pin mit einem externen Pull-UP versehen
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 05, 2012, 02:59 pm
Hallo Johannes,

100nF für den Wert des Koppelkondensators sind besser.

Ich vermute, dass das Problem wo anders liegt: Der Atmega8 hat eine Pagesize von 64 Byte und der Atmega168 hat eine Pagesize von 128 Byte.
Beim Audiobootloader werden immer 128 Byte an Daten übertragen und dann dem Mikrocontroller etwas Zeit gegeben, eine Page zu "flashen".
Eine Umgehungslösung für den Atmega8 könnte sein, auch 128 Bytes zu empfangen und dann einfach 2 aufeinander folgende 64 Byte Pages zu flashen.
Sonst müsste man auch das Java Programm ändern und dort die Datengröße auf 64 Byte umstellen und den Bootloader für den Atemga8 ändern, was etwas aufwändig wäre.

Bester Gruß,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 05, 2012, 05:22 pm
Hallo Chris, einmal könnt ich es ja mal machen...Ich fange also an, das Audio-file zu zerschneiden...Hoffentlich habe ich ein kurzes Testprogramm.
(Schneiden kann ich ja - Aber den Bootloader umstricken sicher nicht)
Aber dann wird es jetzt richtig spannend.
Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 06, 2012, 04:20 pm
Quote
Hallo Chris, einmal könnt ich es ja mal machen...Ich fange also an, das Audio-file zu zerschneiden...Hoffentlich habe ich ein kurzes Testprogramm.


Schneiden? Ich glaube, das dürfte nichts bringen. Ausser Dein Programm ist 64 Byte lang.


Du könntest für die Pages verantwortliche Stelle im Programm modifizieren. Das hier schreibe ich jetzt einfach mal hin, ohne es getestet zu haben:

relativ weit oben im Programm
// fuer Atmega8
#define PAGESIZE 64 // Pagesize for Atmega8
#define FRAMESIZE       (PAGESIZE*2+DATAPAGESTART)// framsize still 128 byte


Weiter unten:

case PROGCOMMAND:
        {
            // Atmega168 Pagesize=64 Worte=128 Byte
            // Atmega8 Pagesize=32 Worte=64 Byte

         uint16_t k;
         k=(((uint16_t)FrameData[PAGEINDEXHIGH])<<8 )+FrameData[PAGEINDEXLOW];
         boot_program_page (SPM_PAGESIZE*k*2, FrameData+DATAPAGESTART);   // erste 64 byte des Datenframes
         boot_program_page (SPM_PAGESIZE*k*2+1, FrameData+SPM_PAGESIZE+DATAPAGESTART);   // zweite 64 Byte des Datenframes

         }
        break;


Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 08, 2012, 11:16 pm
Danke Chris für diesen Vorschlag. Erfolg hatte ich noch nicht. (Irgendwas scheint noch nicht aufzugehen) Bin gerade dabei, mich durch den Audiobootloader und die boot.h zu wühlen. Eine mail an elo bzw. B. Kainka hab ich geschrieben, weil die ja das PingPongBoard entwickelt haben. Auch dort stieß der Audiobootloader auf großes Interesse. Wenns was neues gibt, melde ich mich wieder. (6Schreibmaschinenseiten++ zu verstehen dauert sicher eine Weile...und Zeit hab ich nur spät abends)
Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 12, 2012, 10:59 am
Hallo Johannes,

jetzt habe ich doch ein wenig Zeit investiert und den Audiobootloader für das PingPong Game zum laufen gebracht:
http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=127&p=542#p542
Als Eingang habe PD1 verwendet. Die Widerstände muss man bei meinem Ping Pong Game auf 1.4V Mittelspannung bei 5V Versorgung anpassen. Eventuell wäre es hier am besten ein Poti zu verwenden.

Da die Sourcen im Moment noch etwas Spaghetti Code sind, habe ich erst mal nur die HEX-Files gepostet.

Bester Gruß,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 13, 2012, 06:56 am
Gerade eben habe ich noch einen Fehler gefunden: bei manchen Rechnern ist das Audiosignal invertiert. Da scheint es wohl keine eindeutige Norm zu geben oder die Hersteller halten sich nicht daran. Im Moment funktioniert der Audiobootloader nur mit einer Polarität.
Ich überlege noch, wie ich das Problem lösen könnte:

1. Java Programm mit Polaritätsknopf versehen ( unschön, weil man dann den Knopf richtig betätigen muss )
2. MC-Programm auf automatische Polaritätserkennung anpassen ( ziemlich aufwendig )

Im Anhang noch ein kleines Demoprogramm für's Ping Pong.

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 17, 2012, 12:25 am
Hallo Chris, vielen Dank für Deine Forschungsarbeit. Ich hätte noch eine Idee, wie man die Sache mit der falsch gepolten Soundkarte lösen kann: eine etwas andere Codierung. Fündig bin ich beim differentiellen Manchester Code geworden. http://www.staff.hs-mittweida.de/~win/vorlesungen/Grundlagen_KT_4.pdf Hier ist auf Seite 21 etwas mehr über das Prinzip zu erfahren. Dieser Code ist ebenfalls über Koppelkondensatoren und Übertrager transportierbar und nutzt Flanken egal welcher Richtung zur Codierung der NULL beim Taktwechsel. Bei der Codierung der EINS wird zum Taktwechsel einfach der Pegel beibehalten. In der Taktmitte wechselt der Signalpegel immer, damit aus dem Signal der Takt rückgewonnen werden kann. Somit ist dieser Code resistent gegen Vertauschung der Signaladern eines Kabels.
Soweit erstmal die Idee von mir.
Ich probier das mit der anderen Phase aber erstmal mit dem PingPongBoard aus.
Was musstest Du sonst noch im Code anpassen?


Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 20, 2012, 09:57 am
Hallo Johannes,

das mit dem differentiellen Manchestercode ist auf jeden Fall eine sehr gute Idee, das Problem zu lösen. Allerdings würde der Umbau einiges an Arbeit erfordern.
Für die invertierten Signale habe ich einfach das Java-Programm neu compiliert. Ich musste nur ein Flag umstellen, da das Programm ohnehin schon für invertierte Signal vorbereitet ist. Jetzt gibt es zwei Programme, eines für invertierende und ein anderes für nicht invertierende Soundkarten.
Damit das Ganze für den Atmega8 funktioniert, musste ich auch die Pause zwischen den einzelnen Frames von 10ms auf 20ms umstellen, da die Flash-Routine im Bootloader für den Atmega8 zweimal pro Frame aufgerufen wird und damit doppelt so viel Zeit braucht.
Als Anzeige für den Bootloadervorgang habe ich direkt die LEDs des Ping-Pong benutzt. Dort wird während des Bootens auch der aktuelle Frame als Binärzahl angezeigt.

Läuft der Bootloader bei Dir?

Gruß,
Christoph
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 22, 2012, 08:20 pm
Hallo Chris, seh mir gerade Deinen Quellcode an. Hab eben erst entdeckt, dass Du ganz viel dran gemacht hast. Schön, dass der ATmega8 jetzt voll mit eingebunden ist. Und ganz großes (Mäuse)Kino. Morgen mach ich die Elektronik-AG, und da werd ich das nicht nur alleine bestaunen. Und ich hoffe ein paar PingPongBoardBesitzer lesen hier mit!!! Gut finde ich (wenn ichs richtig erkannt habe), dass Du auch an den Batterieverbrauch gedacht hast und den Spannungsteiler auf ein PortPin gelegt hast und somit stromlos schaltest, wenn er sein Werk getan hat.
SOMIT HABEN WIR JETZT EIN PINGPONGBOARD mit 120 LEDs(manche haben nur 5€ dafür bezahlt), WAS AN DER BATTERIE BLEIBEN KANN UND MIT EINEM KLEINEN KLINKENKABEL PROGRAMMIERBAR IST S-U-P-E-R-G-E-N-I-A-L

Johannes .-)=

Nachtrag: Ich sehe die Matrix!!! Ich habe mir den Quellcode von Dir nochmal neu compiliert, weil ich meinen Adapter nicht umbauen wollte. (Bei mir ist also PD0 AudioInput. Ich habe 10k+10k+100n als Anpassungsnetzwerk. Das Hochzählen vom Bootloader ist eine mittelgute Hilfe, wenn man den Audiopegel einstellen will. Ich habe jedenfalls nicht den vollen Pegel der Netbooksoundkarte benötigt. Was hältst Du eigentlich davon, wenn man beim PingPongBoard (Das hat genug) zur Audiopegelkontrolle zwei benachbarte LEDs mitlaufen lässt, eine für HIGH und eine für LOW. Man könnte die Umschaltschwelle sehen und wenn beide LEDs gleich hell leuchten müssten sich die Zeiten für LOW und HIGH gleichen. Und das wäre dann der optimal eingestellte Manchestercode (DC-neutral). Ich vermute aber, dass das einen Interrupt kostet, weil ja die Routine beim Frameempfang ganz schön hin und her hopst.

Und ich habe was gefunden (Hab also wirklich den Code durchgelesen): Der HIGHFuse Wert 0xD8 wird zumindest auch als 0xDA akzeptiert. Und 0xDA und müsste nach meiner Rechnung für 1Kbyte Bootloadergröße auch stimmen.
Außerdem müssen die Bits BOOTSz1u0 anders gesetzt werden bei 1Kbyte Bootloadergröße:
ATMEGA8 (1Kbyte bootloader) Fuses: BOOTSz1=0(x); BOOTSz0=1(o); Linker: -Wl,--section-start=.text=0x1c00

Fuses for PingPong, Atmega8:
HIGH:0xDA
LOW:0xE4
LOCK:0xCF

Also wieder die Verwirrung von Wort und Byte...
Und hier die Käferecke:
Habe bei Berechnung der FRAMESIZE was gefunden. (hebt sich aber beim Compilieren auf)
Und von Zeile 399 bis Zeile 423 und Zeile 424 bis Zeile 448 wiederholt sich exakt der gleiche Code einmal für ATmega168 und ATmega8.
Dort kann man bestimmt die Hälfte streichen und die #ifdefs wegnehmen.

Also Chris, ich bastel morgen noch ein bischen weiter ... einen RESET-Taster den ich auf den ISP-stecken kann und gehöre aber jetzt ins Bett.
Danke für die tolle Idee.
Bis bald.
Herzliche Grüße Johannes (nochmal editiert am 23.5.19:00)

(Seit heute nachmittag läut das Flashen sehr stabil und reproduzierbar. Frühere Fehlversuche gehen auf eine nicht straff sitzende Masseverbindung beim Audio-Cinchkabel zurück. Hier hätte also eine Pegelkontrolle per LED-vergleich Punkte gesammelt. Ich habs auf dem Oszilloskop gesehen. Mit straff sitzender MAsse keinen eintzigen Fehlversuch mehr! Meine Soundkarte benötigt jetzt nur ca. 50% Maximalpegel um sicher über die LOWHIGH-Hürde zu springen (knapp 3,5V Spitze-Spitze). Ich habe noch einen Anschluss fürs Oszilloskop und den Reset-Taster vorgesehen und freue mich immernoch, dass alles so gut funktioniert. Ein Poti hab ich erstmal nicht benötigt )
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 23, 2012, 08:02 pm
Hallo Johannes,

es freut mich seht, dass der Bootloader bei Dir jetzt stabil läuft.  XD
Bei mir läuft er auch sehr stabil und man benötigt tatsächlich kein Programmiergerät mehr. Nur das Original Ping-Pong läuft nicht, weil es wohl nicht in die verbleibenden 7KFlash passt.

Das mit dem Pegel hatte ich mir auch schon überlegt. Allerdings ist der Bootloader ja für einen Digitaleingang gemacht. Da kann man nur zwischen low- und high unterscheiden. Um den Pegel wirklich zu messen, müsste man einen ADC-Pin verwenden und zusätzlich einen ADC-Treiber einbauen.

Welche Spannung musstest Du als Mittenspannung einstellen? Welches Widerstandsverhältnis hast Du gewählt? Bei meinem Ping-Pong ist es wie weiter oben beschrieben bei 1.4V bei 5V Versorgung.

Programmieren Deine Schüler auch in C?

Bester Gruß,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 23, 2012, 09:18 pm
Hallo Chris, das ist es ja! ich habe orginal 10k+10k drin angekoppelt mit 100n und ich musste nichts nachstellen.
Was die AG betrifft: Sie ist eine sehr kleine AG, aber dafür sinds sehr zuverlässige Leute. (Im Kern sind wir zu dritt und 40+Jahre alt) Und seit ein paar Monaten dreht sich fast alles um C und um den Arduino, mit dem alles angefangen hat. Aber nun wollen wir halt näher an die Hardware ran. Wir haben heute die ganzen 12Seiten Quelltext ausgedruckt und auf den Tisch gelegt...
Also nun noch mal zu meiner Idee:
Auf dem Oszilloskop hab ich gut sehen können, was passiert, wenn RESET gedrückt wird. Am AudioPin fällt die Spannung auf den halben Wert und nach Start der Übertagung wird der Spannungsraum zwischen GND und VCC zu gut 75% mit der codierten NF ausgefüllt. Ich habe übrigens immer auf dem zweiten Audiokanal einen kleinen Kontrollautsprecher(aktiv) mitlaufen.
Wenn der Audiopegel in pos. Richtung VCC übersteigt entstehen Verzerrungen und die Übertragung wird fehlerhaft. Irgendwann müssen doch auch die internen ESD-Schutzdioden anfangen zu leiten (so es welche gibt) . Vielleicht bringt ja auch ein Serienwiderstand ca. 0,5-1Kohm noch eine Verbesserrung. Aber nun endlich die Idee:
Ich stelle mir ein "etwas" vor, das den Tatsächlichen Wert des PIND1 Registers (bei mir PIND0) auf zwei LEDs mappt. und zwar so: LED1= PIND0; LED2= ~(PIND0); So kann man sehen welchen Wert PIND0 gerade hat und kann vor allem beurteilen, ob PIND0 genauso oft HIGH ist wie LOW. Wenn also der BIAS zu tief eingestellt ist, wird LED2 dauernd oder heller leuchten. Wenn er zu hoch eingestellt ist, leuchtet LED1 dauernd oder heller. Wenn eine Übertragung stattfindet und beide LEDs leuchten gleich hell, dann zeigt das an, das der BIAS ungefähr in der optimalen Mitte liegt. Man müsste zur Feinabstimmung mit dem Potischleifer hin und herpendeln und dann den Mittelwert der beiden Extrempunkte abschätzen (Lineares Poti Voraussetzung) Das geht aber nur mit zwei LEDs, da man mit einer LED zwar den momentanen Wert von PIND0 sehen könnte, aber eben nicht vergleichen kann, ob sie genausolange an wie aus ist. Zumindest eben sollte man mit den LEDs die Umschaltpunkte der Eingangslogik besser auffinden können. Beim Übertragen von Code sieht man dann auch, ob der AudioPegel ausreicht, den Digitaleingang zum Kippen zu bringen. Also benötigen wir keinen ADU
Weißt Du wie ich das meine?
Ich hab halt Vorstellungen im Kopf aber bin meilenweit davon entfernt, daraus C-Code zu formulieren.  Ich denke nur, dass vielleicht ein PIN-change Interrupt weiterhelfen könnte, aber damit schränkt man die zur Verfügung stehenden PINs gewaltig ein. Die andere Lösung wäre an jeder Flankenabfrage den Anzeige-Code dranzuhängen oder eine Flankenabfragefunktion zu bauen, die beim Frameempfang an allen Abfragepunkten immer wieder aufgerufen wird und die die LED-Ansteuerung zusätzlich mit übernimmt. Und dann kann man sich ja für zwei benachbarte LEDs auf dem PingPongBoard entscheiden. Das mit dem Fortschrittsbalken beim Frameempfang wie jetzt schon eingebaut find ich schon Spitze.

Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 25, 2012, 10:52 pm
Hallo Chris, hier schon mal mein Vorschlag, wie ich zwei LEDs ansteuern würde statt vorher eine.
Code: [Select]
#ifdef PINGPONG_PLATTFORM

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdbool.h>
#include <avr/boot.h>

// use RxD ( PD0 ) as audio input and PD2 as PWRGND for Poti
#define INPUTAUDIOPIN     (1<<PD0)
//#define PINVALUE             (PIND&INPUTAUDIOPIN)                                                   //ch_alt durch nächste Zeile ersetzt
#define PINVALUE            pinRead()                                                                        //jf_neu
#define POTIGNDPIN          (1<<PD2)                                                                         //jf_definition GND-Pin Spannungsteiler

// turn on pull up and power on Poti
#define INITPORT              {PORTD|=INPUTAUDIOPIN; DDRD |=POTIGNDPIN;}                    //set Poti GND and set PullUp

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

// ping pong led definitions
#define LEDPORT      (1<<PB0|1<<PB1)                  //jf_geändert jetzt SOLLEN zwei LEDS angesteuert werden KLAPPT ABER NOCH NICHT!!!
#define INITLED     {DDRB|=0x3; DDRC|=0x0F; DDRD|=0xF0;}

#define LEDHIGH               {PORTB|=1<<PB1; PORTB&=~(1<<PB0);}                                 //jf_neu SIGNAL FÜR AUDIOPIN IST HIGH KLAPPT!
#define LEDLOW                {PORTB|=1<<PB0; PORTB&=~(1<<PB1);}                                 //jf_neu SIGNAL FÜR AUDIOPIN IST LOW KLAPPT!
#define LEDON                 {PORTB|=LEDPORT;}                                                           // wie bisher, nur mit beiden LEDs
#define LEDOFF                {PORTB&=~LEDPORT;}                                                         // wie bisher, nur mit beiden LEDs
#define TOGGLELED             {PORTB^=LEDPORT;}                                                           // wie bisher, nur mit beiden LEDs

Es fehlt jetzt nur noch der Code, der LEDLOW und LEDHIGH aufruft
Dazu muss ich sicher diesen Ausdruck ersetzten und hier meine gewünschte Funktion einbauen:
Code: [Select]
#define PINVALUE (PIND&INPUTAUDIOPIN)
Ich ersetzte und rufe somit pinRead() auf. pinRead liefert (PIND&INPUTAUDIOPIN) zurück
Code: [Select]
#define PINVALUE pinRead()                                                                        

uint8_t pinRead()
{
if (PIND&INPUTAUDIOPIN) LEDHIGH                                                                              // AUDIOPIN IST HIGH
              else LEDLOW                                                                                   // AUDIOPIN IST LOW
return (PIND&INPUTAUDIOPIN);                                                                                 // Wert des ursprünglichen Ausdrucks zurückgeben
}


Also der Trick ist, dass 2LEDs nun 4 verschiedene Zustände anzeigen können:
1. Beide LEDs an hieß vorher LEDON
2. Beide LEDs aus hieß vorher LEDOFF
3. Die eine LED an     --> Logischer Pegel am INPUTAUDIOPIN HIGH (neu)
4. Die andere LED an  --> Logischer Pegel am INPUTAUDIOPIN LOW  (neu)
In der Hoffnung, dass ich mich nicht im Wald der Makros verlaufen habe...
Gruß Johannes

OK also Nachtrag: Es geht! Allerdings leuchten nach RESET nicht beide LEDs an PB0 und PB1 gleichzeitig auf, wie ich es eigentlich erwarten würde. Fehler hab ich noch nicht gefunden.
Aber beim Code via Audio übertragen kann man nun sehr schön sehen, wann das erste mal beim Lauterdrehen HIGH-Pegel erreicht wird. Dann stoppt erstmal der Bootloader in irgend einer Schleife und wartet auf gültige Fortsetzung des Übertragungsvorgangs, weil möglicherweise noch nicht alle HIGHs angekommen sind, Aber wenn ich dann den Audiopegel noch ein kleines Stück anhebe, und danach nochmal den Play-Button beim JavaTool betätige wird die Übertragung sogar sauber fortgesetzt und der Code dann im 2. Anlauf vollständig übertragen. Man braucht also nichtmal RESET zu drücken. Wenn ich den Audiopegel nun so eingestellt lasse, dann klappt es ab dieser Einstellung (ca. 40% Pegel) immer mit einem vollständigen Übertragungszyklus nach RESET !!! Es klappt sogar bis Maximalpegel!!!

Bin sehr zufrieden damit. Denke zwei LEDs statt einer sind besser.
Vielleicht könntest Du dir meine Codeänderung mal ansehen. Vielleicht kann man es noch eleganter lösen.
Also wenn Du den Code haben willst bitte melden.

Viele Grüße von Johannes

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 27, 2012, 11:09 am
Hallo alle zusammen, hier nur eine kurze Info zum aktuellsten Audiobootloader V3 von Chris: Die Frage, ob mp3-codierte Audiodaten zur Codeübertragung taugen hab ich beantwortet. Grundsätzlich ist es möglich, mit mp3 Code zu übertragen. Ich habe das file "dieMatrixInterrupt.hex" mit dem JavaTool durch Abspielen in die test.wav (349Kbyte) umgewandelt. Dann habe ich in einem Audioeditor (SAMPLITUDE) ein Resampling als Offlineeffekt auf 50% (eine Oktave tiefer) angewendet. Der Effekt ist, dass die test.wav nun so klingt, als würde sie mit halber Bandgeschwindigkeit abgespielt werden (Solche Experimente kennen bestimmt noch die Leute, deren Eltern ein Tonbandgerät besaßen) Danach habe ich die Datei ins mp3-Format konvertiert. Bei 128kbit mono und 320kbit stereo hatte ich Erfolg. Der Audiobootloader hat bis zum Schluss des Abspielens alle Pages akzeptiert. Das PingPongBoard hat danach die Matrix angezeigt. Bei anderen Bitraten des mp3-files gab es teilweise vorzeitige Abbrüche.

DAmit haben wir mal wieder aller Theorie ein Schnippchen geschlagen
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on May 28, 2012, 09:06 pm
Hallo Leute, ich habe in V3 folgende Zeilen etwas abgeändert und nun klappt es mit der gewünschten Anzeige: Es sieht nun so aus, dass am Anfang 2 LEDs leuchten. Wenn im Flash kein ausführbarer Code ab 0x0000 liegt, dann wird die LED an PC0 nach 6Sekunden kurz verlöschen und der Wartezyklus beginnt von vorn. Die LEDs an PB1 und PB0 signalisieren den Logischen Pegel an PD0 während jeder Abfrage duch den bootloader. Das funktioniert quasi in Echtzeit. PB0 steht für HIGH und PB1 für LOW. Bei mir ist zum Beispiel der anfangs erkannte Pegel (mit 2x10kOhm) immer HIGH. Wenn der Ausgangspegel der Soundkarte groß genug ist, sieht man zusätzlich zur HIGH-LED noch die LOW-LED aufflackern. Meistens muss man noch etwas den Audiopegel erhöhen, damit eine gültige Übertragung zustande kommt. Bei Übertragungsfehlern flackern die HIGH- und die LOW-LED gleichzeitig schnell auf. Das ist deutlich zu erkennen. Ich finde, dass man damit ausgesprochen gut arbeiten kann. Übrigens gibt es hier eine sehr gelungene Laufschrift für das PingPongBoard http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/laufschrift (http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/laufschrift) Damit kann man sich einen schönen Text bauen, der nach dem Bootloader angezeigt wird BEISPIEL: + + + das Ping Pong Board wartet auf ein Audiosignal an Pin D0 + + + bitte Reset drücken und innerhalb von 6Sekunden mit der Wiedergabe beginnen + + + Somit weiß der Anwender gleich was er zu tun hat.

Hier die geänderten Zeilen im AudioBootloader von Christoph Haberer:
Code: [Select]

#ifdef PINGPONG_PLATTFORM

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include <stdbool.h>
#include <avr/boot.h>

// use RxD ( PD0 ) as audio input and PD2 as PWRGND for Poti
#define INPUTAUDIOPIN (1<<PD0)
//#define PINVALUE (PIND&INPUTAUDIOPIN) //is now pinRead() look at line 195
#define PINVALUE pinRead()
#define POTIGNDPIN (1<<PD2)

// turn on pull up and power on Poti
#define INITPORT {PORTD|=INPUTAUDIOPIN; DDRD |=POTIGNDPIN;} //set Poti GND and set PullUp


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

// ping pong led definitions
#define LEDPORT ((1<<PB0)|(1<<PB1)) //now 2LEDs
#define INITLED {DDRB|=0x3; DDRC|=0x0F; DDRD|=0xF0;}

#define LEDHIGH {PORTB|=(1<<PB0); PORTB&=~(1<<PB1);} //now HIGH-Level on INPUTAUDIOPIN
#define LEDLOW {PORTB|=(1<<PB1); PORTB&=~(1<<PB0);} //now LOW-Level on INPUTAUDIOPIN
#define LEDON {PORTB|= LEDPORT;}
#define LEDOFF {PORTB&=~LEDPORT;}
//#define TOGGLELED {PORTB^=LEDPORT;} //old
#define TOGGLELED {if(PORTB&LEDPORT)LEDOFF else LEDON} //now 2 LEDs ready for Toggeling

#define LATCHCLKPIN (1<<PB2)
#define SDATAPIN (1<<PB4)
#define RCLKPIN (1<<PB3)

#define LATCHCLK {PORTB|=LATCHCLKPIN;}
#define SDATA {PORTB|=SDATAPIN;}
#define RCLK {PORTB|=RCLKPIN;}
#define SETDATA (PORTB|SDATA)

#define RESETALL {PORTB&=~(SDATAPIN|RCLKPIN|LATCHCLKPIN);}
#define INITLATCH {DDRB|=(SDATAPIN|RCLKPIN|LATCHCLKPIN);}

uint8_t pinRead()
{
if (PIND&INPUTAUDIOPIN) LEDHIGH else LEDLOW
return (PIND&INPUTAUDIOPIN); //now returns the same as the code on line 161
}

void setSpalte(uint8_t k)
{
uint8_t value;
value=PORTC;
value&=~0x0F;
value|=k&0x0F;
PORTC=value;

value=PORTD;
value&=~0xF0;
value|=k&0xF0;
PORTD=value;
}

/****************************************************************************************

void SetExternalPortByte(uint8_t port,uint8_t data)

Move data to external shift register.

common pins: data, latchout
single pin: shift register clock

22.12.2007 ch

****************************************************************************************/
void setExternalPort(uint16_t data)
{
uint8_t i;

RESETALL;

data=~data;

for (i=0; i<12; i++)
{
  if(data & (1<<11)) SDATA;

  RCLK;
data= data << 1;

RESETALL;
}
LATCHCLK; // clock all latches data to output
RESETALL;
}

int main()
{
INITLED;
INITLATCH;
INITPORT;
setExternalPort(1);
a_main(); // start the main function
}

#endif


Über Erfahrungsberichte würde ich mich sehr freuen. Wie man sehen kann musste ich nicht sehr viel verändern. Chris, der Code ist eine feine Sache und ich bin froh, dass Du das PingPongBoard eingebunden hast.
Viele letzte Pfingstgrüße von Johannes
P.S.
Als besten Wert für die per Spannungsteiler eingestellte Vorspannung habe ich bei 4,5V Betriebsspannung 1,1V an PD0 gefunden.
Damit reichen bei mir 20% Lautstärke am Netbook für eine ordentliche Übertragung. Wenn man kein Poti da hat, dann tuen es auch 10k im oberen Zweig und 3k3 im unteren Zweig des Spannungsteilers.
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on May 30, 2012, 07:00 am
Hallo Johannes,

Quote
Die Frage, ob mp3-codierte Audiodaten zur Codeübertragung taugen hab ich beantwortet. Grundsätzlich ist es möglich, mit mp3 Code zu übertragen.


Das ist ja sehr interessant. Hätte ich nicht gedacht. Könntest Du mal ein Demo mp3 posten? Wir können sozusagen "geheime Botschaften" via mp3 austauschen :D

Ich habe meinen Display Treiber in C Online gestellt. Damit kann man die LEDs in zwei verschiedenen Helligkeiten ansteuern.

http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=136

Beste Grüße,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 04, 2012, 12:08 am
Hallo Chris, ich stell jetzt mal ein paar relevante files hier rein.
1. ein Vergleich von wav und mp3-datei im Audioeditor samplegenau übereinandergestellt in 2Spuren. Man sieht genau das Verhalten beider Wellenformen zueinander. Beide sind durch Resampling auf halbe Geschwindigkeit gedrosselt worden. (edit: man sieht links unten, dass das mp3-Objekt im Editor invertiert wurde, so habe ich beide Wellen voneinander nur zum Anhören subtrahiert, um die Differenz von wav zu erzeugter mp3 beurteilen zu können - es bleibt immer etwas Hörbares übrig - die Darstellung der Wellen bleibt aber phasenrichtig) Das mp3 wurde aus dem darüberliegenden wav erzeugt. Hier ein Link zum Audioeditor Magix Samplitude http://soundcloud.com/apps/samplitude-soundcloud (http://soundcloud.com/apps/samplitude-soundcloud) und hier der Screenshot mit wav oben und mp3 unten:
(http://25mmhg.net/public/AudioeditorVERGLEICH_wav_mp3.jpg)
Hier noch ein weiterer Screenshot als Link vom Ende eines Blocks: http://25mmhg.net/public/AudioeditorVERGLEICH2_wav_mp3.jpg (http://25mmhg.net/public/AudioeditorVERGLEICH2_wav_mp3.jpg)
2. Außerdem möchte ich jetzt noch ein mp3-file reinstellen, dass folgendes enthält: 1.MatrixInt(tempo50%); 2.Zebra(tempo50%); 3.Zebra(tempo100%) Die beiden ersten Teile flashen erfolgreich den ATmega8, der letzte Teil (100%) nicht:
http://25mmhg.net/public/1MatrixIntSLOW_2ZebraSLOW_3ZebraFAST_128m.mp3 (http://25mmhg.net/public/1MatrixIntSLOW_2ZebraSLOW_3ZebraFAST_128m.mp3)
Es scheint also so zu sein, dass bei nicht voller Ausnutzung der Audiobandbreite eine Codeübertragung via mp3 möglich ist. Hier ist natürlich von Vorteil, dass Dein AudioBootloader auch Datenströme in halber Geschwindigkeit toleriert. Also gilt das hier gesagte erstmal nur für ATmegas, die mit 8MHz getaktet werden, wie das beim PingPongBoard der Fall ist.
3. Zuletzt noch Dein Quelltext mit meiner LevelCheck-Ergänzung komplett als Zip:
http://25mmhg.net/public/AudioBootLevelCheck131.zip (http://25mmhg.net/public/AudioBootLevelCheck131.zip)
Bitte beachten, dass hier PD0 der Audioinput ist.
Ich habe übrigens auch das orginal Pong-Spiel was bei V3 mit im Paket ist erfolgreich mit diesem Audiobootloader hochgeladen!
Am Mi haben wir in der AG noch ein komplettes Pong-Spiel umgerüstet. Wir haben gleich das linke Potentiometer verwendet mit 1k vom Schleifer nach "D0" und 100n in der Audiozuleitung. (Dieser Aufbau scheint mir der Beste, den 1k Widerstand benötigt man nur als Sicherheitswiderstand, falls D0 in der hochgeladenen Anwendung ein Ausgang sein soll und das Poti auf Anschlag gestellt wird) Die Umschaltschwelle des PortPins lässt sich sehr einfach auffinden. Mit meinem Netbook konnten wir auf Anhieb erfolgreich übertragen.

Viele Grüße Johannes

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 04, 2012, 06:10 pm
Hallo Chris, etwas möchte ich noch nachtragen. Die aufgezeichneten mp3-Sequenzen zeigen auch sehr deutlich, dass das Hochladen recht schnell geht. Meine Vermutung ist, dass mp3 immer besser geht, je tiefer man mit der Übertragungsfrequenz geht. Außerdem wäre es super, wenn der Bootloader verpolungsresistent wäre.....aber das ist vielleicht eher was für nasskaltes Novemberwetter. Meine mp3-files sind 128Kbit mono encodiert. Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Jun 04, 2012, 07:08 pm
Hallo Johannes,

gerade eben habe ich Dein MP3 probiert. Es ging nicht. Doch dann kam meine Erinnerung zurück: mein Internetcomputer hat die verkehrte Polung des Audio-Signals.
Dann habe ich das MP3 auf meinem anderen Computer ausprobiert. Und siehe da: es geht. Das Zebra ist erschienen ;-). Sieht ganz nett aus.

Und so hast Du wohl recht: Das mit der Verpolungssicherheit sollte angepasst werden.

Gruß,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 05, 2012, 12:48 am
Hallo Chris, freut mich, dass das mit dem mp3 auch bei Dir geklappt hat. Der Displaytreiber gefällt mir auch. Ich hab zwischen den Frames 40ms Delay eingebaut, d.h. er kann auch noch ein ganzes Stück schneller...Und sag mal, wie Du das mit der Pegelkontrolle findest. Hast Du das schon mal ausprobiert? Ich hab mir auch mal überlegt, ob der AVR sich nicht auch den Bias selber einstellen könnte. Dazu bräuchte man sowas: http://www.dz863.com/drawsch_3713.html (http://www.dz863.com/drawsch_3713.html) Ich glaub, Du kannst die Schaltung auch editieren.

Viele Grüße Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Jun 06, 2012, 07:40 am
Quote
Ich hab mir auch mal überlegt, ob der AVR sich nicht auch den Bias selber einstellen könnte


Hallo Johannes,

genau die gleiche Schaltung hatte ich mir auch schon überlegt. Ich habe sie dann wieder verworfen, weil man einen zusätzlichen Anschluss verwenden müsste. Im Moment ist der Bootloader auch fast schon an der 1K Grenze angelangt und auf 2K würde ich beim Atmega8 nicht gehen.
Die Atmegas haben auch Komparator-Eingänge, die man verwenden könnte. Aber auch dort wollte ich die Festlegung auf einen speziellen Pin vermeiden.

Mit einigem Zeitaufwand habe ich die differentielle Manchestercodierung implementiert ( zu finden wie üblich ). Jetzt funktioniert die Übertragung an jedem Computer. Ebenfalls gibt es eine Java-Programmierversion für die halbe Geschwindigkeit für die Erzeugung der MP3s.

Super wäre es, wenn man das Programm mit der Arduino-Oberfläche verknüpfen könnte, sodass automatisch immer das richtige Arduino Programm geladen wird. Leider weiß ich nicht, wie man den Pfad automatisch finden kann. Vielleicht gibt es hier ja einen Experten, der dazu was sagen möchte?


Bester Gruß,
Christoph

P.s.: schreib mir doch mal ne PM, wo Ihr euren Basteltreff habt
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 06, 2012, 07:31 pm
Hallo Chris, ist schon November? Das ging ja schnell mit dem differenziellen Manchestercode. Was wäre wenn der AutoBias nur mit einem Pin funktioniert. Quasi mit sich selbst???
http://www.dz863.com/drawsch_3739.html  (http://www.dz863.com/drawsch_3738.html) Man müsste nur im richtigen Verhältnis den PullUp des AudioInputs zuschalten und C2 müsste den Bias lange genug halten, damit er vom Audiosignal nicht mitgezogen werden kann. Aber auch hier hilft uns die mittelwertneutrale Codierung gewaltig. Allerdings muß am Anfang und eventuell nach jedem Frame (wo Zeit wäre) sicher eine Justagephase ohne Signal erfolgen. Ob 1Kbyte da noch reichen? Für freie Pin-wahl müsste die PWM auch noch über Software erfolgen. Puuuhhh
Später mehr.
Viele Grüße Johannes

sorry, der Link geht zur Zeit nicht, deshalb hier als SVG:

http://25mmhg.net/public/AutoBiasOnePin.svg

Zu Deiner Frage, ob der Bootloader in die ArduinoIDE eingebunden werden kann, kann ich noch nicht viel sagen, aber beim AVR-Studio geht es mit dem Java-Tool prima, weil das ja immer die Datei erst vor dem Abspielen umwandelt und so alle Änderungen einer anderen Software (in dem Falle AVR-Studio) mit erfasst werden. Sowas wie ALT+Leertaste==Playback wäre ja auch ganz praktisch. (Besonders wenn man in der Hand noch einen Tastkopf hält und extra noch ein Kabel an die Batteriehalten muss)

edit: ich habe hier einen Link, in dem etwas genauer der ArduinoBuildProzess beschrieben wird http://arduino.cc/en/Hacking/BuildProcess (http://arduino.cc/en/Hacking/BuildProcess)

Hier ein Auszug:
The .hex file is the final output of the compilation which is then uploaded to the board. During a "Verify" the .hex file is written to /tmp (on Mac and Linux) or \Documents and Settings\<USER>\Local Settings\Temp (on Windows). During upload, it's written to the applet sub-directory of the sketch directory (which you can open with the "Show Sketch Folder" item in the Sketch menu).

Upload process

Sketches are uploaded by avrdude.

The upload process is also controlled by variables in the boards and main preferences files.

Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Jun 15, 2012, 07:01 am
Quote
http://25mmhg.net/public/AutoBiasOnePin.svg


Hallo Johannes,

die Schaltung sieht nicht schlecht aus. Den Widerstand R2 könnte man sich vermutlich noch sparen.
Der "Forschungsaufwand", um den Bootloader so weit zu bringen, könnte allerdings gewaltig sein.

Viele Grüße,
chris
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 15, 2012, 08:12 pm
Hallo Chris, ich habe R2 als Gleichstrompfad gegen Masse eingefügt. Ansonsten könnte das Pin gleichstrommäßig und ohne internen Pull Up in der Luft hängen. Irgendwo stand, dass die internen Pull Ups zwischen 20k und 50k groß sein sollen. (Das müsste ich mal nachmessen - der Wert schwankt sicher auch technologisch bedingt) Wenn der Pin zwschen 1,1V und 1,34 V auf HIGH geht würden als R2 auch kleinere Werte in Betracht kommen (10k...22k).
Unser AG-Computer hat mit dem differenziellem Manchastercode noch seine Mucken. Wir konnten nach einigem Hin und Herstellen am Poti und am Audiopegel zwar einige Pages laden, aber das Programm lief danach nicht los. Ist der neue Bootloader bei Dir stabil?
Viele Grüße Johannes

Ansonsten werkeln wir gerade mit einem schicken Atmega32u4....wenns mal etwas länger dauert mit der Antwort
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Jun 16, 2012, 11:19 am
Quote
Hallo Chris, ich habe R2 als Gleichstrompfad gegen Masse eingefügt. Ansonsten könnte das Pin gleichstrommäßig und ohne internen Pull Up in der Luft hängen.


Meiner Meinung nach würde man keinen "Strompfad" brauchen. Wenn man den Pull-Up auschaltet, ist der Eingang des Atmega ziemlich hochohmig. Deshalb kann man am Anfang durch geschickte Programmierung den Kondensator so aufladen, dass er die 1.3V am Eingang des Atmega erzeugt. Währen der Signalübertragung dürfte die Ladung des Kondensators ziemlich konstant bleiben ( und damit auch die Spannung über dem Kondensator ). 

Quote
"Unser AG-Computer hat mit dem differenziellem Manchastercode noch seine Mucken. Wir konnten nach einigem Hin und Herstellen am Poti und am Audiopegel zwar einige Pages laden, aber das Programm lief danach nicht los. Ist der neue Bootloader bei Dir stabil?"


Meinst Du die Version pingpong_V4 oder AudioBoot2.0 ?
Die Audioboot2.0 Version habe ich auf diesem Board hier

http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=130

mit einem Atmega8 und einem Atmega168 getestet, das lief einwandfrei.

Auf dem ping-pong Game habe ich es nicht mehr getestet. Könnte in der neuen Konfiguration ein Fehler sein?

Viele Grüße,
Christoph
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: 25mmHg on Jun 18, 2012, 11:54 pm
Hallo Chris, die V2.0 hab ich noch nicht getestet (glatt übersehen). Ich hab bisher nur die V1.4 getestet. Wenn die 2.0 auf dem PingPongBoard geht meld ich mich. Und Chris, Du hast beim Koppelkondensator immer noch im ProgrammText 10nF stehen. Waren 100nF nicht besser?
Gruß Johannes
Title: Re: AUDIOINO, eine minimalistischer Arduino mit Programmierung über Line Out
Post by: ChrisMicro on Feb 05, 2017, 05:40 am
Quote
Waren 100nF nicht besser
Einige Leute benutzen den Bootloader mit 100nF.  Es scheint wohl gut zu funktionieren.


Hier gibt es jetzt eine neue Version für den Attiny85.

Attiny85 AudioBootloader (https://github.com/ChrisMicro/TinyAudioBoot)