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 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 ###*/"
Lesezeichen