www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM zur Tonausgabe auf einem Lautsprecher Mega8


Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
also habe mal versucht ein Ton zu erzuegen, habe dazu das Programm (ist 
eigentlich fast vollständig kopiert).
Meiner Meinung nach müsste damit jetzt ein Ton mit der Frequenz von ca. 
4kHz erzeugt werden. Das wollte ich dann einen Audio-Ampfiler an einen 
Lautsprecher anschließen, stimmt da das Signal so?
.include   "m8def.inc"
 
   .def   temp      = r16
 
start:
   ldi    temp, LOW  (RAMEND)
   out    SPL, temp
   ldi    temp, HIGH (RAMEND)
   out    SPH, temp
 
 
   ldi    temp, 0xFF
   out    DDRB, temp                ;define PortB as output
 
   ldi    temp, 0xFF
   out    TCCR1A, temp              
 
   ldi    temp, 0x02
   out    TCCR1B, temp              ;set Prescaler 2
 
   sei
 
main:
   ldi    temp, 0x1
   out    OCR1AH, temp              ;set pwm pin 1 highbyte
 
   ldi    temp, 0x00
   out    OCR1AL, temp              ;set pwm pin 1 lowbyte
                            ;pin: PortB1 
   
loop: 
  rjmp   loop

mfg

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

und wo ist die Vektor-Tabelle und der Interrupt-Handler ?

Gruss Otto

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  ldi    temp, 0xFF
  out    TCCR1A, temp              
 
  ldi    temp, 0x02
  out    TCCR1B, temp              ;set Prescaler 2

Meinst Du, ich fummel jetzt anhand der I/O-Registerliste raus, ob mit 
"0x02" in TCCR1B auch die richtigen Bits eingeschaltet werden?  Mann, 
schreib das so (auch in Deinem eigenen Interesse!):
  ldi   t,  0<<COM1A1 | 1<<COM1A0 | 0<<COM1B1 | 0<<COM1B0 | 0<<FOC1A | 0<<FOC1B | 0<<WGM11 | 0<<WGM10
  out   TCCR1A, t         

  ldi   t, 0<<ICNC1 | 0<<ICES1 | 0 | 0<<WGM13 | 1<<WGM12 | 1<<CS12 | 0<<CS11 | 0<<CS10
  out   TCCR1B, t         

Für gesetzte Bits schreibst Du eine Eins an die passende Stelle, für 
gelöschte ein Null.

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
also ich habe das Programm hier her:
http://www.mikrocontroller.net/articles/AVR_PWM

Da ist ja auch kein Interrupt-Handler. Ich hatte mir so gedacht, das mit 
PWM eine analoge Spannung erzeugt wird, womit ich den LS dann betreiben 
kann.
Ich habe es ausprobiert und es geht aber leider nicht.
Also reicht dieses Programm nicht allein zur Tonerzeugung?

mfg

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, daß Dein Programm in der Schleife "loop" kreiselt. Da ist 
aber keine "Musik" drin.

MfG Paul

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich meine das durch das ständige ein  - und ausschalten von Port 
B, was ja eigentlich alleine durch den Timer passiert,  der Ton erzeugt 
wird.

mfg Martin

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

> also ich habe das Programm hier her:

dann nimm es so, wie es ist ich sehe da einige Unterschiede.

Sobald Du "sei" verwendest, sollte eine Vektortabelle vorhanden sein.

Gruss Otto

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Timer des Mega8 sind etwas langsam, um die PWM als DAC zu nutzen, da 
braucht es schon einen Timer mit PLL wie im Tiny15 oder Tiny25/45/85.

Falls Du nur Rechteck erzeugen willst, dann brauchst Du keine PWM, 
sondern musst den Timer im Toggle-Mode betreiben. Denn mittels PWM 
erzeugst Du ja eine feste Frequenz mit variablem Tastgrad.

Ich könnte Dir zwar ein paar Links nennen, die nützen Dir aber nichts, 
da die Programme voraussetzen, dass Du Dich mit Interrupt-Programmierung 
auskennst.

...

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hannes,
mit Toggle-Modus meinst du wohl Pin einschalten, und dann den Timer 
immer den Pin umschalten lassen?

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Vielleicht hilft dir das weiter (Anhang).

MfG Spess

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Martin K. wrote:
> Hallo hannes,
> mit Toggle-Modus meinst du wohl Pin einschalten, und dann den Timer
> immer den Pin umschalten lassen?

Jou. Ein Beispiel ist im Anhang, allerdings für Mega48, dessen Timer 
etwas anders ausgestattet sind als beim Mega8.

...

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe es jetzt hinbekommen.

mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.