Bauplan Schaltplan Atmel Tiny Melodieklingel Türklingel
Tiny Meldieklingel

Atmel Tiny Experimentierplatine Anwendung Meldieklingel Türklingel

Für das hier vorgestellte Tiny Experimentierboard hier ein kleines Anwendungsprogramm welches einen Tiny 15 in eine Melodieklingel verwandelt.

Das Programm verwendet den Timer-Interrupt um die jeweiligen Töne zu erzegen, eine von zwei Melodien wird solange ausgegeben wie der Taster betätigt wird.

Die Ports PB0 bis PB2 werden dabei als Ausgang verwendet, über entsprechende Vorwiderstände kann ein kleiner Lautsprecher direkt angeschlossen werden.

Je nachdem wieviele der drei Ausgänge man verwendet, kann man dann sogar die Lautstärke des Tones einstellen.

Mein Tip:

Verwendet z.B. 100 Ohm, 220 und 470 Ohm als Vorwiderstände, dann könnt Ihr 8 verschiedene Lautstärke-Stufen kombinieren!

Das Programm wurde von der Seite www.bellibot.com zur verfügung gestellt.

Hier der Quellcode:

;***** basic door bell*************************************************
; Hardware = tinyboard from Lötstelle.net
; bit 0 - 2 of PortB used as output to speaker.
; you can AND the tree outputs over 3 R's each 22ohm to a speacker (8ohm) to V+
; bit PB4 for pushbutton (atiny13/15 watch pinlayout !)
; The program uses interrupt-driven tone generation
; after key press it's play one of two songs solong the key is pressed :-)
; ********** (c.) by BELLAD from www.bellibot.com *********************
; ************* it'S free for education only **************************

; Middle C is 262 Hz. Will need to
;interrrupt at each half-cycle to toggle an output pin, interrupt every
;0.00191 seconds or every 7640 machine cycles (at 4Mhz)
;So we need to prescale by 64 since 7640<255*64
;the actual preload count will be 7640/64 = 119 - for 2313 at 4 Mhz!


.include "tn15def.inc"
;

.def T1 =r1
.def T2 =r2
.def T3 =r3
.def Temp =r16 ;temporary register
.def reload =r17 ;holds timer reload value
.def output =r18 ;Hold ff or 00 for waveform
.def mask =r19 ;mask for eor
.def freq =r20 ;current frequency
.def savSREG =r21 ;save processor status word
.def keydown =r22 ;key pressed flag
.def count = r23
.def duration = r24

.equ PreScal =3 ;timer prescale by 64
.equ C =119 ;time for 1/2 cycle middle C
.equ D =106 ;time for 1/2 cycle D
.equ E =94 ;time for 1/2 cycle E
.equ F =89 ;time for 1/2 cycle F
.equ G =79 ;time for 1/2 cycle G
.equ A =71 ;time for 1/2 cycle A
.equ B =63 ;time for 1/2 cycle B


;************ Data eeprom ******************************
; tone,duration
;********************************************************
.eseg
.org 0

;***** Initialization
.cseg

.org 0x01ff ;calibrationbyte stored at end of flash
cali: .dw 0x6b00

.org $0000

rjmp RESET ; Reset Handler
reti
reti
reti
reti
rjmp TIMER ; TIM_OVF0 ; Timer0 Overflow Handler

; set all the things we want !
RESET:
ldi ZL, low(FLASHEND*2+1) ;OSCCAL (Stored at end of flash)
ldi ZH, high(FLASHEND*2+1) ;OSCCAL
lpm
out OSCCAL, r0

ldi Temp,0b00111 ;set
out DDRB,Temp ;PORTB = pb0-pb2 outputs,pb3-pb4 input
;port b output off, pullups on
ldi Temp,0b11000
out PORTB,Temp

mov output,Temp ;init out to 0

ldi mask,0b00111

ldi Temp,exp2(TOIE0) ;enable timer intr
out TIMSK, Temp
ldi Temp, PreScal ;prescale timer
out TCCR0, Temp

; rjmp Intro ; play intro !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
M_loop1:
cli
ldi Temp,0b11000
out PORTB,Temp
M_loop:
;sbis pinb,3 ;see if a key was already pressed
;rjmp Intro
sbis pinb,4 ;if a key is pressed, process it
rjmp Intro

