21.11.2013 Aufrufe

Thema: Erzeugung von Rechtecksignalen - Elektrotechnik

Thema: Erzeugung von Rechtecksignalen - Elektrotechnik

Thema: Erzeugung von Rechtecksignalen - Elektrotechnik

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!