define temp ad [1] ' nimmt die Temperaturwerte auf define druck ad [2] ' nimmt den Luftdruck auf define feucht ad [3] ' nimmt die Feuchtewerte auf define laut ad [4] ' nimmt Schallereignisse auf define klingel ad [8] ' prüft das Lineinterface auf Klingelzeichen define skip port [1] ' bereitet Fastforward vor define reset port [2] ' setzt die Soundausgabe zurck define play port [3] ' pulst die Wiedergabe ISD2560 define eom port [4] ' setzt End of message (EOM) define abgehoben port [5] ' hebt Telefon ab oder legt auf define i2cirq port [6] ' entdeckt Interrupt von I2C define clock port [7] ' clockt die I2C - Leitung (SCL) define data port [8] ' setzt die Dataleitung (SDA) für I2C ' der MT 8880 Transceiver benötigt 8 ports define b3 port[9] ' Bit 3 an MT 8880 define b2 port[10] ' Bit 2 an MT 8880 define b1 port[11] ' Bit 1 an MT 8880 define b0 port[12] ' Bit 0 an MT 8880 define irq port[13] ' Interrupt für Callprogress define phi2 port[14] ' Takt für MT 8880 define rs0 port[15] ' Register select define rw port[16] ' Read / Write define vario word ' Variable für TABLE-Aufrufe usw. als Word define dtmf byte ' Variable für den DTMF - Ton (dezimal) define i byte ' Variable für for ... next usw. define j byte define teil byte ' Variable zur Segmentansteuerung Soundchip define merker byte ' merkt sich irgendeinen Wert define schreibe byte ' Variable für I2C-Bus define i2caus byte ' gibt Ergebnis vom I2C-Lesevorgang zurück define i2cein byte ' liefert die Schreibvariable für I2C-Bus define adresse byte ' Variable der I2C-Bus - Systemadresse define programm byte ' wurde in ein Programm verzweigt ? define alarm Bit[192] ' Variable für Alarmanlage ' ************** Ende Deklarationsteil ****************** #neustart ' kommt hierher nach Softwarereset print "Neustart" play = on skip = off reset = off i = 0 j = 0 teil = 0 merker = 0 programm = 0 vario = 0 dtmf = 0 abgehoben = off phi2 = on adresse = &H40 ' Rücksetzen des DTMF - Empfängers 8880 rs0=1:rw=0:b3=0:b2=0:b1=0:b0=0 rs0=1:rw=1 #warten if second = 59 then pulse data ' einmal die Minute ein Impuls if klingel > 100 then goto warten ' Klingelzeichen entdecken merker = merker + 1 print "Klingel: ";merker pause 50 if merker < 3 then goto warten print "Ruf angenommen" abgehoben=on #begruessung teil = 77 : gosub sagen ' Lallus teil = 18 : gosub sagen ' Hallo teil = 38 : gosub sagen ' Kennung teil = 46 : gosub sagen ' eingeben merker=0 #zugang deact b2 gosub dtmf if dtmf = 0 then goto zugang ' DTMF- Signal ? merker = merker + 1 ' Zugangscode hier 1 5 9 if merker = 1 and dtmf <> 1 then goto neustart if merker = 2 and dtmf <> 5 then goto neustart if merker = 3 and dtmf <> 9 then goto neustart if merker = 3 then goto berechtigt goto zugang #berechtigt print "berechtigt" merker = 0 : teil = 39 : gosub sagen ' willkommen pulse data ' Watchdog Erhaltung #MAIN gosub dtmf if dtmf = 0 then goto main if dtmf = 11 and merker = 1 then goto vorprogramm if merker = 1 and dtmf < > 11 then merker = 0 if dtmf = 11 then merker = 1 goto MAIN #vorprogramm teil = 16 : gosub sagen ' Programm teil = 47 : gosub sagen ' Nummer teil = 46 : gosub sagen ' eingeben #programmanfang gosub dtmf if dtmf = 0 then goto programmanfang print "bin im Programmanfang" if dtmf = 1 then goto VorUmwelt if dtmf = 2 then goto VorI2CTest if dtmf = 3 then goto Vortelefon if dtmf = 11 then goto programmende goto programmanfang TABLE telefon 1 2 99 TABEND #vortelefon teil = 23 : gosub sagen ' Telefon abgehoben = off : pause 100 abgehoben = on : pause 300 merker = 0 ' Register A und B schreiben phi2 = off : pause 1 rs0=1 : rw=0 : b3=1 : b2=1 : b1=0 : b0=1 : pulse phi2 rs0=1 : rw=0 : b3=0 : b2=0 : b1=0 : b0=0 : pulse phi2 for i = 0 to 20 looktab telefon , i , merker if merker = 99 then goto callprogress print merker; " " ; if merker = 0 then merker = 10 pause 2 rs0 = 0 : rw = 0 b3 = merker and (1 shl 3) ' b3=merker and 8 b2 = merker and (1 shl 2) ' b2=merker and 4 b1 = merker and (1 shl 1) ' b1=merker and 2 b0 = merker and (1 shl 0) ' b0=merker and 1 pulse phi2 : pause 3 if i=0 and merker = 0 then pause 50 ' Amtsholung pause 5 next i #callprogress ' Register A schreiben für call progress rs0=1 : rw=0 : b3=0 : b2 = 1 : b1= 1 : b0 = 1 : pulse phi2 : pause 2 pause 100 ' lange Pause lassen wegen Handyanruf (dauert länger, bis es sich meldet) merker = 0 : i = 0 : j = 0 #prozess pause 4 if not irq then merker = merker + 1 if irq and merker > 10 and merker < 25 then gosub frei if irq and merker > 2 and merker < 10 then gosub besetzt if irq then merker = 0 print merker if merker > 25 then goto rufok ' angenommen goto prozess #frei print "frei" j = j + 1 if j = 10 then goto neustart return #besetzt print "besetzt" i = i + 1 if i=5 then goto neustart return #rufok print "angenommen" merker = 0 : i = 0 : j = 0 gosub 8880_reset goto begruessung #vorumwelt teil=58 : gosub sagen ' Umwelt #umwelt gosub dtmf if dtmf = 0 then goto umwelt if dtmf = 1 then gosub temperatur ' if dtmf = 2 then gosub luftdruck ' if dtmf = 3 then gosub feuchte ' if dtmf = 4 then gosub schallpegel if dtmf = 11 then goto programmende goto umwelt #temperatur vario=0 'looktab Grad , temp , vario if vario < 0 then j = 1 else j = 0 vario = abs (vario) teil = 12 : gosub sagen ' Temperatur teil = 21 : if j = 1 then gosub sagen ' minus teil = vario / 100 + 1 : if teil > 1 then gosub sagen teil = (vario mod 100) / 10 + 1 : gosub sagen teil = 68 : gosub sagen ' Komma teil = (vario mod 100) mod 10 + 1 : gosub sagen teil = 33 : gosub sagen ' Grad return 'TABLE Grad "kty.dat" #VorI2CTest teil = 45 : gosub sagen ' Relais teil = 47 : gosub sagen ' Nummer teil = 46 : gosub sagen ' eingeben #I2Ctest gosub dtmf if dtmf = 0 then goto I2CTest if dtmf=11 then goto programmende if dtmf > 8 then goto I2CTest if dtmf = merker then gosub relaisumschalten gosub relaiszustandsagen goto i2Ctest #relaiszustandsagen merker=dtmf gosub lesen ' lese I2C-Bus teil = 45 : gosub sagen ' Relais teil = merker + 1 : gosub sagen ' sage Relaisnummer if i2caus and 1 shl (merker - 1) then teil = 29 else teil = 28 gosub sagen ' ein / aus return #relaisumschalten if i2caus and 1 shl (merker-1) then i2cein = i2caus - (i2caus and 1 shl (merker-1)) else i2cein = i2caus + 1 shl (merker -1) gosub schreiben return #programmende teil = 16 : gosub sagen ' Programm teil = 17 : gosub sagen ' Ende merker = 0 print"bin im Programmende" goto main ' ********* eingegangene DTMF - Töne untersuchen ************* #DTMF dtmf = 0 ' Empfangsregister auslesen, wenn nicht b2 dann zurück phi2 = on : pause 1 rs0=1 : rw=1 : pulse phi2 : if b2=off then return ' Bit 2 war gesetzt, jetzt den Wert auslesen rs0 = 0 : rw = 1 : pulse phi2 deact b3 : deact b2 : deact b1 : deact b0 dtmf = abs(b3) * 8 + abs(b2) * 4 + abs(b1)*2 + abs(b0) print "empfangener Wert:",dtmf teil = dtmf + 1 if dtmf = 10 then teil = 1 ' Null if dtmf = 11 then teil = 11 ' Stern if dtmf = 12 then teil = 19 ' Tschüß gosub sagen if dtmf = 12 then goto neustart return ' ************** Routine zur Sprachausgabe ISD 2560 **************** #sagen pulse reset ' setzt den Soundchip auf Anfang skip = on : pause 2 ' Fast Forward wird eingeschaltet for i = 1 to teil pulse play ' bis auf Nachricht xx durchtakten next skip = off : pause 1 ' Fast Forward wieder ausschalten pulse play ' Sprache auslösen wait not eom : pause 2 ' warten bis gesprochen return ' ****************** I2C - Routinen****************************** #LESEN gosub start schreibe = adresse + 1 : gosub putbyte : gosub getack gosub getbyte : gosub stop return #SCHREIBEN gosub start : schreibe = adresse : gosub putbyte : gosub getack schreibe = I2Cein : gosub putbyte : gosub getack : gosub stop return #START clock = 1 : data = 1 : data = 0 : clock = 0 return #STOP data = 0 : clock = 1 : data = 1 return #GETBYTE I2Caus = 0 for i = 7 to 0 step - 1 if data < > 0 then I2Caus = I2Caus + 1 shl i pulse clock next return #PUTBYTE for i = 7 to 0 step -1 if (schreibe and 1 shl i) = 0 then data = 0 else data = 1 pulse clock next return #GETACK data = 1 : deact data : wait not data : pulse clock return #GIVEACK data = 0 : pulse clock : data = 1 return ' ************** Rücksetzen des DTM-Transceivers ********** 8880_reset rs0=1:rw=0:b3=0:b2=0:b1=0:b0=0 rs0=1:rw=1 return