nokey: ;turn off tone
rjmp M_loop ;wait for something to happen

;**** once per interrupt
;which will be every 1/2 cycle of the audio signal

TIMER:
in savSREG, SREG ;save processor status
out TCNT0, reload ;make 1/2 cycle intr rate

out PORTB, output ;flip the output bit
eor output,mask

out SREG, savSREG ;restore proc status
reti ;back to pgm
;**********************************************************************

Delay:
clr T1 ;T1 used as delay 2nd count
clr T2
ldi temp,0x01
mov T3,temp
delay_1:
dec T1
brne delay_1
dec T2 ; must be preset as
brne delay_1 ; delay master count
dec T3
brne delay_1
ret
;***********************************************************************


Intro: ; play nice music
inc count
cpi count,1 ; change the tab
breq intr_2
ldi count,0

intr_3:
ldi ZH, high(2*tab2)
ldi ZL, low(2*tab2) ; Byte adr. of music table
rjmp intr_1
intr_2:
ldi ZH, high(2*tab1)
ldi ZL, low(2*tab1) ; Byte adr. of music table

intr_1:

lpm
tst r0 ; load byte - if 0 then we reached the end of the tab
breq quit
mov freq,r0
asr freq ;div /2 , so i have no time to convert the tables to right value
; the tab's are from 2313 with 4mhz ( a nice other project :-))
;adiw ZL,1
subi ZL,-1 ; Increment Z by 1
sbci ZH,-1

lpm
tst r0 ; load byte - if 0 then we reached the end of the tab
breq quit
mov duration,r0
subi ZL,-1 ; Increment Z by 1
sbci ZH,-1
ser reload ;init tone time by setting
sub reload, freq ;0xff-freq is time to overflow

walk:
rcall ton
dec duration
brne walk
continue:
;sbic pinb,3 ;see if a key was already pressed
;rjmp M_loop1
sbic pinb,4 ;if a key is newly pressed, process it
rjmp M_loop1

nop
rjmp intr_1
quit:
cli
rjmp M_loop1

ton:
sei
rcall Delay ;ton on
cli ;ton off
nop
ret
;****************** music tabs *****************************
tab1:
.db 89,6,79,2,71,4
.db 79,4,63,4,71,4
.db 79,2,94,2,89,4
.db 106,4,89,4,71,2
.db 79,4,71,2,89,2
.db 119,8,89,6,79,2
.db 71,4,79,4,89,4
.db 71,4,79,2,94,2,89,4,109,4,119,4,89,4,71,4
.db 79,4,71,2,89,2,119,8,79,4,71,4
.db 79,2,94,2,119,4,89,4,71,4,79,2,94,2,119,4,119,4
.db 89,4,71,6,71,2,63,6
.db 89,2,119,8,89,6,94,2,106,4,119,4,106,6
.db 119,2,119,2,89,2,71,4,79,4,71,2,89,2,119,2,106,2
.db 89,4,71,2,79,2,89,8
.db 0,0

tab2:
.db $51,2,$5A,2,$5A,2,$51,2,$48,2,$5A,2,$48,2
.db $48,2,$5A,2,$5A,2,$51,2,$48,2,$48,2,$52,2
.db $5A,2,$5A,2,$51,2,$48,2,$44,2,$48,2,$51,2
.db $5A,2,$60,2,$79,2,$6C,2,$60,2,$79,2,$6C,2
.db 0,0


Achtung: Werbeaktion:

Für dieses Projekt verteilen wir kostenlose Leerplatinen!

Jeder, der z.B. einen Link zu www.loetstelle.net auf seiner Hompage, seinem Blog oder in einem anderen Forum setzt bekommt eine Leerplatine für dieses Projekt!

Auch wenn ihr ein interessantes Programm für die Tinys habt, (Quellcode+Beschreibung), welches ich hier veröffentlichen kann, gibt es eine kostenlose Platine!

Porto übernehmen wir auch noch. (innerhalb Deutschland, pro Person nur ein Stück, solange Vorrat reicht )

Anfragen per Email!

Bauteile für dieses Projekt - Anzeigen:
Aktive Bauelemente

Passive Bauelemente


Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen:

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1211943