Forum: Mikrocontroller und Digitale Elektronik XPlained A1 Soundausgabe


von Raphael B. (farin_94)


Lesenswert?

Hei zusammen

Ich hab mir vor kurzer Zeit ein Xplained A1 mit einem XMEGA128A1 gekauft 
um mich mit gcc auseinanderzusetzen. Da der Beispielcode von ATMEL 
ziemlich kritisch ist für mich habe ich von Grund auf angefangen. 
Buttons und LED's ansteuern geht ziemlich einfach. Nun möchte ich gerne 
Töne ausgeben. Hat jemand von euch Beispielcode wie man über den Speaker 
auf dem Board einen Ton mit einer bestimmten Frequenz o.ä. ausgeben 
kann?

Ich habs leider nicht geschafft. =/

Danke und Gruss

Farin

: Verschoben durch Moderator
von Raphael B. (farin_94)


Lesenswert?

Ist mir jetzt ein Rätsel warum der Beitrag verschoben wurde, da er 
explizit mit den programmatikalischen Aspekten der Wiedergabe von 
akustischen Signalen auf einer bestehenden Schaltung verweist. Aber 
egal. Hat das jemand schon einmal gemacht? =)

von Jonas Biensack (Gast)


Lesenswert?

Ja und mehr und wo ist genau dein Problem?

von Jonas Biensack (Gast)


Lesenswert?

1. Doku von atmel zum xplain board runterladen.
2. Schauen wo der Speaker angeschlossen ist.
3. Hier schauen wie ich einen Portpin als Ausgang konfiguriere.
4. Dann schauen wie ich einen Timer mit Interrupt konfiguriere.
5. Im Interrupt den Portpin toggeln.

1-5 bei fragen, frag
Gruß jonas

von Jonas Biensack (Gast)


Lesenswert?


von Raphael B. (farin_94)


Lesenswert?

Das Ganze ist mir klar. Ich bin gerade auf Arbeit darum hab' ich den 
Code nicht hier aber das Ganze hab ich schon gemacht. Der Speaker liegt 
auf PortB, Pin2. Das Toggeln funktioniert auch.

Aber ich krieg keinen Ton dabei raus.. =(
Muss ich noch etwas anderes aktivieren ausser dem PORTB als Ausgang.

von Raphael B. (farin_94)


Lesenswert?

Da der Speaker auf PortB, Pin2 liegt toggle ich diesen Pin in einer 
while(1)-schleife und einem delay von 200 ms. Das Toggeln funktioniert 
auch.

Aber ich krieg keinen Ton dabei raus.. =(
Muss ich noch etwas anderes aktivieren ausser dem PORTB als Ausgang.

von Jannis C. (kabelwurm)


Lesenswert?

Hast du ein Oszi um dir das Signal mal anzusehen?
Dazu, mal nachgedacht, welche Frequenz du damit erzeugst? Ich hab mal so 
überschlagen und bin so bei 5Hz gelandet. Das kann kein Mensch hören.
Versuch mal 20ms oder 2ms. Das sollte man dann hören können.
Gruß Jannis

von Jonas Biensack (Gast)


Lesenswert?

200 ms = 2,5 Hz, da alle 400ms ein Takt. Da hörste nichts, wie oben 
schon geschrieben. ;)

von Raphael B. (farin_94)


Lesenswert?

Hei Leute

Also das ist mein Code. Dieser funktioniert leider nicht. F_CPU ist 
übrigens auf 32000000 gesetzt. Any ideas? Ich wäre euch extrem dankbar.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define SOUNDPORT PORTB
5
#define LEDPORT PORTE
6
#define SOUNDPIN PIN2
7
8
int main(void)
9
{
10
  SOUNDPORT.DIR = 0xFF;
11
  while(1)
12
  {
13
    LEDPORT.OUT = 0xFF;
14
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
15
    //Bit-toggling
16
    _delay_ms(20);
17
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
18
  }
19
  return 0;
20
}

Gruss

Farin

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du solltest den Verstärker noch einschalten. Sei gewarnt, das ein 
einfaches toggeln des Output Pins eine recht hohe Lautstärke erzeugt:
1
#define MISC_PORT PORTQ
2
#define AUDIO_SD PIN3_bm
3
// PortQ for Audio Shutdown
4
  MISC_PORT.DIRSET = AUDIO_SD ;
5
  MISC_PORT.OUTSET = AUDIO_SD ;
Kleinere Lautstärken machst du besser mit dem DAC. Ohne an der Sysclk 
rumzufummeln startet der XMega übrigens mit 2 Mhz, das steht aber im 
Datenblatt...

von Gerhard (Gast)


Lesenswert?

schau doch mal im AVR Studio 5 Software Framework, da gibt es die 
Ursprungs-App mit Sound-Ausgabe:

File -> New -> Example Project -> Kit -> Xmega A1 Xplained -> Xmega A1 
Xplained Demo application

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Durch ASF ist diese App leider alles andere als übersichtlich, da kann 
ich schon verstehen, das man als Anfänger schnell mal den Durchblick 
verliert. Der Schaltplan allerdings ist sehr hilfreich und sollte am 
Anfang stets ausgedruckt neben der Tastatur liegen :D

von Raphael B. (Gast)


Lesenswert?

Na dann such mal 'nen Schaltplan vom XPLained Board... ^^
Ich hab' schon Stunden zugebracht das zu suchen... Die einzigen Angaben 
stehen in der Dokumentation zum Board und die ist ziemlich verkackt...^^


Vielen herzlichen Dank übrigens an Matthiasm jetzt funktioniert alles 
perfekt so wies sein soll. Warum dieser Port gesetzt werden muss ist 
aber ein Rätsel für mich.. ;-)

