FUNKAMATEUR – Bauelementeinformation SL (1)610C SL (1)
FUNKAMATEUR – Bauelementeinformation SL (1)610C SL (1)
FUNKAMATEUR – Bauelementeinformation SL (1)610C SL (1)
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Listing 1: Die Software zur Ansteuerung des ML 2035/36<br />
über die Centronics-Schnittstelle eines PC<br />
‘**************************************************************<br />
‘ SOFTWARE ZUR ANSTEUERUNG DES ML 2036<br />
‘ PROGRAMMIERSPRACHE: POWERBASIC<br />
‘ ANSCHLUß AN CENTRONICSPORT LPT1<br />
‘ Anschlüsse ML2036 LPT1 (oder 2)<br />
‘ PD Datenbit 7 (Pin 9)<br />
‘ SID Datenbit D0 (Pin 2)<br />
‘ SCK Strobe (Pin 1)<br />
‘ LATI AUTOFEED (Pin 14)<br />
‘**************************************************************<br />
cls<br />
print “ **** SOFTWARE ZUR ANSTEUERUNG DES ML 2036 **** “<br />
print<br />
shared LPTXD%, LPTXC%<br />
shared FOUT<br />
call portadresse ‘ Portadresse wählen<br />
print<br />
‘ Hier kann das Hauptprogramm stehen<br />
‘ z.B.<br />
do<br />
cls<br />
print “ Funktionswahl “<br />
print “ 1 <strong>–</strong> Ausgabe einer konstanten Frequenz “<br />
print “ 2 <strong>–</strong> Wobbeln “<br />
print “ 3 <strong>–</strong> Programmende “<br />
input “ Ihre Wahl (1, 2 oder 3) ? “, FKT<br />
select case FKT<br />
case 1<br />
call EINE.FREQUENZ (FOUT)<br />
case 2<br />
call WOBBELN<br />
case 3<br />
end ‘ Programmende<br />
end select<br />
loop<br />
‘-------------------------------------------------------------------------------<br />
SUB WOBBELN<br />
input “untere Frequenz ? “, FMIN<br />
input “obere Frequenz ? “, FMAX<br />
input “Zeit in Sekunden bis zum nächsten Frequenzwechsel ? “, t<br />
do<br />
print “ich wobble, Abbruch mit einer Taste“<br />
for i= FMIN to FMAX STEP 0.5<br />
FOUT = i<br />
call SCHIEBEREGISTER (FOUT)<br />
delay t<br />
if instat then i=FMAX ‘ Test, ob Taste<br />
next i<br />
loop until instat ‘ Tastendruck beendet<br />
TASTE$=INKEY$ ‘ Wobbelfunktion<br />
END SUB<br />
‘-------------------------------------------------------------------------------<br />
SUB EINE.FREQUENZ (FOUT)<br />
FREQUENZ:<br />
input “Frequenz 0...32767.5 Hz (0,5-Hz-Schritte) ? “, FOUT<br />
if FOUT < 0 then goto FREQUENZ ‘ testen auf Grenzwert<br />
if FOUT >32767.5 then goto FREQUENZ<br />
call SCHIEBEREGISTER (FOUT)<br />
END SUB<br />
END<br />
‘-------------------------------------------------------------------------------<br />
SUB SCHIEBEREGISTER (FOUT)<br />
SCKHIGH% = 0 ‘ negiert<br />
SCKLOW% = 1<br />
LATIHIGH% = 1 ‘ verknüpft mit SCK, damit SCK<br />
LATILOW% = 3 ‘ bei LATI nicht beeinflußt wird<br />
SR& = FOUT*2 ‘ entspricht FOUT * 2^23/FCLKIN mit FCLKIN= 4194304 (Hz)<br />
‘ als Taktfrequenz SR=Schieberegisterwert des ML2035<br />
SRBYTE?=bits?(SR&) ‘ niederwertiges Byte abschneiden<br />
SRBYTE?=SRBYTE? AND 127 ‘ PD-Bit auf Low halten<br />
out LPTXD%, SRBYTE?<br />
out LPTXC%, SCKLOW%<br />
out LPTXC%, SCKHIGH% ‘ SCK takten, Bit übernehmen<br />
out LPTXC%, SCKLOW%<br />
for i=1 to 15 ‘ jetzt noch 15* schieben<br />
shift right SR&,1 ‘ macht dann 16 Bit<br />
SRBYTE?=bits?(SR&)<br />
SRBYTE?=SRBYTE? AND 127<br />
out LPTXD%, SRBYTE?<br />
out LPTXC%, SCKLOW% ‘ SCK takten, Bit übernehmen<br />
out LPTXC%, SCKHIGH%<br />
out LPTXC%, SCKLOW%<br />
next i<br />
out LPTXC%, LATIHIGH%<br />
out LPTXC%, LATILOW% ‘ LATI takten, Daten in<br />
out LPTXC%, LATIHIGH% ‘ ML2036-LATCH übernehmen<br />
END SUB<br />
‘-------------------------------------------------------------------------------<br />
SUB PORTADRESSE<br />
PORT:<br />
LPT1D%=&H378<br />
LPT1C%=&H37A<br />
LPT2D%=&H278<br />
LPT2C%=&H27A<br />
input “LPT1 oder LPT2 benutzen (1 oder 2 eingeben) ? “,LPT<br />
if LPT < 1 or LPT > 2 then goto PORT<br />
if LPT = 1 then LPTXD% = LPT1D% : LPTXC% = LPT1C%<br />
if LPT = 2 then LPTXD% = LPT2D% : LPTXC% = LPT2C%<br />
END SUB<br />
‘-------------------------------------------------------------------------------<br />
Listing 2: Unterprogramm für die 8031/51-Familie<br />
; ======== MODUL für ML2035/2036 ========<br />
Praktische Elektronik<br />
; Funktion : serielles Interface für programmierbare<br />
; Sinusgeneratoren ML2035 und ML 2036<br />
; Prozessor : 80C31 / 80C32 und kompatible<br />
; EPROM : ab 0000H ...<br />
; RAM : kein externer RAM erforderlich<br />
; Anschlüsse :<br />
; Controller Port1 ML2035 / ML2036<br />
; P1.7 PD<br />
; P1.0 SID<br />
; P1.1 SCK<br />
; P1.2 LATI<br />
; Register : Register der aktiven Bank<br />
; R0 Low-Byte für Frequenz<br />
; R1 High-Byte für Frequenz<br />
; R3 Bitzähler (16 Bit)<br />
; Vereinbarungen<br />
; Spezialfunktionsregister SFR:<br />
ACC equ 0E0H ; Akku<br />
P1 equ 090H ; Port 1<br />
SP equ 081H ; Stackpointer<br />
;<br />
LFREQ equ 11H ; Low- und Highbyte Frequenz<br />
HFREQ equ 22H ; werden hier nur zu Testzwecken festgelegt,<br />
; sonst kommen diese Werte von anderen Programmteilen<br />
.org $0 ; Startadresse<br />
ljmp START<br />
; hier folgen die Startadressen für die Interrupts<br />
; ...<br />
; -------------------------------------------------------------------------------<br />
; Programmstart ab 100H, irgendwo muß es ja losgehen<br />
.org 100H<br />
START mov SP,#40H ; Stackpointer —> oberer RAM<br />
; Port 1 initialisieren, zur Übersichtlichkeit einzeln<br />
clr P1.0 ; Datenbit = 0<br />
clr P1.1 ; SCK = 0<br />
clr P1.2 ; LATI = 0<br />
clr P1.7 ; PD = 0 —> aktiv<br />
; ... hier stehen evtl. andere Programmteile<br />
; -------------------------------------------------------------------------------<br />
; Hauptprogramm zur Demonstration als unendliche Schleife<br />
ML2036 lcall POWDN ; ML2036 in Power-down-Modus<br />
; ... hier können noch andere Befehle stehen<br />
lcall NOTPDN ; Power-down aufheben<br />
; zur Demonstration laden wir hier R0 und R1 mit Direktwerten<br />
mov R0,LFREQ ; Lowbyte für Frequenz in R0<br />
mov R1,HFREQ ; Highbyte für Frequenz in R1<br />
lcall SERIF ; Unterprogr. zur Übergabe der<br />
; Frequenzdaten aufrufen<br />
; ... hier können noch andere Befehle stehen<br />
sjmp ML2036 ; relativer Sprung zurück<br />
; -------------------------------------------------------------------------------<br />
; serielles Interface<br />
SERIF mov R3,#10H ; Bytezähler auf 8 für Low-Byte<br />
mov ACC,R0 ; Lowbyte holen<br />
LBYTE clr P1.0<br />
jnb ACC.0,TAKT1 ; teste Akkubit 0, Sprung bei Low<br />
setb P1.0 ; Akkubit war H —> P1.0 kopieren<br />
TAKT1 setb P1.1 ; SCK takten<br />
clr P1.1<br />
rr A ; Akkuinhalt schieben<br />
djnz R3, LBYTE ; Bitzähler erniedrigen und Sprung zurück,<br />
; wenn noch nicht 0, das ganze nochmal für Highbyte<br />
mov R3,#10H ; Bytezähler auf 8 für High-Byte<br />
mov ACC,R1 ; Highbyte holen<br />
HBYTE clr P1.0<br />
jnb ACC.0,TAKT2 ; teste Akkubit 0, Sprung bei Low<br />
setb P1.0 ; Akkubit war H —> P1.0 kopieren<br />
TAKT2 setb P1.1 ; SCK takten<br />
clr P1.1<br />
rr A ; Akkuinhalt schieben<br />
djnz R3, LBYTE ; Bitzähler erniedrigen und Sprung zurück,<br />
; wenn noch nicht 0, alle Bits übergeben,<br />
; in Latch des ML2036 schreiben<br />
setb P1.2 ; LATI takten<br />
clr P1.2<br />
ret<br />
; -------------------------------------------------------------------------------<br />
; die Unterprogramme zur Power-down-Steuerung<br />
POWDN setb P1.7 ; Power down PD auf H<br />
mov R0,00H ; 0000H als PD-Wert<br />
mov R1,00H<br />
lcall serif ; serielles Interface<br />
ret<br />
NOTPDN clr P1.7 ; ML 2036 aktivieren PD auf Low<br />
ret<br />
; -------------------------------------------------------------------------------<br />
FA 4/95 • 385