PWM zur Tonausgabe auf einem Lautsprecher Mega8

OP #743096
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?
1
.include   "m8def.inc"
2
 
3
   .def   temp      = r16
4
 
5
start:
6
   ldi    temp, LOW  (RAMEND)
7
   out    SPL, temp
8
   ldi    temp, HIGH (RAMEND)
9
   out    SPH, temp
10
 
11
 
12
   ldi    temp, 0xFF
13
   out    DDRB, temp                ;define PortB as output
14
 
15
   ldi    temp, 0xFF
16
   out    TCCR1A, temp              
17
 
18
   ldi    temp, 0x02
19
   out    TCCR1B, temp              ;set Prescaler 2
20
 
21
   sei
22
 
23
main:
24
   ldi    temp, 0x1
25
   out    OCR1AH, temp              ;set pwm pin 1 highbyte
26
 
27
   ldi    temp, 0x00
28
   out    OCR1AL, temp              ;set pwm pin 1 lowbyte
29
                            ;pin: PortB1 
30
   
31
loop: 
32
  rjmp   loop

mfg
Gast #743245
Lesenswert?
• ▲
▼
1
  ldi    temp, 0xFF
2
  out    TCCR1A, temp              
3
 
4
  ldi    temp, 0x02
5
  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!):
1
  ldi   t,  0<<COM1A1 | 1<<COM1A0 | 0<<COM1B1 | 0<<COM1B0 | 0<<FOC1A | 0<<FOC1B | 0<<WGM11 | 0<<WGM10
2
  out   TCCR1A, t         
3

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

Für gesetzte Bits schreibst Du eine Eins an die passende Stelle, für 
gelöschte ein Null.
#743296
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.

...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.