Lautsprecher mit uC ansteuern
Will einen Lautsprecher mit meinem avr uC ansteuern! Doch wie funktioniert so was, geht das überhaupt? Muss der Lautsprecher nicht einen Wechselstrom bekommen oder so? Wie werden dann die Tonfrequenzen variiert? Wie stellt man Lautstärke ein? ach ja, bin übrigens noch auf der Suche nach einem geeigneten Lautsprecher! Muss nichts grosses sein, muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können! Kennt da jemand gerade einen kleinen günstigen Lautsprecher?
Re: Lautsprecher mit uC ansteuern
Zitat:
Zitat von taylor22
... Lautsprecher mit ... avr uC ansteuern! ... muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können...
Na ja, mit AVR (und Transistor) gehts so so, la la. Es ist halt eine dämliche Rechteckspannung - das hört man der auch an.
Zitat:
Zitat von Willa
Auf dem RN-Control Board ist doch ein Lautsprecher drauf ...
Stimmt, da steht auch "Speaker" - aber das ist dem Aussehen (und dem Schaltplan nach) ein Piezo. Und "Treiber" ist auch nicht auf meiner RNControl - und die ist von vorletzter Woche (noch mit Aufkleber "Remove after washing" :) ).
Ich bin grad auch dabei, Töne auszugeben - es klingt schrecklich mit der Rechteckspannung. Als Vergleich habe ich meine Stimmgabel genommen - na ja, den "Ton" kriegt man schon frequenzgenau hin. Ich suche ja nicht unbedingt die Oberwellen von einer Stradivari, ich würde eher gerne so einen Pfiff loslassen können - aber davon bin ich Jahrhunderte entfernt.
Ach so, ja, taylor22 fragt ja, wie es geht:
Code:
;===================================================================================
#include "tn13def.inc"
; Interrupthandler-Tabelle (aus ATTiny13_doc2535.pdf, Seite 42)
; Address Code Labels ; Comments
.org 0x0000 rjmp reset ; Reset Handler
;.org 0x0003 rjmp isr_x13 ;TIMO_OVF = Timer0 Overflow Handler
.org 0x0006 rjmp isr_ctc ; IRS für Timer0 CompareA Handler
;
;===================================================================================
; Hauptprogramm
;===================================================================================
;
reset: ;=== Generelle Initialisierung
; Zuerst Stack definieren;
ldi a,RAMEND ;Ram Ende des tiny13
out SPL,a ;Stack Pointer tiny13 setzen
;
anfang: ;=== Hier beginnt das Hauptprogramm
rcall mc_init
rcall isr_ini ;Initialisiere die ISR
;
;
hauptp: ;=== Löse Aufgabe: Teste Port PB1 auf Tastendruck. WENN
; - Taste gedrückt: rLED an und piezo/PB4 an
; - Taste gelöst : rLED aus und piezo/PB4 aus
;
sbi portb,rLED ;Rote LED/PB3 aus
sei ;Globel Interrupt an
;
h2: ;=== Hier beginnt das Hauptprogramm
in a,pinb
sbrc a,taste0 ;Wenn Pinb_0 (0..7) = 1, dann rLED/PB3 einschalten
rjmp tonan ; sonst schalte die piezo/PB4 ein
rjmp tonaus
;
tonan:
in a,SREG
sbrc a,7 ;Ist global interrupt gesetzt?
rjmp h2
sbi portb,rLED ;Rote LED/PB3 an
sei ; ... und dazu einfach Interrupt einschalten
rjmp h2
;
tonaus:
in a,SREG
sbrs a,7 ;Ist global interrupt gesetzt?
rjmp h2 ; nein, dann gleich abschalten
;
cli ;Verbiete Interrupts
cbi portb,rLED ;Rote LED/PB3 aus
cbi portb,piezo ; piezo/PB4 aus
;
rjmp h2
;
;===================================================================================
; Prozeduren
;===================================================================================
;
;===================================================================================
; Initialisierungprozeduren, für µC, ADC und Timer-ISR
;===================================================================================
;
mc_init: ;=== Initialisiere Mikrocontroller
;ALLE Register initialisieren hier := pull-ups einschalten
;
ldi a,0b00111000 ;
;Datenrichtung "Eingänge" für ports 0 - 2
; und "Ausgänge" für ports 3 - 5
out ddrb,a
ldi a,0b00000000
out portb,a ; ports aus-(=) oder ein(1)schalten; low = sink
ret ;=====----->>>>>
;
;
isr_ini: ;=== Initialisierung der ISR (war mal isrinit_x15)
;
;;Timer Register werden belegt
ldi a,(1<<wgm01) ;prescaler ist 1, waveform = CTC
out tccr0a,a ;Register TCCR0 ist für den Prescaler zuständig
ldi a,tmrprsc ;prescaler, siehe oben, Abstand zum nächsten
out tccr0b,a ; Interrupt bestimmt CTC-Preload tmrprsc
ldi a,(1<<ocie0a) ;Hier Interrupts nach CTC eingeschaltet
out timsk0,a ;Register TIMSK ist dafür zuständig
ldi a,tmrprld ;Hier wird der Timer vorgeladen. Er läuft dann
out TCNT0,a ; .. tmrprld mal durch bevor ein Interrupt auftritt
out ocr0a,a ;Prescaler tmrprs in OCR0A
ret ;=====----->>>>>
;
;
;===================================================================================
; Interrupt-Service-Routine
;#######>>>>> Muss real nicht zuerst der (letzte) PC gepusht werden ?
;===================================================================================
;
;
isr_ctc: ;=== ISR läuft sowieso auf 880 Interrupts je Sekunde, also 440 Hz
; zum Ansteuern des piezo einfach toggeln
in ac,pinb
sbrs ac,piezo ;Ist Rampe vom piezo an?
rjmp pinan ;Piezo war aus, also anschalten
;
pinaus: ;=== piezo ist an, also ausschalten, ebenso LED/PB3
cbi portb,piezo
rjmp iraus
;
pinan: ;=== piezo ist aus, also den und LED/PB3 anschalten
sbi portb,piezo
;
iraus:
reti ;=====----->>>>>
;
;===================================================================================
; Ende des Quellcodes
;===================================================================================
Ich schalte den Ausgang "piezo" mit einer Taste ein. Der Piezo jammert solange, wie die Taste gedrückt wird. Funktioniert - aber es ist eigentlich nix für menschliche Ohren ](*,)
Ja, und noch meinen "Schaltplan" aus dem Quellcode.
Code:
; +--------+
; Vcc --------+ LP2950 +-------tiny13-Vcc---------------------------+
; (9VBlock) |3 1| \ Taste |
; | 2 | tiny13-PB0---+----+ |----------------+
; +---+----+ |
; | +-----+ |
; +------------+ 10K +------+
; | +-----+
; | rLED|\ |
; | tiny13-PB3-----------------| >+------+
; | |/ | |
; | |
; | tiny13-PB4-----Piezosummer-----------+
; | |
; | +------+ |
; GND-------------+------------tiny13-GND-----+ 100R +--------------+
; +------+
taylor22 - musst Dir halt für Deinen µC umpfriemeln.
Übrigens gibts ein Demo auch in Hochsprache:
https://www.roboternetz.de/wissen/in...oprogramm_in_C
unter "/*### Sound durch den Speaker ausgeben ###*/"