Gruss Farin

von Thorsten S. (thosch)


Lesenswert?

Raphael B. schrieb:
> Na dann such mal 'nen Schaltplan vom XPLained Board... ^^
Nichts leichter als das!

> Ich hab' schon Stunden zugebracht das zu suchen... Die einzigen Angaben
> stehen in der Dokumentation zum Board und die ist ziemlich verkackt...^^

Wo hast Du bloß stundenlang gesucht?
Die gewünschte Information liegt auf der Atmel-Website direkt unter den 
"Documents"-Tab für das XMega A1 Xplained: 
http://www.atmel.com/dyn/products/tools_docs.asp?category_id=163&family_id=607&subfamily_id=1965&tool_id=17168

-> Atmel AVR1924: XMEGA A1 Xplained Hardware User Guide
dort auf das CD-Icon klicken -> (führt zu folgendem Direktlink)
http://www.atmel.com/dyn/resources/prod_documents/AVR1924.zip

Das ZIP-Archiv enthäl eine PDF-Datei mit dem kompletten Schaltplan,
Maßzeichungen der Platine incl. Bemaßung aller Steckverbinder,
Bestückungsplan, sowie der Stückliste.

Wo ist jetzt Dein Problem?

Gruß,
Thorsten

von Martin M. (capiman)


Lesenswert?

Ich glaube, dein Toggeln ist falsch:
(ich kenn jetzt zwar Atmel Chip nicht näher, schaut aber verdächtig aus)

while(1)
  {
    LEDPORT.OUT = 0xFF;
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
    //Bit-toggling
    _delay_ms(20);
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
  }

zieht den Pin z.B. hoch, wartet 20ms, dann runter.
Und SOFORT wieder hoch. Der Impuls ist nur ganz kurz,
wird vielleicht je nach Beschaltung raus gefiltert.

Signal schaut dann irgendwie so aus:

^____________________________^_________________________^

Vielleicht mal so

while(1)
  {
    LEDPORT.OUT = 0xFF;
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
    //Bit-toggling
    _delay_ms(20);
    // AUSKOMMENTIERT SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
  }

oder so

while(1)
  {
    LEDPORT.OUT = 0xFF;
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
    //Bit-toggling
    _delay_ms(20);
    SOUNDPORT.OUTTGL = (1<<SOUNDPIN);
    _delay_ms(20); /* NEU */
  }

probieren...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Raphael B. schrieb:
> Vielen herzlichen Dank übrigens an Matthiasm jetzt funktioniert alles
> perfekt so wies sein soll. Warum dieser Port gesetzt werden muss ist
> aber ein Rätsel für mich.. ;-)

Freut mich !
Der Onboard Verstärker hat einen Shutdown Pin, der Strom spart, wenn der 
Pin auf Low ist. Den Schaltplan hast du ja inzwischen , und bei 
Interesse - das Datenblatt des Amps ist ja kein Geheimnis. Ist bei 
Batteriebetrieb auch recht praktisch. Allerdings muss man den Amp gut 
100 mSec einschalten, bevor man Sound haben will.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.