Thema: Erzeugung von Rechtecksignalen - Elektrotechnik
Thema: Erzeugung von Rechtecksignalen - Elektrotechnik
Thema: Erzeugung von Rechtecksignalen - Elektrotechnik
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Prof. Dr. Pollakowski<br />
Mikrocomputertechnik, Sommersemester 2013 - Aufgabenblatt 7 - Übung 3<br />
<strong>Thema</strong>: <strong>Erzeugung</strong> <strong>von</strong> <strong>Rechtecksignalen</strong><br />
In diesem Versuch sollen Sie die Verwendung der internen Timerregister des AT89C5131<br />
Mikrocontrollers erlernen. Diese Register können sehr vorteilhaft dazu benutzt werden<br />
Taktsignale definierter Frequenz an den Prozessorports zu erzeugen. Eine Anwendung hierfür<br />
ist z.B., mit dem am Versuchssystem angeschlossenen Lautsprecher Töne zu erzeugen.<br />
T p<br />
= T 2 = 1<br />
2⋅f<br />
Soll z.B. eine Signal der Frequenz f erzeugt werden, dann muß der Ausgang P3.5 des<br />
Mikrocontrollers nach Ablauf der Pulsdauer Tp invertiert werden.<br />
$NOMOD51<br />
$INCLUDE (reg515.inc)<br />
org 0<br />
mov tmod,#11H ; Timer 0 und 1 als Zeitgeber konfigurieren<br />
clr tr0 ; Timer 0 anhalten (Run-Bit = 0)<br />
clr tf0<br />
; Timer Überlauf Bit rücksetzen<br />
start: jb p0.0, start<br />
; (2) warten bis Taste gedrückt<br />
mov th0,#0f8H ; (2) Zeitgeber 0 laden (63640)<br />
mov tl0,#098H ; (2)<br />
setb tr0<br />
warten: jnb tf0, warten<br />
clr tr0<br />
clr tf0<br />
; (1) Timer 0 starten<br />
; (2) warten bis Timer 0=0000(Overflow)<br />
; -(65536 – 63640) = -1896<br />
; (1) Timer 0 anhalten<br />
; (1) Überlauf-Bit rücksetzen<br />
cpl p3.5<br />
; (1) Lautsprecherausgang invertieren<br />
jmp start ; (2)<br />
; → (14) Zyklen nach Tastendruck<br />
end<br />
Aufgabe 1: Testen Sie das Beispielprogramm. Berechnen Sie aus dem Zeitgeber-<br />
Anfangswert die Frequenz des ausgegebenen Tonsignals. Beachten Sie hierbei,<br />
daß der Zeitgeber einmal pro Maschinenzyklus inkrementiert wird. Das Zeitgeberflag<br />
TF0 wird gesetzt, sobald der Zeitgeberinhalt #0000H erreicht ist<br />
(Überlauf).<br />
Vorlesungsbeispiel → T p<br />
=189614 s=1910 s ; f = 1<br />
2T p<br />
=262 Hz<br />
... bei einer Quarzfrequenz <strong>von</strong> 12MHz → 1µs Zykluszeit<br />
Seite 1 <strong>von</strong> 6
Beispiel und Berechnungsschritte aus der Vorlesung:<br />
setb tr0<br />
; Timer 0 starten<br />
start: mov th0,#0ffH 2 µs ; Zeitgeber 0 laden mit -100<br />
mov tl0,#09cH 2 µs<br />
warten: jnb tf0, warten 100 µs ; warten bis Timer 0 = 0000 (Overflow)<br />
clr tf0<br />
1 µs ; Überlauf-Bit rücksetzen<br />
cpl p3.5<br />
1 µs ; Port Bit (Lautsprecherausgang) invertieren<br />
jmp start 2 µs<br />
Ablauf: nach 4 µs ist das Timerregister geladen<br />
nach 100 µs ist das Überlaufbit tf0 gesetzt<br />
nach 2 µs ist das Port Bit invertiert<br />
nach 2 µs beginnt die Schleife neu →<br />
Pulsdauer Tp = 108 µs (Timerlaufzeit + 8 µs)<br />
Frequenz f = 1 / (2 Tp) = 4,63 kHz<br />
... bei einer Quarzfrequenz <strong>von</strong> 12MHz → 1µs Zykluszeit<br />
Beispiel zur Tonerzeugung in Unterprogrammtechnik:<br />
$NOMOD51<br />
$INCLUDE (reg515.inc)<br />
org 0<br />
init: mov tmod,#11H ; Timer 0 und 1 als Zeitgeber konfiguriere<br />
clr tr0 ; Timer 0 anhalten (Run-Bit = 0)<br />
clr tf0<br />
; Timer Überlauf Bit rücksetzen<br />
start: jb p0.0, start<br />
call TON_C<br />
cpl p3.5<br />
jmp start<br />
; warten bis Taste 1 gedrückt<br />
; Timer einstellen auf Ton C<br />
; Lautsprecherausgang invertieren<br />
;-- UP: Tonerzeugung -------------------------------------------------<br />
TON_C: mov th0,#0f8H ; Zeitgeber 0 laden<br />
mov tl0,#089H ;<br />
setb tr0<br />
warten: jnb tf0, warten<br />
clr tr0<br />
clr tf0<br />
ret<br />
end<br />
; Timer 0 starten<br />
; warten bis Timer 0 = 0000 (Overflow)<br />
; Timer 0 anhalten<br />
; Überlauf-Bit rücksetzen<br />
Seite 2 <strong>von</strong> 6
Berechnungen:<br />
timer preload value = 65536additional cycles −<br />
1<br />
2⋅f [Hz ]⋅cycle time[ s]<br />
timer preload value = 65536additional cycles −<br />
1000000<br />
2⋅cycle time⋅f<br />
f =<br />
1000000<br />
2⋅cycle time⋅ 65536additional cycles − timer preload value <br />
Berechnung der Timer Preload Value in C:<br />
#include <br />
int main(void)<br />
{<br />
double crystal_frequ,audio_frequ,add_cycles=0;<br />
double frequ,machine_cycle,timer_preload_value;<br />
printf("\n-- calculate timer preload value for 8051 sound creation programs<br />
--------\n");<br />
do{<br />
printf("\n enter crystal_frequency [MHz] : ");<br />
if (!scanf("%lf", &crystal_frequ)){<br />
printf(" bye ...\n\n");<br />
return(0);<br />
}<br />
printf(" enter audio_frequency [Hz] : ");<br />
if (!scanf("%lf", &audio_frequ)){<br />
printf(" bye ...\n\n");<br />
return(0);<br />
}<br />
printf(" enter additional cycles : ");<br />
if (!scanf("%lf", &add_cycles)){<br />
printf(" bye ...\n\n");<br />
return(0);<br />
}<br />
frequ = crystal_frequ*1e6/12.;<br />
printf("\n frequ = %e Hz = %f MHz",frequ, frequ/1e6);<br />
machine_cycle = 1./frequ;<br />
printf("\n machine_cycle = %e us = %f us",machine_cycle,1e6*machine_cycle);<br />
timer_preload_value = 65536. + add_cycles - 1./2./machine_cycle/audio_frequ;<br />
printf("\n timer_preload_value = %e = %d = 0x%X\n",\<br />
timer_preload_value,(unsigned)timer_preload_value,(unsigned)timer_preload_value);<br />
} while(1);<br />
}<br />
Seite 3 <strong>von</strong> 6
Aufgabe 2: Schreiben Sie ein Programm, das die Tasten abfragt und je nachdem welche der<br />
Tasten gedrückt ist, die Töne C, D, E, und F der 4. Oktave ausgibt. Die<br />
zugehörigen Frequenzen und die Zeitgeber-Anfangswerte sind in den folgenden<br />
Tabellen aufgelistet.<br />
Ton Frequenz in Hz Zählerstartwerte<br />
C 262 F898<br />
D 294 F967<br />
E 330 FA21<br />
F 349 FA73<br />
Zusatzaufgabe (freiwillig):<br />
Schreiben Sie ein Programm, das den Zustand der Tasten als Binärcode<br />
interpretiert und somit 15 unterschiedliche Töne erzeugen kann (0001 = Ton C,<br />
0010 = Ton D, 0011 = Ton E, usw.). Die weiteren Frequenzen erhalten Sie durch<br />
12<br />
Multiplikation mit 2 = 1,0595 .<br />
Frequenzen der gleichschwebend temperierten Stimmung mit a'=440 Hz.<br />
Ton Hertz Ton Hertz Ton Hertz Ton Hertz Ton Hertz<br />
''A 27,50 C 65,41 c' 261,63 c''' 1.046,50 c''''' 4.186,01<br />
''B 29,14 Des 69,30 des' 277,18 des''' 1.108,73<br />
''H 30,87 D 73,42 d' 293,66 d''' 1.174,66<br />
'C 32,70 Es 77,78 es' 311,13 es''' 1.244,51<br />
'Des 34,65 E 82,41 e' 329,63 e''' 1.318,51<br />
'D 36,71 F 87,31 f' 349,23 f''' 1.396,91<br />
'Es 38,89 Ges 92,50 ges' 369,99 ges''' 1.479,98<br />
'E 41,20 G 98,00 g' 392,00 g''' 1.567,98<br />
'F 43,65 As 103,83 as' 415,30 as''' 1.661,22<br />
'Ges 46,25 A 110,00 a' 440,00 a''' 1.760,00<br />
'G 49,00 B 116,54 b' 466,16 b''' 1.864,66<br />
'As 51,91 H 123,47 h' 493,88 h''' 1.975,53<br />
'A 55,00 c 130,81 c'' 523,25 c'''' 2.093,00<br />
'B 58,27 des 138,59 des'' 554,37 des'''' 2.217,46<br />
'H 61,74 d 146,83 d'' 587,33 d'''' 2.349,32<br />
es 155,56 es'' 622,25 es'''' 2.489,02<br />
e 164,81 e'' 659,26 e'''' 2.637,02<br />
f 174,61 f'' 698,46 f'''' 2.793,83<br />
ges 185,00 ges'' 739,99 ges'''' 2.959,96<br />
g 196,00 g'' 783,99 g'''' 3.135,96<br />
as 207,65 as'' 830,61 as'''' 3.322,44<br />
a 220,00 a'' 880,00 a'''' 3.520,00<br />
b 233,08 b'' 932,33 b'''' 3.729,31<br />
h 246,94 h'' 987,77 h'''' 3.951,07<br />
Quelle:<br />
http://pianotip.de/frequenz.htm<br />
Seite 4 <strong>von</strong> 6
Variante 1:<br />
$NOMOD51<br />
$INCLUDE (reg515.inc)<br />
org 0<br />
init: mov tmod,#11H ; Timer 0 und 1 als Zeitgeber benutzen<br />
setb tr0 ; Timer 0 starten (Run-Bit = 1)<br />
taste: jnb p0.0,ton1<br />
jnb p0.1,ton2<br />
jnb p0.2,ton3<br />
jnb p0.3,ton4<br />
jmp taste<br />
; Sprung falls Taste gedrückt<br />
; Sprung falls Taste gedrückt<br />
; Sprung falls Taste gedrückt<br />
; Sprung falls Taste gedrückt<br />
ton1: mov th0,#0f8H ; Zeitgeber 0 laden<br />
mov tl0,#089H ; Ton C = F889 Hex<br />
jmp ton<br />
ton2: mov th0,#0f9H ; Zeitgeber 0 laden<br />
mov tl0,#05aH ; Ton D = F95A Hex<br />
jmp ton<br />
ton3: mov th0,#0faH ; Zeitgeber 0 laden<br />
mov tl0,#014H ; Ton E = FA14 Hex<br />
jmp ton<br />
ton4: mov th0,#0faH ; Zeitgeber 0 laden<br />
mov tl0,#069H ; Ton F = FA69 Hex<br />
jmp ton<br />
ton: clr tf0 ; Timer Überlauf Bit rücksetzen<br />
warten: jnb tf0, warten ; warten bis Timer 0 = 0000 (Overflow)<br />
cpl p3.5<br />
; Lautsprecherausgang invertieren<br />
sjmp taste<br />
end<br />
Seite 5 <strong>von</strong> 6
Variante 2:<br />
$NOMOD51<br />
$INCLUDE (reg515.inc)<br />
org 0<br />
init: mov p1,#0FFH<br />
; alle Lampen aus<br />
mov tmod,#11H ; Timer 0 und 1 als Zeitgeber konfiguriere<br />
clr tr0 ; Timer 0 anhalten (Run-Bit = 0)<br />
clr tf0<br />
; Timer Überlauf Bit rücksetzen<br />
start: clr c<br />
mov a,p0<br />
cpl a<br />
anl a,#0FH<br />
mov r0,a<br />
subb a,#1<br />
jz S1<br />
mov a,r0<br />
subb a,#2<br />
jz S2<br />
mov a,r0<br />
subb a,#4<br />
jz S3<br />
; Carry vorsichtshalber löschen<br />
; Tastenport > Accu<br />
; Hardware-Invertierung aufheben<br />
; die oberen 4 Bit ausmaskieren<br />
; modifizierten Accu sichern in r0<br />
; 1. Tastenwert subtrahieren<br />
; falls passend > Zero-Flag gesetzt & Sprung S1<br />
; modifizierten Tastenport zurückholen<br />
; 2. Tastenwert subtrahieren<br />
; falls passend > Zero-Flag gesetzt & Sprung S2<br />
; usw<br />
; falls passend > Zero-Flag gesetzt & Sprung S3<br />
mov a,r0<br />
; usw<br />
subb a,#8<br />
jz S4<br />
; falls passend > Zero-Flag gesetzt & Sprung S4<br />
jmp start ; wieder zum Start ...<br />
S1: mov p1,#11111110B<br />
mov th0,#0f8H<br />
mov tl0,#089H<br />
jmp go<br />
S2: mov p1,#11111101B<br />
mov th0,#0f9H<br />
mov tl0,#05aH<br />
jmp go<br />
S3: mov p1,#11111011B<br />
mov th0,#0faH<br />
mov tl0,#014H<br />
jmp go<br />
S4: mov p1,#11110111B<br />
mov th0,#0faH<br />
mov tl0,#069H<br />
; C<br />
; D<br />
; E<br />
; F<br />
go: setb tr0 ; Timer 0 starten<br />
warten: jnb tf0, warten ; warten bis Timer 0 = 0000 (Overflow)<br />
clr tr0<br />
; Timer 0 anhalten<br />
clr tf0<br />
; Überlauf-Bit rücksetzen<br />
cpl p3.5<br />
; Lautsprecherausgang invertieren<br />
jmp start<br />
end<br />
Seite 6 <strong>von</strong> 6