CN1064808C - 用于蜂窝式无线电收发机系统的自诊断系统 - Google Patents
用于蜂窝式无线电收发机系统的自诊断系统 Download PDFInfo
- Publication number
- CN1064808C CN1064808C CN94191585A CN94191585A CN1064808C CN 1064808 C CN1064808 C CN 1064808C CN 94191585 A CN94191585 A CN 94191585A CN 94191585 A CN94191585 A CN 94191585A CN 1064808 C CN1064808 C CN 1064808C
- Authority
- CN
- China
- Prior art keywords
- mov
- call
- cellular
- transceiver
- dtmf
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04W—WIRELESS COMMUNICATION NETWORKS
- H04W24/00—Supervisory, monitoring or testing arrangements
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04W—WIRELESS COMMUNICATION NETWORKS
- H04W84/00—Network topologies
- H04W84/02—Hierarchically pre-organised networks, e.g. paging networks, cellular networks, WLAN [Wireless Local Area Network] or WLL [Wireless Local Loop]
- H04W84/10—Small scale networks; Flat hierarchical networks
- H04W84/14—WLL [Wireless Local Loop]; RLL [Radio Local Loop]
Landscapes
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Engineering & Computer Science (AREA)
- Mobile Radio Communication Systems (AREA)
- Monitoring And Testing Of Transmission In General (AREA)
- Transceivers (AREA)
- Radar Systems Or Details Thereof (AREA)
- Telephonic Communication Services (AREA)
- Telephone Function (AREA)
- Measurement Of Velocity Or Position Using Acoustic Or Ultrasonic Waves (AREA)
- Maintenance And Management Of Digital Transmission (AREA)
- Reduction Or Emphasis Of Bandwidth Of Signals (AREA)
- Circuits Of Receivers In General (AREA)
- Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)
Abstract
一种自诊断系统,它用于检查带有蜂窝式接口装置的蜂窝式无线电收发机,所说的接口装置将标准的电话机连接于蜂窝式收发机,并且将DTMF或脉冲式拨号信号转换成数字格式以便传输给收发机,在该收发机中,可以使用陆用电话上拨出的号码去呼叫蜂窝系统范围内的号码。本发明不仅可监控和检查收发机及其相关电源的适当功能,而且可以监控和检查上述接口装置。
Description
本专利文献所公开内容的一部分包含了受版权保护的资料。当本专利文献或专利公开内容披露在专利及商标局(Patent&Trademark Office)的文件或资料中时,本版权拥用人不反对对其任何一部分进行复制,但在任何情况下均保留版权。
背景技术
本发明涉及到一种用于检验蜂窝式无线电收发机系统的所有功能的自诊断系统。本发明特别涉及诸如美国专利第4,658,096号和4,737,975号所公开的蜂窝式接口系统。本文包括了上述专利所公开的系统以作为参考。在上述专利的系统中,一接口装置将标准的电话机、传真机、调制解调器或其它通信设备连接于蜂窝或蜂窝式无线电收发机,该接口装置能使上述通讯设备经由无线电收发机作正常的操作。所说的接口装置还可将DTMF或脉冲式拨号信号转换成数字格式以便传递给无线电收发机,因此,通过该无线电收发机可利用所拨的号码来呼叫无线电系统范围内的号码。本发明的系统可检测上述适配器接口装置的所有功能的正常运转以及其它特征,如无线电收发机的功率输出或该无线电收发机正在使用时的频率等,来自无线电收发机的信号或来自无线电网络的信号可以改变上述功率输出,而无线电收发机或蜂窝式网络则可有选择地改变前述频率。
本发明的诊断与检测系统可用于诸如纯蜂窝系统之类的任何蜂窝式系统或者诸如ISDN(综合业务数字网络)及其它个人通信系统之类的蜂窝式系统,在上述蜂窝式系统中设置有一蜂窝式适配器或接口装置以便将DTMF或脉冲式拨号信号转换成数字格式从而传递给与该蜂窝式系统相联的蜂窝式无线电收发机。
已知提供有用于整个蜂窝系统的诊断与检测设备。还已知提供有可自检测的机载装置。该机载装置公开于Rogers的美国专利第5,016,269号,此专利公开了一种蜂窝式电话的应急电话亭,本文包含了该专利以作为参考。上述专利公开了由电话亭自身执行的自诊断程序。该专利的电话亭中带有自诊断程序并定期性地将所检查到的作业状态经由蜂窝式网络报告给总局。Rogers公开了一种蜂窝式便携式手机和无线电收发机以及相关的自动诊断系统,该系统用于对所说的蜂窝式系统进行检查并报告给总局。但是,该专利未公开对诸如上述美国专利第4,658,096号和第4,737,975号中所使用的DTMF转换器的监控与自诊断功能,而且,Rogers也未说明从总局产生回铃以便对系统的适当作业进行检查。
除纯蜂窝系统以外,可使用本发明的蜂窝式系统是这样一些系统,它们一般涉及到无线数字个人通信系统(这些系统带有多个智能基地台和智能便携式手机终端,每个基地台和手机均具有预定的无线电信号覆盖面积),具体地说,它们涉及到数字无线电电话式个人通信系统(PCS),这种系统带有一全ISDN接口装置,从而便于PCS呼叫业务经由ISDN接口装置及公共电话交换网或任何交换网的连接和转换,所说的个人通信系统其有声音/数据/图像(或它们的组合形式)以及双路全双工呼入呼出能力,并且可充分加以使用,同时可与任何所选定的调制方法相兼容,而且与通过在软件中实现的分布式逻辑电路所设置的蜂窝间协议切换相兼容,所说的软件则驻留在便携式智能手机、智能基地台以及配备有PCS服务控制数据库的公共电话交换网(或任何交换网)中。
在过去十年内,移动式及便携式通信日益增加的可用性使商业及住宅用户正在摆脱完全有线的电信网络的束缚。具体地说,蜂窝式通信系统连同寻呼及其它附加业务第一次使得电信业务有了真正的可移动性。移动与便携技术以及诸如无线电信数字传输之类新技术方面的重大技术进步业已显著地增加了使用用户可以利用的无线电频谱的无线电信服务的数量和类型。这些未来的服务包括但不局限于蜂窝式电话服务的高级形式、高级数字式无线电话服务、便携式传真服务、无线交换台、无线专用支局服务以及无线局域网服务,并且,可以通过现有的公共交换网或通过可替代的局部有线网(如电缆电视)来使用上述未来的服务。因此,数字或个人通信系统可独立于有线局域网而存在,也可与有线局域网共存,从而填补了当前通信系统中的空白,并且,还能形成新的市场,这些市场中的多数是尚未明朗化的。PCS的出现通过显著地改进所有电信网的灵活性与功能,从而对它们的开发与结构产生巨大的影响。所以,PCS的供应商能在全国范围内以经济和快捷的方式获得并服务于现有及新的市场。
用于用户日益增加的流动性,美国个人通信的要求正在随着对即时通信的需求的增加而迅速改变。PCS的优点之一在于这种系统能用单一的通信设备在任何时间、任何地点与任何人进行联系。PCS会促进用户日益增加的流动性和灵活性,这是因为,这种方法能解决与用户进行稳定通信中所存在的潜在问题。PCS的无线化能使得用户不会错过重要的呼叫,并且减小回话时的时间和费用。PCS将无线电的功能与公共电话交换网(PSTN)技术和基本设施结合起来并且能提供无线电蜂窝间的全双工能力(双向呼出)以及切换(从而使得用户在不中断通话的情况下自由地从一个无线电蜂窝移至另一个无线电蜂窝)。注意到以下实事是很重要的:对于新型PCS设施和用于多种(有时是相矛盾的)应用即无线电专用交换支局、小型轻质蜂窝式便携电话、便携式传真机、多通路无绳电话以及目的在于便于与特定个人用户进行联络(而不是与特定电台进行联络)的辅助设施的需求正在持续地增加。目前所提供的无线电设备及相关的设施(即无绳电话、无线电寻呼以及蜂窝式无线电话)无法完全满足对上述新型PCS设施的要求。例如,无绳电话只能在家庭或办公室内及周围使用并且只能处理非常少的信道(10个左右),这些信道拥挤在一起并只限于在与它们相联的基地台附近使用。无线电寻呼设施仅仅是单向的并且容量有限。蜂窝式及专门的移动式无线电设施无法满足所有对PCS的预期要求。随着时间的推移,PCS会具有标准化的设备,这种设备在硬件方面带有通用的组件,从而能在不受外部信号源瞬时干扰的相关设备方面提高了可靠性,并且,PCS带有自动通话登记、自动通话发送、语音邮件、传真能力、方便的漫游特征、远程数据传送、增加了的保密性/主叫用户的ID/分级设施、增加了的电池寿命以及通用协议。为了能最佳地实现这种市场授权,数字式PCS是一种必需的设备。无线PCS最终会不需要有用于通讯的用硬电缆相连的建筑设施。一般地说,PCS会简化带有辅助特征的通信设备。数字式PCS会便于改进技术性的通信设备、系统与装置。
所以,本发明可在设置有蜂窝式适配器或接口插板的ISDN或其它PCS系统中使用,所说的适配器或接口插板通过将DTMF或脉冲信号转换成可发送给PCS无线电收发机的数字格式或者通过提供所述系统专用的其它功能,从而允许在系统内使用标准的陆用电话机或其它通信设备。例如,在无线电收发机只能进行呼出的专用报警系统中,接口装置不必提供响铃、忙音或类似的信号。另外,在只需呼入的系统中,接口装置不必将拨号的DTMF或脉冲信号转换成数字格式。正如美国专利第4,658,096号和第4,737,975号所述的蜂窝接口插板那样,PCS-蜂窝适配器还提供诸如产生拨号音、振铃或类似信号之类的全部所需的其它功能。
发明概要
所以,本发明的基本目的是提供一种自诊断系统,这种系统用于检测带有蜂窝式接口装置的蜂窝式无线电收发系统的所有功能,所说的接口装置将标准的陆用电话机或其它通信设备连接于蜂窝无线电收发机或者连接于诸如蜂窝式PCS或ISDN无线电收发机,并且,所说的接口装置还将DTMF或脉冲式拨号信号转换成数字式以便传送给蜂窝或蜂窝式无线电收发机,从而,可以使用在陆用电话机或与其相当的设备上所拨叫的号码去呼叫上述蜂窝或蜂窝式系统范围内的号码。本发明不仅能监控和检测蜂窝或蜂窝式无线电收发机及相关电源和类似设备的适当功能,而且会监控和检测蜂窝或蜂窝式接口装置。
本发明的检测设备能与接口装置相连,此接口装置则将通信设备连接于无线电收发机,以便通过该收发机呼入或接收呼叫,所说的检测设备带有自身的诊断程序,从而能监控并报告接口装置的适当功能。
上述检测设备还可将诊断程序连接于接口装置,该诊断程序模拟诸如陆用通信电话、传真机、调制解调器以及类似设备之类的通信设备所执行的功能,以便在接口装置内产生各种相应的应答,从而确定该接口装置是否在正常的操作。
上述检测设备还会对接口装置产生摘机信号,并检测接口装置因响应摘机信号而产生的拨号音信号是否出现。
上述检测设备还生成DTMF信号并将该信号传送给接口装置,并且检测接口装置因响应所生成的DTMF信号而输出的DTMF信号。
上述检测设备还会对接口装置产生挂机信号,并且在接口装置正在生成振铃信号时对该接口装置产生摘机信号,以便确定接口装置在应答电话呼入时能适时地断开振铃信号。上述检测设备还能在接口装置连接于无线电收发机时通过电话网产生电话呼出并送回给该无线电收发机,从而,所说的诊断程序会使得收发机呼叫自己,并且,该诊断程序检测收发机因响应上述呼叫而产生的忙音信号。
参照附图将很容易地理解本发明,在附图中:
图1A和图1B显示了本发明的自检测所包含的步骤的总体流程图;
图2是显示本发明的自检测摘机子例程所包含的步骤的流程图;
图3是显示本发明的自检测拨号音生成子例程所包含的步骤的流程图;
图4是显示本发明的自检测DTMF音生成子例程所包含的步骤的流程图;
图5A至图5C显示了本发明的自检测振铃生成子例程所包含的步骤的流程图;
图6是显示本发明的自检测应答振铃过程子例程所包含的步骤的流程图;
图7A与图7B是显示本发明的通话检测子例程所包含的步骤的流程图,该子例程检查适当的通话检测以及对呼入的应答。
图8A和图8B显示了本发明的出错码生成子例程;
图9是显示本发明的重置子例程的流程图;
图10是本发明的系统的框图;
图11至图14是显示用于通过模拟所需检测的事件而检测蜂窝或蜂窝式接口及收发机的各种电路的概略图。
发明的详细公开
本发明的自动诊断维护系统可用于诸如美国专利第4,658,096号和第4,737,975号所公开的蜂窝或蜂窝式接口插板及系统。此外,本发明的自诊断维护系统还可以供诸如IMTS之类的其它无线电收发机系统使用,在这类系统中,提供了基地台与主控台之间的无线通讯,并且,无线电收发机与诸如美国专利第4,658,096和第4,737,975号所公开的适配器接口插板相连,这种接口插板则将诸如陆用通讯电话、传真机、调制解调器或类似设备之类的通信器材连接于所说的无线电收发机并使这些通信器材正常地发挥功能。上述接口装置根据预定的用途而提供多种功能。例如,在无线电收发机只进行呼出的专用报警系统中,接口装置就不必向通信设备产生振铃、产生忙音信号以及类似的信号。另外,在只需要有呼入的系统中,接口装置不必将拨号的DTMF或脉冲信号转换成数字格式。依照本发明,提供了一种软件,这种软件与美国专利第4,658,096号和4,737,975号所公开的蜂窝接口插板或其它无线电收发机接口插板的微处理器相通讯,这种软件可人工或自动地启动以便启动本发明的自动诊断接口插板,并且,这种软件可以诊断上述专利的整个系统内所包括的全部软件和硬件系统的适当功能。可以检测每个单一的项目。例如,对接口插板来说,可以检测DTMF转换器,与两线路接头相连的四线路接口、忙音软件以及接口的其它功能。此外,还会检测无线电收发机、电池以及接口的其它方面。本发明的维护系统能在蜂窝或蜂窝式网络范围内呼叫中心台或基地台的预定电话号码,然后,中心台可发回一个回音或者拨叫接口系统的当前号码以获得忙音信号。这种情况被看做是一次检测。本发明还能在蜂窝或蜂窝式系统的范围内发送另一个电码号码以呼叫相同或不同的中心台,因而,该中心台可发回一个1000Hz的精确单音,从而,本发明的软件会比较上述1000Hz的单音与其自身预定的配置,以便确定线路是否接通以及蜂窝或蜂窝式系统是否在正确地运行。这是一种特别有用的系统,因为,即使最终用户认为电话有问题,该系统也能使该用户使用电话。然后,这种检测会通知电话公司:是蜂窝系统的中心局有错还是最终用户的基本装置有问题。
依照本发明,有两种不同的组件,第一种是遥测维护(telemaintenance)电路,第二种是遥测计费(teletariff)电路。遥测维护电路进行将如以下详细说明的复合检测,该复合检测包括对预定的号码进行电话呼叫。遥测维护电路将检测的结果报告给上述特定的号码。此外,遥测维护电路还能拨叫自己的号码以便确认所述基本装置通过接收忙音信号而正在进行接收和传输。用户按下位于基本装置一侧的按钮可以启动上述的成组的检测。在按下按钮时,按钮附近的LED(发光二级管)会持续地闪烁以表示检测正在进行。如果在检测结束时LED仍继续闪亮,这就表示所述的基本装置有问题。上述检测活动一般最多不超过40秒钟。另一方面,如果LED停止闪亮并且关闭,就表示检测成功并且基本装置在检测所检查的项目方面处于适当的工作状态。作为一种可选择方案,如果传输介质允许的话(即无线电收发机处于工作状态以接收电话号码),那么,前述软件和硬件就能使得用一外部号码来进行所说的检测。
第二种电路的功能包括:它使用来自蜂窝或蜂窝式系统的计费信号并产生用于标准的台式电话或付费电话的相应的计费脉冲。这种设备判读来自蜂窝或蜂窝式的信号并且不作任何的局内计费。这种电路以与产生长音相类似的方式运行,并且可供能发送计费信号的任何蜂窝或蜂窝式系统使用。
对遥测维护程序组件流程的说明
用户可以通过按下自诊断按钮而激活检测工作程序。当被调用时,按口插板的控制权被转交给用于进行自动检测的遥测维护组件的主自诊断子例程。
图1A和图1B显示了DO_TEST例程或主自诊断例程。对各种检测过程进行多次调用。每一过程之后都检查出错标识。在有任何出错的情况下都停止检测程序。然后,对其状态进行编码并按如下所述那样将结果通过四个LED显示给用户。
参照图1A,在步骤1中,检测工作程序以初始化变量和标识开始。在步骤2中,程序调用Hook_Test子例程。在Hook_Test子例程中,用户的电话与塞尖和塞环(TIP及RING)线是断开的,而遥测维护组件(Telemaintenance Module,以下将予以详细说明)则在适当位置处与诸如美国专利第4,658,096号和第4,737,975号所公开的接口插板相连以准备进行检测。步骤3检查Hook_Test中所检测到的任何错误。如果发现有任何一种错误,该检测程序就会停止,程序会进入图1B中的步骤14。但是,如果未检测到错误,程序就会在步骤4中调用Dial_Tone测试例程。步骤5检查任何的拨号者错误。如果发现有任何一种错误,该检测程序就会停止,程序会进入图1B中的步骤14。但是,如果未检测到错误,程序就会在步骤6中调用下一个检测例程即步骤6的DTMF_Test例程。程序在图1B的步骤7处继续,在该步骤处,检查任何一种DTMF_Tone例程。如果发现有任何一种错误,该检测程序就会停止,程序会进入步骤14。但是,如果未检测到错误,程序就会在步骤8中调用下一个检测例程即步骤8的Ring_Test例程。步骤9检查任何的振铃错误。如果发现有任何一种错误,该检测程序就会停止,程序会进入步骤14。但是,如果未检测到错误,程序就会在步骤10中调用下一个检测例程即Ring_Answer_Test例程。步骤11检查任何的振铃应答错误。如果发现有任何的错误,该检测程序就会停止,程序会进入步骤14。但是,如果未检测到错误,程序就会在步骤12中调用下一个检测例程即步骤12中的Make_Call_Test例程。步骤13检查任何的呼出错误。如果发现有任何一种错误,该检测程序就会停止,程序会进入步骤14。但是,如果未检测到错误,程序就会在步骤15调用下一个检测例程即步骤15的Fin_Self_Test例程。如果在执行任一子例程的过程中发现有任何的错误,程序就会转至步骤14。在步骤14中,程序会调用Error_Acc例程。最后,检测程序在步骤15清除了所有的变量和标识之后结束,从而将控制权交还给电话机并且继续接口的正常操作。
以下对图2至图9的解释对应于并且详细说明了上述各个检测例程。
参照图2,Hook_Test例程(图1A的步骤2)在步骤16处开始于对变量和标识的初始化。在步骤17中,程序清除LED的任何输出。在步骤18中,使用户的电话与接口板的TIP和RING线相断开,而在步骤19中,本发明的遥测维护组件则替代电话而被连接。步骤20进行延时以便上述连接有足够的反应时间。在步骤21中,本发明的遥测维护组件模拟并产生摘机。步骤22进行延时以便有足够的时间进行上述摘机。在步骤23中,程序检查接口插板的叉簧状态,而接口板则与遥测维护组件相连。步骤24对摘机进行检测。如果未检测到摘机,则程序进入步骤25,在该步骤中设置ERROR_FLAG并将MATN_FLAG_ERROR置为1。但是,如果未检测到错误,程序就会进入到步骤26,在该步骤中,启动拨号音以便进行图3所示的下一步检测。最后,Hook_Test例程结束,程序返回至图1A和图1B中的主例程DO_Test。
参照图3,Dial_Test例程在步骤27处开始于对变量及标识的初始化。步骤28进行延时以便有足够的时间产生拨号音。步骤29对拨号音进行检测。如果拨号音出错,则程序进行步骤30,在步骤30中设置ERROR_FLAG并将MAIN_FLAG_ERROR置为3。但是,如果未检测到错误,程序就会进入步骤31,在该步骤中,程序循环返回至步骤29以检测拨号音至少711毫秒。711毫秒结束后未检测到错误,Dial_test例程结束,程序返回至图1A和图1B的主例程Do_Test。
参照图4,用于检测接口板将适当的DTMF转换成数字数据的DTMF_Test例程通过关闭来自前一个检测例程的拨号音而在步骤32开始。步骤33将第一个DTMF音置为0。在步骤34中,遥测维护组件送出与上述值相对应的DTMF音。步骤35进行延时以便使上述DTMF音延续足够的时间。步骤36断开DTMF音。步骤37进行延时以使得接口装置检测DTMF音的脉冲。在步骤38中,接口装置读取DTMF音。步骤39检查所接收到的DTMF音。如果所送出的DTMF音不等于接收到的DTMF音,或者未接收到DTMF音,那么,程序就会进入步骤40,在该步骤中设置ERROR_FLAG并且将MAIN_FLAG_ERROR置为4。但是,如果上述两个DTMF音是相同的,则程序进入步骤41并选定下一个DTMF数字。在步骤42中,程序检验是否已检测了所有的DTMF音,如果没有,则程序循还返回以检测下一个DTMF数字。最的,在已检测了所有的DTMF音之后,DTMF_Test例程结束,程序返回至图1A和图1B中的主例程DO_Test。
参照图5A和图5B,它们显示了Ring_Test例程。Ring_Test例程检测接口插板振铃电路所产生的振铃的两个脉冲的定时。参照图5A,Ring_Test例程在步骤43处开始于对变量和标记的初始化。在步骤44中,遥测维护组件进行一次挂机。步骤45进行延时以便接口装置检测上述挂机。在步骤46处,设置接口装置以确认正在进行呼入,所以,该接口板产生振铃。步骤47至步骤53的目的是:验证振铃开始于以后的两秒钟内并且未检测到摘机。在步骤47中,将计时器清零。步骤48对摘机进行检测。如果检测到摘机,则停止检测,程序转至图5C中的步骤49以显示错误。但是,如果检测到挂机,则程序进入步骤51,在该步骤中,遥测维护组件检查振铃的被激励。步骤52检测振铃是否已开始。如果已开始振铃,则程序进入图5B的步骤54。但是,如果尚未开始振铃,则程序会在步骤53中检查计时器。如果该计时器的时间小于两秒,则程序循环返回步骤48直至振铃开始。但是,如果上述两秒钟的计时器已完成计时,则检测就会停止,程序转至图5C中的步骤49以指示错误。参照图5B,步骤54进行延时。步骤55至步骤59的目的是检验振铃持续至少一次,长度为1.3秒,并且检验未检测到摘机。在步骤55中,将计时器清零。步骤56对挂机进行检测。如果检测到摘机,则检测停止,程序转至图5C中的步骤49以指示错误,但是,如果检测到挂机,则程序进入步骤57,在该步骤中,遥测维护组件检查被激励的振铃。步骤58检测振铃是否已停止。如果振铃已停,则程序进入图5B中的步骤49。但是,如果振铃尚未停止,则程序在步骤59内检查计时器。如果计时器小于1.3秒,则程序循环返回至步骤56直至振铃停止。但是,如果计时器完成计时,则检测停止,程序转至图5C中的步骤49。步骤60至步骤62的目的是检验振铃持续不超过2.5秒。在步骤60中,遥测维护组件检查振铃是否是被激励的。步骤61检测振铃是否已经停止。如果振铃停止,则程序转至图5C中的步骤63。但是,如果振铃尚未停止,则程序在步骤62中检查计时器。如果计时器小于2.5秒,则程序会循环返回步骤60直至振铃停止。但是,如果计时器完成了计时,则检测停止,程序转至图5C中的步骤49。
参照图5C,步骤63至步骤65的目的是检验在两秒钟的时间内未检测到摘机。在步骤63中,将计时器清零。步骤46对挂机进行检测。如果检测到摘机,则检测停止,程序在步骤49处继续以指示错误。但是,如果未检测到摘机,则程序在步骤65中检查计时器。如果计时器小于两秒,则程序会循环返回步骤64直至振铃开始。但是,如果计时器完成了计时,则程序在步骤66处继续,在该步骤中,程序检测本子例程业已进行了多少次检测振铃循环。如果只对振铃检测了一次,则程序在步骤64处继续,在该步骤中,设置标识Ring_Second。此后,程序循环返回至步骤47以便第二次检测振铃。但是,如果已对振铃检测了两次,则本例程结束,程序返回至主例程Do_Test。如果在Ring_Test例程的任何一部分中检测到错误,则程序会转至步骤49。步骤49清除呼入状态,所以,振铃停止。然后,程序在步骤50处继续,在该步骤中,设置ERROR_FLAG并将MAIN_FLAG_ERROR置为5。然后,本例程结束,程序返回至主例程Do_Test。
参照图6,它显示了Ring_Answer_Test例程。当应答呼入的电话时,本例程检测在振铃期间将摘机信号传给接口插板时该接口板的响应。步骤68至步骤69的目的是检验振铃将在以后的两秒钟内开始并且未检测至摘机。在步骤68中,将计时器清零。步骤69对挂机进行检测。如果检测到摘机,则检测停止,程序转至步骤73。但是,如果检测到挂机,则程序继续并且振铃是处于被激励的。步骤71检测是否已开始振铃。如果已开始振铃,则程序进入步骤74。但是,如果尚未开始振铃,则程序会在步骤72处检查计时器。如果计时器少于两秒,则程序循环返回至步骤69以等待振铃开始。但是,如果上述的两秒计时器已完成了计时,则检测停止,程序转至步骤73。在步骤74中,遥测维护组件产生一次摘机。步骤75进行延时以便使接口板检测上述摘机。在步骤76中,接口板检查叉簧的状态。如果在步骤77中未检测到摘机,则检测停止,程序转至步骤73。但是,如果接口板检测到摘机,则程序在步骤78处继续。如果在Ring_Answer_Test例程的任何一部分中检测到了错误,则程序转至步骤73,在该步骤中,设置ERROR_FLAG并且将MAIN_FLAG_ERROR置为6。然后,程序在步骤78处继续。在步骤78中,清除呼入状态,所以,接口插板会使振铃停止。此后,本例程结束,程序返回到主例程Do_Test。
参照图7A和图7B,它们显示了Call_Test例程。该例程按下述方式检测与接口板相连的蜂窝或蜂窝式无线电收发机:首先检查电源,然后产生一个呼叫自身的电话号码。参照图7A,步骤79检查收发机的电源是否“接通”,如果电源是“断开”的,则在步骤81中将MAIN_FLAG_ERROR置为1,然后程序转至图7B中的步骤93。但是,如果电源是“接通”的,则程序进入步骤82,在该步骤中,接口板请求并获取收发机所指定的电话号码。步骤83进行延时以提供用于收发机的应答时间。在步骤84中,接口板对自己进行电话呼叫。步骤85进行延时以便接通蜂窝或蜂窝式网络与无线电收发机。在步骤86中,接口板向收发机请求IN USE(使用中)状态。步骤87检查呼叫的状态。如果该状态不是IN USE,则在步骤88中将MAIN1_FLAG_ERROR置为4,然后程序转至图7B中的步骤93。但是,如果收发机处于IN USE状态,则程序进入图7B的步骤89。在图7B中,遥测维护组件在步骤89中检查。如果在步骤90中检测到忙音,则程序转至步骤93以指示所有的装置均在正确运行。但是,如果未检测到忙音,则程序进入步骤91,在该步骤中检查计时器。如果计时器少于18.2秒,则程序循环返回步骤86。这就使蜂窝或蜂窝式网络有更多的时间返回忙时响应。但是,如果计时器结束了计时,则程序进入步骤92,在该步骤中将MAIN_FLAG_ERROR置为3。在步骤93中,接口板向收发机发送一呼叫END(结束标志)。然后,遥测维护组件在步骤94中向接口板提供一挂机信号。最后,Call_Test例程结束,程序返回至主例程Do_Test。
图8A和图8B的目的是以能通过LED在以后输出其结果的方式根据前述错误标识来生成一个ERROR_CODE。参照图8A,此例程开始于检查两个错误标识中的一个即MAIN_FLAG_ERROR。步骤95检查MAIN_FLAG_ERROR是否等于1或叉簧SLIC错误(Hook Slic Error)。如果相等,则在步骤96中将ERROR_CODE置为1,然后程序返回主例程Do_Test。但是,如果不相等,则程序在步骤97处继续。步骤97检查MAIN_FLAG_ERROR是否等于2或叉簧振铃错误(Hook_Ring Error)。如果相等,则在步骤98中将ERROR_CODE置为2,然后程序返回至主例程Do_Test。但是,如果不相等,则程序在步骤99处继续。步骤99检查MAIN_FLAG_ERROR是否等于3或拨号音错误(Dial_Tone_Error)。如果相等,则在步骤100中将ERROR_CODE置为3,然后程序返回至主例程Do_Test。但是,如果不相等,则程序在步骤101处继续。步骤101检查MAIN_FLAG_ERROR是否等于4或DIMF单音错误(DTMF Tone Error)。如果相等,则在步骤102中将ERROR_CODE置为4,然后程序返回至主例程Do_Test。但是,如果不相等,则程序在步骤103处继续。步骤103检查MAIN_FLAG_ERROR是否等于5或振铃检测错误(Ring_Detection_Error)。如果相等,则在步骤104中将ERROR_CODE置为5,然后程序返回至主例程Do_Test。但是,如果不相等,则程序在步骤105处继续。步骤105检查MAIN_FLAG_ERROR是否等于6或振铃应答错误(Ring_Answer_Error)。如果相等,则在步骤106中将ERROR_CODE置为6,然后程序返回主例程DoTest。如果不相等,则程序转向图8B的步骤107。在图8B中,例程开始于检查第二个出错标识的值即MAIN1_FLAG_ERROR。步骤107检查MAIN1_FLAG_ERROR是否等于1,或功率射频错误(Power_Radio Error)。如果相等,则在步骤108中将ERROR_CODE置为7,然后程序返回至主例程Do Test。但是,如果不相等,则程序在步骤109处继续。步骤109检查MAIN1_FLAG_ERROR是否等于2或呼叫错误(Call Error)。如果相等,则在步骤10中将ERROR_CODE置为8,然后程序返回至主例程Do_Test。但是,如果不相等,则程序在步骤111处继续。步骤111检查MAIN1_FLAG_ERROR是否等于3或忙音错误(Busy_ToneError)。如果相等,则在步骤123中将ERROR_CODE置为9,然后程序返回至主例程Do_Test。但是,如果不相等,程序就在步骤113处继续。步骤113检查MAIN1_FLAG_ERROR是否等于4或“使用中”错误(“In Use”Error)。如果相等,则在步骤114中将ERROR_CODE置为10,然后程序返回至主例程Do_Test。如果不相等,程序就会在步骤115处继续。步骤115检查MAIN1_FLAG_ERROR是否等于5或1000Hz错误(1000Hz Error)。如果相等,则在步骤116中将ERROR_CODE置为11,然后程序返回至主例程Do_Test。如果不相等,程序就会返回至主例程Do_Test。
参照图9的FIN_SELF例程,该例程的目的是将接口板重置为正常的功能并通过使LED闪亮四次而表示检测结束。FIN_SELF例程始于步骤117,在该步骤中,遥测维护组件产生一次挂机。在步骤118中,将所有的变量和错误标识均清零。步骤119关掉所有的LED。步骤120进行延时。步骤121接通所有的LED。步骤122进行延时。步骤123循还返回步骤119从而使LED闪亮四次。最后,步骤124关掉所有的LED,然后程序返回至图1A和图1B的主例程Do_Test。
以下说明本发明的操作情况,然后说明用于进行上述自检测的各个电路,再说明用于进行本文所述之操作的软件程序。
参照图10,它显示了遥测维护电路组件的框图,该组件总的用标号10表示。遥测维护电路组件10安装在诸如美国专利第4,658,096号和第4,737,975号所公开的蜂窝或蜂窝式适配器系统内,并被设计成能根据按钮的启动或根据每隔约12小时的自动检测而从电话用户的设备开始执行上述图1A至图9中流程图详细说明的自动检测。自检测的最终结果通过安装在蜂窝或蜂窝式适配器右侧壁面上的橙黄色发光器(LED)提供给用户。遥测维护电路组件10能将检测的结果报告给远距离服务中心。这种报告是通过自动呼叫预定的服务中心号码而实现的。这一功能要求服务中心配备有进行通信所需的硬件和软件并能判读接收到的报告。本发明的自诊断检测能检验蜂窝或蜂窝式适配器,包括其组件如接口卡的基本电路、无线电台设备与接口间的数据电缆、传输线、天线、蜂窝或蜂窝式无线电收发机、计费电路以及电源等的正确操作。遥测维护电路被配置成能够呼叫分配给正在进行检测的适配器收发机的相同号码。对自诊断电路编程以便将忙音和占线信号作为表示可以进行通话且传输电路正在正确运转的信号而加以检测。
遥测维护电路组件10设计成能在蜂窝或蜂窝式适配器装置中使用,以便在无需使技术人员到安装有设备的现场的情况下检验适配器装置是否在正确地运转。所说的蜂窝或蜂窝式接口板能直接地提供遥测维护电路组件10。高级的遥测维护电路不是自激电路(autonomous Circuit)。其操作取决于从蜂窝或蜂窝式接口板内的审查程序(auditor)中所接收的控制信号。审查程序将检测的结果与系统运行程序的参数作比较。遥测维护电路组件10的自诊断电路进行下列检测:应答错〔错误号〕,用两种可替代的方法来进行上述检测;振铃电压,自诊断电路进行一次呼叫并检测接口插板所产生的振铃电压的出现;呼叫应答,验证一旦进行了应答就使振铃停止;拨号音,验证拨号音的出现;MFTO操作,确保接口插板能适当地检测收到的MFTO(多频率声音检测器)单音;无线电收发机检测;接收电路检测;传输电路检测;计费电路检测,验证以12KHz产生的脉冲的频率特征;收发机电源;电源系统的性能。在对图1A至图9的说明中已详细叙述了这些检测活动。
遥测维护电路组件10可通过一具有20个位置的插接式连接器而与通常的蜂窝或蜂窝式接口插板相连。通过一安装在适配器箱右侧的手动开关可以启动检测例程。当发现电话操作不正常时,例如拿起听筒时听不到拨号音,用户可转向适配器箱并按下被适当标识的检测钮。遥测维护电路组件10会断开用户电话与蜂窝或蜂窝式接口插板的联系并进行一系列如前所述的自诊断检测。还对遥测维护电路组件10进行编程以便从接通峰窝或蜂窝式接口插板开始每隔约12小时就自动地启动检测例程。在自动启动检测时,并不产生检测呼出的程序。通过进一步的研制开发,可从遥控中心激活自诊断检测的启动功能。遥测维护功能可对接口插板的正在运行的软件进行调整并可对遥测维护中心的硬件和软件进行辅助开发。启动自检测例程时,橙黄色发光指示器(LED)会闪亮以告知用户正在进行检测。维护电路每完成一种检测,指示器的闪亮就暂停约一秒钟。全部的检测约持续40秒钟。结束检测时,发光指示器保持发光以表示检测成功。在这种情况下,存在的问题可能涉及到线路或者是与蜂窝或蜂窝式接口插板相连的电话设备。只要发光指示器连续地发光,则蜂窝或蜂窝式接口插板就会返回至正常的操作状态。当通过检测而发现蜂窝或蜂窝式接口插板有故障时,发光指示器会长时间地熄火。这告知用户蜂窝或蜂窝式适配器内存在问题。一旦检测例程结束,蜂窝或蜂窝式接口插板就会在与所检测到的故障无关的情况下返回至正常操作状态。尽管检测到的故障会引起限制,但用户仍可以继续使用适配器。
蜂窝或蜂窝式接口插板的电路中使用了四个发光指示器(LED)以便标识检测到的故障。这种方法对能接近适配器箱内部以确认可能的故障特性的维修技术人员来说是有帮助的。“开”、“关”LED的组合可以表示检测中所检测到的主要故障。一旦检测结束,这种组合将保持发光60秒。以下给出了用蜂窝或蜂窝式接口插板的LED所表示的可能的故障代码表。
在完成了自检测时,如果已检测到了故障,则对遥测维护中心发起呼叫。一旦建立起了联系,就报告所检测到的故障。这种遥测功能将为每一个装置都建立一个数据库。如果是通过按钮而人工启动检测,则不管是否检测到了故障,所完成的检测的全部结果均会报告给遥测维护中心。
以下是LED组所显示的代码表:错误类型 LED5 LED4 LED3 LED2无故障 关 关 关 关循环错 关 关 关 开循环错 关 关 开 关拨号音 关 关 开 开MFTD检测器 关 开 关 关振铃检测器 关 开 开 开呼叫应答 关 开 开 关收发机馈送 关 开 开 开发送器(呼叫) 开 关 关 开听筒(占用) 开 关 关 关以12KHz的单音检测 开 关 开 开来自电源的馈送 开 关 开 关“NO SERVICE” 开 开 开 开传输电路 开 开 开 关不确定 开 开 关 开不确定 开 开 关 关
自检测的顺序如下。遥测维护电路所进行的第一项工作是断开用户的设备。然后模拟“应答用户的电话”的状态。在这种状态下,可以检查对循环闭合的正确检测,从而产生拨号音。然后,在最小的频率和强度范围内确认正确地产生了拨号音。再次,开始对MFTD的复合频率音检测器进行检测。这包括:遥测维护电路组件的自诊断插卡产生完全连续的16种MFTD单音、将该单音发送给蜂窝或蜂窝式适配器的通常的蜂窝或蜂窝式接口插板并且确认已正确地检测到了这些声音。随后,进行检测以确认振铃发生器正在正确地起作用。产生振铃电流以便在预定的最小范围确认其频率和强度。然后。再次模拟应答电话或呼叫应答的状态以便检查振铃电路的功能(振铃电路在应答电话之前应是停用的)。就蜂窝或蜂窝式适配器付费电话而言,随后的检测将检查计费电路的容量以在最小的频率和强度范围按12KHz产生脉冲。遥测维护电路组件10内的精密脉冲检测器以周知的方式检测计费插卡所产生的上述脉冲。对不带有计费组件的蜂窝或蜂窝式适配器系统来说,用分离的跨接线形成蜂窝或蜂窝式接口插板的连接器J1.3。而跨接线则安装在带有计费组件的装置内。
以后的检测是验证蜂窝或蜂窝式收发机的功能。首先,检验对收发机的供电情况。这项检测是通过检查来自收发机的数据连接器的+12VDC(+12V直流电压)而进行的。第二,检验收发机以使得它处于能进行蜂窝或蜂窝式接入服务的状态。这种状态是由不存在“NO SERVICE”信号来表示的。“NO SERVICE”信号的出现被认为是一种故障。这种情况可能是由覆盖故障引起的,而不仅仅是蜂窝或蜂窝式收发机的故障。然后,通过蜂窝或蜂窝式网络呼叫用户所拥有的号码。由于收发机正在呼叫自身,所以,按这样的方式检查收发机的功能,即在从系统中接收到忙音信号的情况下对收发机进行检测。在发现网络被占用的情况下,就将“PATH ENGAGED”状态报告给收发机。然后,收发机产生一占线(忙)音。正常的收发机功能将这种声音看做与忙音信号相同。只有在用按钮启动前述例程时才进行上述检测。在自动启动前述过程的组件中不进行上述检测。还检查系统电源的电压。如果电压小于13.5VDC,则会检测到该电源中的故障。
在图10中,主遥测维护组件10与标准的蜂窝或蜂窝式适配器或接口插板14相连。该遥测维护组件内有多个用于进行上述自我诊断检测的独立电路。这些电路是:忙音信号检测器16,此检测器在对适当地接收的呼叫进行检测时使用,而所说的呼叫则是由遥测维护组件在参照图7A所述的回叫自检测期间进行;12,000次循环检测器电路18,此电路用于计费检测,它检验以12KHz所产生的脉冲的频率特征;MFTD发生器电路20,此电路产生由蜂窝或蜂窝式接口插卡所转换的DTMF信号,如以上参照图4所述;振铃信号检测器电路22,此电路用于在振铃检测和振铃应答例程中检测由蜂窝或蜂窝式适配器接口插板所产生的振铃信号,如以上参照图5A至图6所述;拨号者检测器电路24,此电路检测由蜂窝或蜂窝式适配器接口板14所适当产生的拨号音,如以上参照图3所示;电压检测器电路28,此电路用于检测收发机和整个系统的电源;以及遥测维护控制器30,此遥测维护控制器是控制单元并用于呼叫并将自检测的结果并报告给中心报告台。图11至图14显示了上述每个电路的实际结构,以下对每个电路的结构予以详细说明。
参照图11至图14,它们显示了用于在整个自检测过程中进行上述模拟检测的硬件电路。参照图11,它显示了遥测维护电路组件10的互连电路。图11中标号为“A”的部分显示了遥测维护电路与通常的蜂窝或蜂窝式适配器接口插板的塞尖及塞环(TIP及RING)线相连接的位置。标号为“继电器1”(“RELY1”)的继电器用于在维护操作检测时断开用户电话与蜂窝或蜂窝式接口的联系。相反,遥测维护电路也可在该继电器处连接于塞尖和塞环以便进行所说的检测。当把“ENABLE_TEST”信号置为HI时,晶体管Q3被迫进入饱和状态并激励继电器1,从而将维护电路连接于塞尖和塞环。图11中标号为“B”的部分显示了用户电话的挂机连接器,在该部分中,用户电话可以按两种可能的方式挂接于接口插板。J1是通常RJ11电话插座P1的双端头式连接器。
图11中标号为“C”的部分是音频接口电路,此电路用作塞尖和塞环线与音频之间的接口。T1是电话匹配用变压器。其功能是在接收和传输音频信号时保持电话的相类似的交流与直流电流特征。齐纳二级管D1和D2用于在电压高于±4.5V时截除任何的信号。还包括有一光隔离器(opto-isolator)SSR1,此器件连同晶体管Q4提供了用于闭合塞尖和塞环电路的机制。在把“Conn_Loop”信号置为HI时,晶体管Q4被迫进入饱和状态,然后启动SSR1从而闭合上述电路并且挂机。
图11中标号为“D”的部分是振铃检测电路,该电路包括两个主要的部分:振铃检测器集成电路U2,以及带有光隔离器的U9,所说的光隔离器提供适当的CMOS信号电平输出。当塞尖和塞环线上出现振铃电压时,U2的接头4与接头7之间会产生用作输出信号的电流。光隔离器U9对上述电流进行变换,然后将一个有效的LOW信号提供给I/O。
图11中标号为“E”的部分显示了环路电流检测器,该检测器包括一用于所检测到的环路电流的光隔离器。当检测被起动(在A部分中“Enable_Test”信号为HI)并且正在进行摘机(在C部分中“Conn_Loop”信号为HI)时,塞尖和塞环线成为闭合电路以便提供摘机电流。U17将摘机电流转换成提供给I/O的有效的Low信号。
图11中标号为“F”的部分是输入-输出音频电路,该电路包括U1的1/4以及一个运算放大器集成电路。上述电路的主要功能是隔离并预先放大呼入的音频信号。这一电路的输出称为“音频-入”(“Audio-In”)。而且,在这一部分中将本发明的遥测维护电路所产生的DTMF输出送至塞尖和塞环线。DTMF信号被标记为“单音-出”(“Tone-Out”)。
参照图12,标号为“G”的部分是DTMF音发生器,它包括一个DTMF音发生器U4以及用作输出放大器的U1的1/4。为了能产生DTMF单音,首先将一个四位的代码提供给U4中标号为“DTMFO-OUT”、“DTMF1-OUT”、“DTMF2-OUT”和“DTMF4-OUT”的输入接头。其次,在保持上述四位代码的同时将标号为“DTMF-OUT”的启动信号从Low电平转换为HI电平,从而能产生DTMF单音。在按U∶C而放大了音频之后,将音频在“单音-出”(“TONE-OUT”)处输出。为了使DTMF单音停止,使“DTMF-OUT”信号返回至低电平即可。
图12中标号为“H”的部分是输入/输出端口,即标号为U8的I/O端口集成电路。蜂窝或蜂窝式接口插板的微控制器使用这一集成电路去读取输入的数据并控制遥测维护组件的所有输出。端口A和C均为输入口,而端口B则为输出口。转接器J4是一个选择器,它用于按可选择的12或24小时来进行的自动定期检测。J5用于使对“自动应答”的呼叫启动。
图12中标号为“I.1”和“I.2”的部分是电源、数据以及控制连接器并且包括一个2×10的凸头连接器,该连接器用于导电以及向I/O端口发送或接收数据。上述部分还包括:一个接头连接器,它用于显示检测状态的外部LED;以及一个外部按钮,用此按钮可手工地启动所说的检测。图12中标号为“J”的部分是稳压器,并且带有一5V的固定正压稳压器,该稳压器向前述数字电路提供所需的电压。
遥测维护组件10包括六个单个的单音检测器,它们用于检测正在接收的ROH音、拨号音、忙音及占线音的音频路径、频率和定时韵调(timing cadence)。每个单音检测器均包括一运算放大器以及一单个的单音检测器集成电路。运算放大器的输入端与“音频-入”线相连。位于接头5与6之间的晶体管以及接头6与地线之间的电容可调节检测频率。当一个真实的单音与由RC所规定的单音相匹配时,就使得单音检测器的输出接头从HI转换成Low。
图12中标号为“k”的部分显示了拨号音检测器电路。当在U3的输入端出现真实的拨号音时,“拨号-检测”(“DIAL-DETECT”)线变为Low。图12中标号为“L”的部分显示了忙音检测器电路。当在U6的输入端出现真实的忙音时,“BUSY-DETECT”线变为Low。
图13中标号为“M”的部分显示了一个400Hz单音检测电路。当在U14的输入端出现真实的400Hz的单音时,“400-DETECT”线变为Low。
图14中标号为“N”的部分显示了一个800Hz单音检测电路。当在U13的输入端出现真实的800Hz的单音时,“800-检测”(“800-DETECT”)线变为Low。标号为“0”的部分显示了一个1020Hz声音检测器电路。当在U16的输入端出现真实的1020Hz的单音时,“1020-检测”(“1020-DETECT”)线变为Low。标号为“P”的部分显示了一个12KHz的单音检测器电路。当在U12的输入端出现真实的12KHz的单音时,“12KHz-检测”(“12Hz-DETECT”)线变为Low。
图13中标号为“Q”的部分显示了一个DTMF单音解码器,它包括一个DTMF单音检测器U11以及用作输入预放大器的U1的1/4。当在输入接头(IN-)处出现真实的DTMF单音时,控制线“DTMF-选通”(“DTMF-STROBE”)变为Low,同时集成电路进行解码。在对单音进行解码之后,将四位代码输出给U11中标号为“DTMFO-IN”、“DTMF1-IN”、“DTMF2-IN”以及“DTMF4-IN”的接头。然后,控制线“DTMF-选通”再次恢复成HI。标号为“R”的部分是一个交流监控器,它带有一个4.5V的欠压检测器U10。电阻R17和R33构成了一分压器,此分压器可使U10感知13V以下的电压而不是4.5V的电压。该电路在这样的前提下进行工作:当电压来自电源时,在遥测维护电路组件的输入端存在有14V的电压。在交流电源出现故障的情况下,该电压会降至不超过13V的后备电池的电平。所说的电路会检测到这种电压降落,并且,U10会使标号“AC-检测”(“AC-DETECT”)的线路变为Low。
以下是实现本发明的源代码:
Snopi nosb db noge nomo nopr ep SnoList Sincludc(rcg252.pdf) Slist ;********************************************************************* ; ;Maxjack by Alexis V.Torres for Codecom Rural Comm.Inc. ;(C)Copyright Codecom Rural Comm.Inc.1993 ;Telephone/cellular interface: ;Main program with the maintenance board ; ;11-29-92 maint.asm ; ;******************************************************************* ;These are the universal landline phone key codes. zero equ 0ah ;[0] key code star equ 0bh ;[*] key code pound equ 0ch ;[#] key code ;Buffer area pointers for the HS display and the TRU messages. dspbuf_start equ 80h ;Start of 16 byte LCD display buffer dspbuf_end equ 90h ;End of LCD display buffr msgbuf_start equ 90h ;Start of TRU(etc)msg buffer msgbuf_end equ 0h ;End of TRU msg buffer main_flag equ 0b0h ;use indirect address for test flag ;hook_slic 1 ;dial 2 ;dtmf_ 3 ;ring_test 4 ;ams_test 5 main_flag_error equ 0b1h ;hook_slic_error 1 ;hook error ;hook_ring_error 2 ;hook error ;dial_error 3 ;dial tone error ;dtmf_error 4 ;dtmf error ;ring_test_error 5 ;ring error ;ans_test_error 6 ;ring answer error main1_flag equ 0b2h ;ditto ;power_radio 1 ;power radio error ;call_test 2 ;call error ;call_tone 3 ;call audio error mainl_flag_error equ 0b3h ;ditto ;power_radio_error 1 ;spare ;call_test_error 2 ;call spare error ;call_tone_error 3 ;call audio spare error <dp n="d29"/> ;inuse 4 ;inuse error ;1000hz 5 ;1000hz error error_code equ 0b4h ;final indication LED indication ;hook_slic_error 1 ;hook ;hook_ring_error 2 ;hook ;dial_error 3 ;dial ;dtmf_error 4 ;dtmf ;ring_test_error 5 ;ring ;ans_test_error 6 ;ring answer ;power_radio_error 7 ;radio power ;call_test_error 8 ;call ;call_tone_error 9 ;call audio ;inuse 10 ;inuse ;1000hz 11 ;1000hz cero equ 00h uno equ 08h dos equ 04h tres equ 0ch cuatro equ 02h cinco equ 0ah seis equ 06h siete equ 0eh ocho equ 01h nueve equ 09h estrella equ 0dh libra equ 03h ;************************************************************ ; ; Internal Ram variable definitions ; ;************************************************************ ;Registers occupy bytes 00h-07h(reg.bank 0) ;r0 storage pointer(also address pointer for I/O expander) ;r1 pointer to storage of data from TRU ;r2 digit count ;r3 delay loop for bus timer ;r4 delay loop for bus timer ;r5 used in rohtone timer ;r6 used in send_time ;r7 used in rohtone timer ;Variable storage locations time_off1 data 10h ;Measures off-hook time time_off2 data 11h ;Measures off-hook time time_off3 data 12h ;Measures off-hook time time_on1 data 13h ;Measures on-hook time time_on2 data 14h ;Measures on-hook time <dp n="d30"/> pulse_digit data 15h ;Valuc of pulse dialed digit in_use_off_timer data 16h ;Chccks for 2 sec after in usc lamp ;goes out to do cpd ring_timer data 17h ;Timcr checks time between rings bell_timer data 18h ;Timer gcnerates 20hz for ringer bell_timer2 data 19h ;Timer for ringer gndstart_timer1 data 1ah ;Releases GS line if no connect in lsec gnidstart_timer2 data 1bh ;Same as above ;highpoint data 1ch ;Stores dph for tone tables ;lowpoint data 1dh ;Stores dpl for tone tables highpoint data 35h ;Stores dph for tone tables lowpoint data 36h ;Stores dpl for tone tables test_min data 1eh ;free data 1fh ;************************************************************************************* ; ;The Ram area 20h thru 29h is reserved for use by the main ;module either as data BYTEs or individual BITs ; ;************************************************************************************* flags DATA 20h ;This byte contains the following flags ;as individually addressable bits fhook bit 00h ;Off hook flag set by coming off hook, cleared when processed fsend bit 01h ;Send flag fflash bit 02h ;Flash flag fhang bit 03h ;Hang up flag ftime bit 04h ;40 second timer flag fdigit bit 05h ;Flag for pulse dig input fonhook bit 06h ;On hook flag set 700msec ;After hup,cleared by coming off-hook fdtmfin bit 07h ;Dtmf input flag inds DATA 21h ;Indicators-this byte contains the ;following bits: roam bit 08h ;Roam indicator noserv bit 09h ;No service indicator lock bit 0ah ;Lock indicator rdis bit 0bh ;Reset digit display born bit 0ch ;Horn indicator f_init bit 0dh ;Set by TRU only!(1=inits done) f_start bit 0eh ;1=onhook ints disabled for 500ms test_enable bit 0fh ;auto test ;after first offhook to deglitch the ;contact bounces indasc DATA 22h ;Indicators & audio switch control this ;byte contains the following bits: inuse bit 10h ;In use indicator <dp n="d31"/> ap1 bit 11h ;Audio path ap2 bit 12h ;Audio path test_end bit 13h ;not_error bit 14h ;no error flag for self test return_ring bit 15h error_flag bit 16h ;self test error ring_second bit 17h io_status DATA 23h ;Bits 18h-1fh strobe bit 1ch flags2 DATA 24h ;Bits 20h-27h fdig_ready bit 20h ;Digit ready flag fanswer bit 21h ;Ring answer flag fseudtimer bit 22h ;Flag to send after 4 seconds f_inuseofftiming bit 23h ;Flag shows timer is running to check ;2 sec with in use lamp off funlocktimer bit 24h ;Flag to unlock after 4 seconds fdtone bit 25h ;Flag shows DT is on fdecoder_busy bit 26h ;Flag shows dtmf decoder has not ;cleared yet fbellsound bit 27h ;Flags ringer is sounding px1_temp DATA 25h ;Input/output buffer for port px1- ;contains these bits: mitelq1 bit 28h ;From dtmf decoder mitelq2 bit 29h ;From dtmf decoder mitelq3 bit 2ah ;From dtmf decoder mitelq4 bit 2bh ;From dtmf decoder power_hold bit 2ch ;Maintain power after power failure to ;turn off TRU spare1 bit 2dh ;Spare I/O pin spare2 bit 2eh ;Spare I/O pin no_ring bit 2fh ;Spare I/O pin px2_temp DATA 26h ;I/O buffer for port px2(30h-37h) loopswitch_ bit 30h ;Low closes loop ring_ bit 31h ;Low turns on ring ps mute bit 32h ;Mute rx audio roh_boost bit 33h ;Increase gain for rob tone sw_scndtimer bit 34h ;Jumper in gives 4 sec send option sw_dialtone bit 35h ;Jumper in =diff dial tone for roam ;out means maintenance module sw_gndstart bit 36h ;IN=loop start,OUT=groundstart sw_data bit 37h ;Jumper in prevents,out allows digit ;data to TRU after send(to allow ;features from cell.switch) lamps_temp DATA 27h ;Contains these bits: ;free bit 38h ;Not really lamps--these store the ;free bit 39h ;current status of indicators ;free bit 3ah <dp n="d32"/> ;free bit 3bh roamlamp bit 3ch noservlamp bit 3dh locklamp bit 3ch inuselamp bit 3fh flags3 DATA 28h ;More flags-this byte contains the ;following individually addressable ;bits frohtimeout bit 40h ;Set when rohtone has been on 1 minute fcall bit 41h ;Set when call incoming,clear if not f_one_sec bit 42h ;Set when off hook for one sec so ;change in inuse lamp won’t cause ;remote hangup if phone taken off ;hook quickly after local hangup roh_on bit 43h ;Turns rohtone on & off fspecl bit 44h ;Flag for special use with specifie TRU ;processed in update_displays every ;71.1ms,calls specl fspec2 bit 45h ;Flag for special use with specific TRU ;proessed in on-or off-hook timers ;every 277.8 usec,calls spec2 fremote_hup bit 46h ;lndicates remote hup for 700 nsec ;delay flocktinmer bit 47h ;Flag to lock after 2 seconds <dp n="d33"/> ;**************************************************************** ; ; Implemented TRU tasks ; ;*************************************************************** f_cmds DATA 29h ;Optional TRU specific task numbers ;TRU tasks are for calls from the main into the TRU module. ;Task 1: ;a.)Power loss check for NEC 3700(see nan01) ;b.)Send change in hook switch status to OKI and also send initial CLR for the Motorola(see oee02 and mae04) ;c.)Call rdbus routine to read indicator status in the Audiovox TRUs ; (see tae01 and tbe01) ;d.)Monitor for silent alert mode in Audiovox CTX-3100A and set ; silent alert mode if necessary(see tbe01) ; ;Task 2: ;a.)Dual NAM switching for NEC 3700(see nae01) ; ;Task 3: ;a.)Power loss check for NEC 3700(see nan01) ;b.)Send any change in hook switch status to OKI and Motorola ; (see mae04 and oee02) ;c.)Call rdbus routine to read indicator status in the Audiovox TRUs(see tae01 and tbe01) ;d.)Monitor for silent alert mode in Audiovox CTX-3100A and set silent alert mode if necessary(see tbe01) ; ;Task 4: ;a.)Call rdbus routine to read indicator status in the Audinvox ; TRUs(see tae01 and tbe01.) ;b.)Monitor for silent alert mode in Audiovox CTX-3100A and set ; silent alert mode if necessary(see tbe01) ;The Ram area 2Ah thru 2dh is reserved for use by the TRU modules ;either as DATA bytes or individual BIT variables. ;TRU_bits1 data 2ah ;Bit 50h through 57h ;TRU_bits2 data 2bh ;Bit 58h through 5fh ;TRU_bits3 data 2ch ;Bit 60h through 67h ;TRU_bits4 data 2dh ;Bit 68h through 6fh ; Used for the maintanence board ! check the tru routine ! io_m_b data 2eh ;Bit 70h through 77h td0 bit 70h <dp n="d34"/> td1 bit 71h td2 bit 72h td3 bit 73h dtmf_out bit 74h enable_test bit 75h enable_tone bit 76h enable_tone_in bit 77h io_m_c data 2fh ;Bit 78h through 7fh ext_led bit 78h enable_special bit 79h enable_busy bit 7ah euable_16h bit 7bh conn_loop bit 7ch ;********************************************************************* ; ;More internal(BYTE addressable)ram variables ; ;********************************************************************* looptest_timer data 30h ;Delays looptest for 2ms after loopsw looptest_timer2 data 31h ;closes to allow SLIC to respond display_delay data 32h ;Delays display update to every 71.1ms dsp_ptr data 33h ;Handset LCD display buffer pointer msg_ptr data 34h ;TRU message buffer pointer ;********************************************************************* ; ;The following bytes are reserved for the TRU modules for use ;only as DATA bytes (not BIT addressable) ; ;********************************************************************* ;TRU_byte0 data 38h ;TRU_byte1 data 39h ;TRU_byte2 data 3ah ;TRU_byte3 data 3bh ;TRU_byte4 data 3ch ;TRU_byte5 data 3dh ;TRU_byte6 data 3eh ;TRU_byte7 data 3fh ; Stack occupies bytes 40h-5fh ;********************************************************************* ; ; Digits dialed are stored in bytes from 60h to 7fh permitting ; a total of 32,including the SND code used as a terminator. ; ;******************************************************************** <dp n="d35"/> prefix data 60h ;Only[0]or[1]are valid,else FFh first_digit data 61h ;First three locations in the digit second_digit data 62h ;buffer(emergency numbers,area code third_digit data 63h ;start of 7digit number,etc.) ;******************************************************************** ; ;8051 portl & port3 bit definitions,(common to all units) ; ;******************************************************************** io_select bit p1.2 dt_pwm bit p1.4 ;Dial tone pwm twenty_hz_pwm bit p1.5 ;20hz pwm for ringer ;power_fail_ bit p1.6 ;Input,0=power supply is failing le_ bit p3.2 ;Loop current sense,(ExtInt0) ring_groumd_ bit p3.4 ;Input:shows ground on ring lead ;strobe bit p3.5 ;Input:digit ready from DTMF decoder a0 bit p1.6 a1 bit p3.5 ;******************************************************************** ; ;Power up entry point,and interrupt routine vectors: ; ;******************************************************************** org 0000h ;Reset vector jmp init org 0003h ;ExtInt0 sevrice vector jmp offhook_edge ;Off hook,flash & pulse dial db 0ffh,0ffh,0ffh,0ffh,0ffh ;Fill for Eprom and emulator org 000bh ;Timer0(t10)svc vector jmp onbook_timer ;To keep track of how long on hook db 0ffh,0ffh,0ffh,0ffh,0ffh org 0013h ;ExtInt1 sevrice vector jmp int1 service ;Usually to read data from TRU db 0ffh,0ffh,0ffh,0ffh,0ffh org 001bh ;Timer1(th0)svc vector jmp offhook_timer ;For periodic timer ints db 0ffh,0ffh,0ffh,0ffh,0ffh org 0023h ;Serial port svc vector jmp ser_port_service ;Usually to read data from TRU db 0ffh,0ffh,0ffh,0ffh,0ffh org 002bh ;Timer2/ext2 svc vector jmp timer2 service db 0ffh,0ffh,0ffh,0ffh,0ffh <dp n="d36"/> org 0033h ;PCA service vector jmp pca_service ;For pulse width modulators db ′(c)Copyright Codccom′ db ′1992.′ Sinclude(main.msg) Sinclude(tru.msg) init: %set(intmask,0) ;Normally two interrupt levels unless ;intmask set to other than zero in ;TRU section(TAE01.ASM:Audiovox) mov sp,#3fh ;Stack starts at 40h clr rs0 ;Select register bank 0 clr rs1 ;Ditto mov a,#0 ;To fill ram with zero mov r0,#0 ;Point to first ram fill_ram: mov @r0,a ;One location at a time inc r0 ;Poinr to next location cjne r0,#0,fill_ram ;Fill up end of ram(FFh) clr p1.2 mov r1,#main_flag mov @r1,#0 ;read second flag inc r1 mov @r1,#0 inc r1 mov @r1,#0 inc r1 mov @r1,#0 call reset_io_m ;reset the maintanence board mov io_m_b,#0 ;disable module call write_io_m_b mov io_m_c,#0_ ;disable module call write_io_m_c call reset_io ;reset i/o expanded to #13 mov p2,#0ff8h ;Set p2 to drive port expander mov px1_temp,#11111111b ;Initialize including power_hold on call write_px1 mov px2_temp,#11110011b ;Initialize:loopsw open,not ringing call write_px2 call read_px2 ;Read option switches mov tmod,#00000011b ;Timer0 is two timers,and timer1 can ;be baud rate gen mov ip,#01001010b ;Set int priorities mov ie,#11001011b ;Enable PCA,Timer1,Timer0,Ext0 ;Tmr/Ext2,SerPort,Ext1 by TRU inits setb it0 ;ExtInt0 is edge trig′d setb it1 ;Extlnt1 is edge trig′d mov cmod,#80h ;Counter off during idle,clock/12 <dp n="d37"/> mov ch,#0 ;Load high counter mov cl,#0 ;Load low counter mov ccap01,#0ffh ;Low byte for timer comparator mov ccap0h,#0 ;High byte for timer comparator mov ccapm0,#049h ;PCA0: software timer mov ccapm1,#0 ;PCA1:(Dial Tone) off for now mov ccapm2,#0 ;PCA2(20 hz pwm)is off now clr tr1 ;Off-hook int timer not running yet clr tr0 ;On-hook timer not running ;Initialize byte variables mov time_on1,#0 ;Initialize onhook interrupt timers mov time_on2,#0 mov time_off1,#0 ;Initialize offhook interrupt timers mov time_off2,#0 mov time_off3,#0 mov flags,#0 ;Clear all the flags mov flags2,#0 ;Clear all the flags mov flags3,#0 ;Clear all the flags mov inds,#0ffh ;Initial vals mov indasc,#0ffh ;Initial vals mov pulse_digit,#0 ;0=no pulse digit(s) available now mov f_cmds,#0 ;0=no TRU task commanded ;Initialize bit variables clr test_enable clr test_end clr error_flag clr return_ring setb forhook ;1=Assume phone on hook on power up clr f_init ;0=TRU init not completed yet clr fremote_hup clr fcall ;0=No incoming call(ALERT)yet call clr_dsp ;Clear handset LCD display buffer call clr_msg ;Clear TRU messages buffer call specific_inits ;Do TRU specific initializations mov ccap41,#0ffh ;Low byte for watchdog match word mov ccap4h.#0ffh ;High byte for watchdog match word mov ccapm4,#48h ;PCA4:Enable comparator&interrupt orl cmod,#40h ;Enable watchdog timer setb cr ;Start PCA counter setb tr0 ;Start on hook timer ;Wait 2.55 second for TRU to wake up.Clear the dialed digits location, ;then point R0 to digits buffer start(60h),and clear R2(dialed digits ;count). time_wakeup: call watchdog mov a.time_on2 ;Get elapsed time <dp n="d38"/> cjne a,#255,time_wakeup ;Wait here 2.55scc for tru wakeup mov c,sw_gndstart ;Check GS-LS jumper,0=LS1=GS mov loopswitch_,c ;Save start mode clr no_ring call write_px2 jmp start Sinclude(tru.asm) ;TRU module here,so INTMASK can be ;evaluated at assembly time ;***************************************************************** ; ; Start, and Re-Entry point following hang up ; ;***************************************************************** start: mov r0,#60h ;Point to digit buffer start mov a,#0ffh ;Fill with non-digits clr_digbuf: mov @r0,a ;One location at a time inc r0 ;Point to next location cjne r0,#80h,clr_digbuf ;Through 7fh mov r0,#60h ;Point to buffer start mov r2,#0 ;Initialize digit count setb f_start ;1=enable hook_switch deglitching clr ie0 ;Clear offhook int just in case setb ex0 ;Enable offhook int in case disabled ;Endless loop until we either detect an incoming call or we lift ;the handset to dial out. hookchk: call watchdog jb test_enable, do_test ;if auto test activated mov f_cmds,#1 ;Load command ID ; call trucmd ;Do task1 for TRU,if needed jb fhook,first1 ;Brif off hook jnb fanswer,hookchk ;Back if no incoming ring detected jmp ring_answer ;Answer ring,we went off hook during first1: ;an ALERT (incoming call) state! jmp first do_test: mov r1,#main_flag_error mov @r1,#0 ;set the tone error busy or 1000hz mov r1,#main1_flag_error mov @r1,#0 ;set the tone error busy or 1000hz clr test_end clr error_flag <dp n="d39"/> clr error_flag mov r1,#main_flag mov a,@r1 ;read first flag anl a,#00000001b ;check if hook was done call start_hook_test ;hook test test_hook: jb error_flag,rou_error call dial_test ;dial test test_dial: jb error_flag,rou_error call start_dtmf ;dtmf test test_dtmf: jb error_flag,rou_error call start_ring_test ;ring test test_ring: jb error_flag,rou_error call start_ring_ans_test ;ring answer test test_ring_a: jb error_flag,rou_error call make_call ;call test jb error_flag, rou_error jmp until_fin_tim ;exit without errors rou_error: call error_acc ;load error variable jmp wait_end until_fin_tim: setb test_end clr tr0 mov time_on2,#0 ;Every 10 msec while on hook mov time_on1,#0 ;Reset for next 36 mov test_min,#0 ;10msec×255=.255sec setb tr0 wait_end: call watchdog ;be here until 1 min expire mov a,test_min cjne a,#23,wait_end ;.255×236=60.18 call fin_self ;return to normal jmp hookchk ;return to normal ;************************************************ ;start_hook_test-start hook test ;************************************************ start_hook_test: mov r1,#main_flag ;read main flag mov a,@r1 orl a,#00000001b mov @r1,a ;set the off-hook flag setb enable_test ;disconnect the telephone clr conn_loop call write_io_m_b ;and connect module call reset_io_m ;reset the maintanence board call write_io_m_b call write_io_m_c <dp n="d40"/> clr loopswitch_ ;Othcr side has disconncctcd call writc_px2 test_hup: setb fremote_hup call hup mov lamps_temp,#0 call write_io_c ;update thc LEDS mov r6,#10 nose: push 6 mov r6,#0ffh ;delay module loop_m: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_m mov r6,#0ffh ;delay module loop_ma: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_ma mov r6,#0ffh ;delay module loop_mb: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_mb mov r6,#0ffh ;delay module loop_mc: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_mc pop 6 djnz r6,nose test_hup2: clr fanswer clr fhook ;Clear the flag jnb fhook,not_hook_det ;no off-hook det. ok ;off-hook detected error jmp hook_error not_hook_det: ;test off-hook setb fonhook setb conn_loop ;present off hook to the call write_io_m_c ;interface <dp n="d41"/> mov r6,#0ffh ;delay off hook loop_m_off: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_m_off mov r6,#0ffh ;delay off hook loop_m_off2: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_m_off2 mov r6,#0ffh ;delay off hook loop_m_off3: mov r7,#0ffn djnz r7,S call watchdog djnz r6,loop_m_off3 mov r6,#0ffh ;delay off hook loop_m_off4: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_m_off4 mov r6,#0ffh ;delay off hook loop_m_off5: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_m_off5 test_fhook: jb fhook, detected_hook ;if hook detected ok ;not off-hook der error jmp hook_error detected_hook: clr ex0 ;Disable offhook int til dial tone to ;prevent dialing due to bounce clr hookswout ;Show off-hook to TRU setb hookswout ;Ditto clr fhook ;Clear the flag dt_delayl: call watchdog jnb lc_,still_off_hook jmp hook_error ;fail off hook still_off_hook: jb f_start,dt_delayl ;Will be set after 500ms deglitching clr ic0 ;Clear offhook int flag just in case setb ex0 setb fdtone ;1=the Dial Tone is on call dtone ;Enable the Dial Tone ret ;exit from hook test <dp n="d42"/> hook_error: mov r1,#main_flag_error mov @r1,#1 ;hook slic error setb error_flag ret ;*********************************************** ;dial_test check the dial tone ;*********************************************** dial_test: mov r1,#main_flag ;read main flag mov a,@r1 orl a,#00000010b mov @r1,a ;set the dial tone flag mov r6,#0ffh ;delay off hook delay_dial: mov r7,#0ffh djnz r7,S call watchdog djnz r6,delay_dial mov r6,#0ffh ;delay off hook delay_dial2: mov r7,#0ffh djnz r7,S call watchdog djnz r6,delay_dial2 clr tr1 ;wait 711 msec to detect dial mov time_off1,#0 mov time_off2,#0 setb tr1 verify_dial: call read_iom_a ;check dial tone anl a,#00000001b cjne a,#00000001b,dial_ok ;if 0 dial ok call watchdog mov a,time_off2 ;dial is not detected cjne a,#10,verify_dial ;wait 711 msecs if busy not detected ;dial tone fail mov r1,#main_flag_error mov @r1,#3 ;dial error setb error_flag ret dial_ok: ;no error ret ;*************************************************** ;start_dtmf-start the dtmf ;*************************************************** start_dtmf: clr fdtone mov ccapm1,#0 <dp n="d43"/> anl io_m_b,#0f0h orl io_m_b,#cero ;send 0 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_cero: cjne a,#0h,dtmf_error_flag ;verify 0 anl io_m_b,#0f0h orl io_m_b,#uno ;send 1 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_1: cjne a,#1h,dtmf_error_flag ;verify 1 anl io_m_b,#0f0h orl io_m_b,#dos ;send 2 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_2: cjne a,#2h,dtmf_error_flag ;verify 2 anl io_m_b,#0f0h orl io_m_b,#tres ;send 3 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_3: cjne a,#3h,dtmf_error_flag ;verify 3 anl io_m_b,#0f0h orl io_m_b,#cuatro ;send 4 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_4: cjne a,#4h,dtmf_error_flag ;verify 4 jmp go_to_5 dtmf_error_flag: jmp error_dtmf go_to_5: anl io_m_b,#0f0h orl io_m_b,#cinco ;send 5 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf <dp n="d44"/> call gct_test test_5: cjnc a,#5h,dtmf_error_flag ;verify 5 anl io_m_b,#0f0h orl io_m_b,#seis ;send 6 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_6: cjne a,#6h,dtmf_error_flag ;verify 6 anl io_m_b,#0f0h orl io_m_b,#siete ;send 7 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_7: cjne a,#7h,dtmf_error_flag ;verify 7 anl io_m_b,#0f0h orl io_m_b,#ocho ;send 8 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_8: cjne a,#8h,dtmf_error_flag1 ;verify 8 anl io_m_b,#0f0h orl io_m_b,#nueve ;send 9 call send _dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_9: cjne a,#9h,dtmf_error_flag1 ;verify 9 anl io_m_b,#0f0h orl io_m_b,#05h ;send a call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_a: cjne a,#0ah,dtmf_error_flag1 ;receive a anl io_m_b,#0f0h orl io_m_b,#0dh ;es b call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test <dp n="d45"/> test_b: cjne a,#0bh,dtmf_error_flag1 jmp go_to_c dtmf_error_flag1: jmp error_dtmf go_to_c: anl io_m_b,#0f0h orl io_m_b,#03h ;es 3 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_c: cjne a,#0ch,dtmf_error_flag1 anl io_m_b,#0f0h orl io_m_b,#0bh ;es d call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_d: cjne a,#0dh,dtmf_error_flag1 anl io_m_b,#0f0h orl io_m_b,#07h ;es 7 call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_e: cjne a,#0eh,dtmf_error_flag1 anl io_m_b,#0f0h orl io_m_b,#0fh ;es f call send_dtmf call delay_dtmf call disable_dtmf call delay_dtmf call get_test test_f: cjne a,#0fh,dtmf_error_flag1 ret ;exit without errors error_dtmf: mov r1,#main_flag_error mov @r1,#4 ; dtmf error setb error_flag ret ;************************************************* ;start_ring_test-start the ring test ;************************************************* start_ring_test: ;init the ringing <dp n="d46"/> mov r1,#main_flag ;read main flag mov a,@r1 orl a,#00001000b mov @r1,a ;set the ring test flag clr ring_second clr conn_loop ;present an on hook call write_io_m_c setb fremote_hup call hup mov r6,#6 loop_ring_wait: push 6 mov r6,#0ffh ;delay module loop_mbb: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_mbb mov r6,#0ffh ;delay module loop_mcc mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_mcc pop 6 djnz r6,loop_ring_wait ;incoming call clr ap1 ;init an incoming cal jb lc_,loop_ring_off jmp ring_flag loop_ring_off: ;loop here until ring start or clr tr0 ;2 sec expire mov time_on2,#0 mov time_on1,#0 setb tr0 wait_2_sec: call watchdog jnb fanswer,not_answer jmp ring_flag ;answer occurred error not_answer: call read_io_m_a anl a,#00000100b cjne a,#00000100b,ring_starts ;if 0 ring stated mov a,time_on2 ;check if 2 second expire cjne a,#200,wait_2_sec ;wait 2 sec to stop the dtmf jmp ring_flag ;2 sec expire,error ring_starts: mov r6,#0ffh ;delay module loop_mbbc: mov r7,#0ffh <dp n="d47"/> djnz r7,S call watchdog djnz r6,loop_mbbc mov r6,#0ffh ;delay module loop_mccd: mov r7,#0ffh djnz r7,S call watchdog djnz r6,loop_mccd ring_start: ;check for ring 1.3s continuity clr tr0 mov time_on2,#0 mov time_on1,#0 setb tr0 wait_130msec: ;check ring during 1.3 sec call watchdog jnb fanswer,not_answer1 jmp ring_flag ;answer occured error not_answer1: call read_io_m_a test_130: anl a,#00000100b ;should be low during 1.3 sec cjne a,#00000100b,ring_expire jmp ring_flag ;ring fail within 1.3 sec ring_expire: mov a,time_on2 cjne a,#90,wait_130msec ;wait 130msec wait_250msec: ;the ring should stop after 1.5s call watchdog ;but we will wait 2.5s to check if call read_io_m_a ;it stop test_250: anl a,#00000100b ;should be low during.2 sec more cjne a,#00000100b,ring_not_expire test_stop: jmp ring_stop_ ;ring stop before 2.5s ring_not_expire: mov a,time_on2 ;after 1.5 sec it should be high cjne a,#250,wait_250msec ;wait 250msec test_flag: jmp ring_flag ;ring did not stop within 2.5s error ring_stop_: ;wait 2.55s clr tr0 mov time_on2,#0 mov time_on1,#0 setb tr0 wait_2_seca: call watchdog jnb fanswer,not_answer2 jmp ring_flag ;answer occurred error not_answer2: mov a,time_on2 <dp n="d48"/> cjnc a,#255,wait_2_scca ;wait 2.55s to stop the dtmf ;second loop jb ring_second,ring_stopl setb ring_second ;check ring 2 times jmp loop_ring_off ;start again ring_flag: setb ap1 ;clear incoming call mov r1,#main_flag_error mov @r1,#5 ;ring error setb error_flag ring_stop1: test_timbre: ret ; exit without error ;************************************************************ ;start_ring_ans_test-answer the ring ;************************************************************ start_ring_ans_test: ;init the ringing mov r1,#main_flag ;read main flag mov a,@r1 orl a,#00010000b mov @r1,a ;set the ring test flag loop_ring_off2 ;wait here until ring start again clr tr0 mov time_on2,#0 mov time_on1,#0 setb tr0 wait_2_sec2: call watchdog jnb fanswer,not_answera ;if ring answer exit jmp ans_flag not_answera: call read_io_m_a anl a,#00000100b cjne a,#00000100b,ring_present ;if cero ring present mov a,time on2 cjne a,#200,wait_2_sec2 ;wait 2 sec to stop jmp ans_flag ;2 sec expire ring_present: setb conn_loop ;answer the ring call write_io_m_c mov r7,#0ffh ;delay to allow time to set fanswer wait_ans: r6,#0ffh mov djnz r6,S call watchdog djnz r7,wait_ans mov r7,#0ffh wait_ansa: <dp n="d49"/> mov r6,#0ffh djnz r6,S call watchdog djnz r7,wait_ansa test_ans: jb fanswer,ok_ring ;if answer,ring ans ok jmp ans_flag ;didn′t answer error ans_flag: mov r1,#main_flag_error mov @r1,#6 ;ring error setb error_flag setb ap1 clr fanswer ret ok_ring: ;exit without error timbre: clr fanswer setb ap1 ;clear incoming call ret ;****************************************************** ;make_call-make a call to test the radio ;******************************************* make_call: mov r1,#main1_flag ;read main1 flag mov a,@r1 orl a,#00000001b mov @r1,a ;set the call test flag test_mute: jnb power_,power_is_ok ;if radio ok line should be low(0) mov r1,#main1_flag_error mov @r1,#1 ;set the power line error setb error_flag jmp pre_onhook power_is_ok: mov a,#func ;function to read the phone number call wrbus mov a,#7 call wrbus call clr_dsp mov a,#star call wrbus mov r7,#0ffh ;delay to allow time to send number wait_min: ;to interface mov r6,#0ffh djnz r6,S call watchdog djnz r7,wait_min mov r7,#0ffh wait_mina: mov r6,#0ffh <dp n="d50"/> djnz r6,S call watchdog djnz r7,wait_mina mov a,#9h call wrbus mov a,#0ah call wrbus ;generate a call to its phon number mov a,#dspbuf_start ;Get current pointer add a,#3 mov r1,a mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus inc r1 mov a,@r1 ;Read msg in buffer anl a,#0fh call wrbus setb fsend ;Set send flag mov a,#send ;make a call call wrbus setb enable_special ;enable Q4 call write_io_m_c test_mute1: clr mute ;do not mute call write_px2 <dp n="d51"/> clr tr1 ;delay to check inuse mov time_off1,#0 mov time_off2,#0 setb tr1 delay_call: mov a,time_off2 call watchdog cjne a,#80,delay_call ;wait 1?seconds test_mute2: ;test busy tone clr tr1 mov time_off1,#0 mov time_off2,#0 mov time_off3,#0 setb tr1 cont_waiting: jnb inuse,still_inuse mov r1,#main1_flag_error mov @r1,#4 ;set the inuse error jmp call_error ;if iube disapearset error still_inuse: call read_io_m_a ;check dial tone anl a,#000000001b cjne a,#00000001b,busy_ok ;if 0 busy ok call read_io_m_a ;check dial tone anl a,#00001000b cjne a,#00001000b,t1000hz ;if 1000khz busy ok mov a,time_off3 ;busy is not detected call watchdog cjne a,#1h,cont_waiting ;wait 18.2 secs if busy not detected mov r1,#main1_flag_error mov @r1,#3 ;set the tone error busy or 1000hz call_error: mov a,#end1 ;make a call call wrbus setb error_flag ;present and on hook jmp pre_onhook t1000hz: ;950hz-1100bz tone detected busy_ok: ;400hz-620hz tone detected mov a,#end1 ;make a call call wrbus pre_ornhook: clr conm_loop ;present and on-hook call write_io_m_b ;and connect module call hup ret ;************************************************** ;error_acc-set the error code ;************************************************** error_acc: mov r1,#main_flag_error mov a,@r1 <dp n="d52"/> cjnc a,#1,check_hook_ring mov r1,#error_code ;hook slic crror mov @r1,#1 jmp exit_error check_hook_ring: cjne a,#2,check_dial_flag mov r1,#error_code ;hook ring error mov @r1,#2 jmp exit_error check_dial_flag: cjne a,#3,check_dtmf_flag mov r1,#error_code ;dial error mov @r1,#3 jmp exit_error check_dtmf_flag: cjne a,#4,check_ring_flag mov r1,#error_code ;dtmf error mov @r1,#4 jmp exit_error check_ring_flag: cjne a,#5,check_ring_ans_flag mov r1,#error_code ;ring detection error mov @r1,#5 jmp exit_error check_ring_ans_flag: cjne a,#6,check_power_flag mov r1,#error_code ;ring answer error mov @r1,#6 jmp exit_error check_power_flag: ;chcck calls flag mov r1,#main1_fiag_error mov a,@r1 cjne a,#1,check_call_test mov r1,#error_code ;power radio error mov @r1,#7 jmp exit_error check_call_test: cjne a,#2,check_busy_test mov r1,#error_code ;xxx error mov @r1,#8 jmp exit_error check_busy_test: cjne a,#3,check_inuse_test mov r1,#error_code ;busy tone error mov @r1,#9 jmp exit_error check_inuse_test: cjne a,#4,check_1000_test mov r1,#error_code ;inuse error mov @r1,#10 jmp exit_error check_1000_test: cjne a,#5,cxit_error mov r1,#error_code ;1000hz tone error mov @r1,#11 <dp n="d53"/> jmp exit_error exit_error: ret ;************************************************ ;fin_self-return to normal ;************************************************ fin_self: clr conn_loop ;present on hook to the call write_io_m_c ;interface call hup clr enable_test ;connect the the telephone call write_io_m_b ;and disconnect module clr test_enable ;init maint test clr test_end ;finish test clr error_flag ;error flag jnb error_flag,turn_on_led clr ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop_bad turn_on_led: setb ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop_bad clr ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop_bad setb ext_led ;turn offexternal led while testing call write_io_m_c ;turn on/off the external led call loop_bad_ clr ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop__bad_ setb ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop_bad test_4on: clr ext_led ;turn off external led while testing call write_io_m_c ;turn on/off the external led call loop_bad ret loop_bad: mov r7,#0ffh ;delay to allow time to set fanswer wait_emb: mov r6,#0ffh djnz r6,S call watchdog <dp n="d54"/> djnz r7,wait_emb mov r7,#0ffh wait_emba: mov r6,#0fflh djnz r6,S call watchdog djnz r7,wait_emba ret ;Get here when we lifted the handset to dial. first: call clr_msg ;Clear previous TRU messages clr ex0 ;Disable offhook int til dial tone to ;prevent diaiing due to bounce clr hookswout ;Show off-hook to TRU setb hookswout ;Ditto clr fhook ;Clear the flag dt_delay: call watchdog mov f_cmds,#4 ;NOTE:INT0 & TIMER0 have been suspended ;at this point - do not use any tru ;specifie function which relies on ;these interrupt. call trucmd ;Perform any TRU specific commands jb f_start,dt_delay ;Will be set after 500ms deglitching clr ie0 ;Clear offhook int flag just in case test_lc: jnb lc_,alcrt_check ;Brif still off hook after 500ms test_lc1: call hup ;Phone put back on hook_500msec jmp start alert_check: setb ex0 ;Reenable offhook int(DT is un now) jb inuse,make_dt ;Brif not INUSE,we are ready to dial jmp wait ;lf already INUSE probably answered ;an incoming call by coming offhook ;We are off hook for 500ms lets generate a dial tone. make_dt: setb fdtone ;1=the Dial Tone is on call dtone ;Enable the Dial Tone call get ;Get a character or exit if hang up jb inuse,check_prefix clr fdtone mov ccnpm1,#0 jmp wait <dp n="d55"/> check_prefix: jb lock,prefix_0 ;Brif TRU isn′t locked cjne a,#pound.nosend ;Brif locked,only#(unlock)is valid prefitx_0: cjne a,#zero,prefix_1 ;Brif not a[0] jmp store_it ;Go to store[0]as prefix prefix_1: cjne a,#1,no_prefix ;Brif not a[1]either jmp store_it ;Go to store[1]as prefix - no_prefix: inc r0 ;Leave prefix slot unchanged(FFh) inc r2 ;But up the digit count ;Store current digit and get another one until time to send them out. store_it: cjne r0,#7fh,do_store_it ;Brif digit buffer is not full yet jmp check_number ;Brifbuffer is full,w/o storing do_store_it: mov @r0,a ;Store the digit inc r0 ;Advance digit buffer pointer ;Check the entered digits and analyze them for valid sequences. check_number: clr fsendtimer ;Assure it is off mov a,first_digit ;Point to lst digit slot cjne a,#0ffh,check_one ;Brff fnst digit entered jmp check_send ;Else check if time to send check_one: cjne a,#pound,check_send ;Brif not[#](lock,unlock,etc.) mov a,second_digit ;Point to 2nd digit if first is[#] cjne a,#0ffh,check_two ;Brif second digit entered jmp check_send ;Else check if time to send check_two: cjne a,#pound,check_nam ;Brif not[#][#](lock or unlock) mov a,third_digit ;Two #′s might be lock or unlock cjne a,#pound,check_unlock ;Three #′s mean locking jnb lock,nosend ;Do not lock if already locked jmp lock_it ;[#][#][#]means locking check_nam: cjne a,#star,check_send ;Abort if not[#][*]sequence mov a,third_digit ;Else get the third digit also cjne a,#0ffh,check_nam1 ;Brif third digit entered jmp check_send ;Else check if time to send check_nam1: mov f_cmds,#2 ;Load function number,then go to call trucmd ;Switch to alternate NAM ;Abort on invalid number (dial) sequences. nosend: clr funlocktimer ;Turn off unlock timer#sign set it <dp n="d56"/> setb fonhook ;As if on hook setb ic0 ;Go to Extlnt0 scrvicc jmp start ;just like off hook again check_unlock: cjnc a,#0ffgh,unlocking_it ;Brif any digit was dialed aftcr ## jmp check_scnd ;Else go to check if time to send unlocking_it: setb funlocktimer ;Will send after 2cec w/o SND codc jmp get_next ;to avoid unlock code being sent like ;a valid number ;Get here if the digit sequence entered did not qualify as any ;of the special function(lock,unlock,dual NAM,etc)options. check send: jb sw_sendtimer,chcck_intl ;Brif sw7=1,intcrntnl calls enabled setb fsendtimer ;Enable sending after 4 see if sw7=0 jmp get_next ;And back for next digit check_int: mov a,prefix ;Test for prefix in acc cjnc a,#zero,check_op ;Brff not[0] mov a,first_digit ;Else get the first real digit cjne a,#1,check_op ;Brif not[1],may be operator call setb fsendtimer ;International call!Starts with 01-.. jmp get_next ;Back for more,only timer sends now! check_op: mov a,prefix ;Get prefix digit again cjne a,# 10,check_service ;Brif prefix is not 0 cjne r2,#0,check_service ;Brif digit(a) also were dialed setb fsendtimer ;Else it may be a call to operator check_service: cjne r2,#3,chock_distance ;Brif not 3 digits mov a,second_digit ;Else if emergency,inform,etc. cjne a,#1,check_distance ;Brif second digit is 1 mov a,third_digit ;Get third digit cjne a,#1,check_distance ;Brif third digit is not 1 jmp send_it ;It must be un emerg.,send it check_distance: cjne r2,#10,check_local ;Ten digit was dialed? jmp send_it ;Send on 10th unless international check_local: cjne r2,#7,get_next ;Brif less then seven digit was dialed setb fsendtimer ;Prepare to send in 4 see mov a,second_digit ;Get 2nd digit subb a,#1 ;Is it a #1? jz get_next ;Brif so,could be area code,or local mov a,second_digit ;Get 2nd digit again <dp n="d57"/> subb a,#10 ;Is it a 0? jz get_next ;Brif so,maybe area code,maybc loca clr fsendtimcr ;Don′t want another,send 5sec later jmp send_it get_next: inc r2 call get ;Get a new digit jmp store_it ;Do all the checks with the new digit ;******************************************************** ; ; Dialing done,send the number out ; ;******************************************************* ;Check if the TRU is locked,and abort if no unlock code was entered. send_it: jb lock,send1 ;Brif TRU is not locked locked: mov a,third_digit ;Get third digit cjne a,#0ffh,send1 ;Brif any digit entered jmp nosend ;Don′t send if no unlock code entered ;Send dialed digit. send1: setb mute ;Mute rx audio call write_px2 mov @r0,#send ;Put send at end of digits mov a,#clear ;Clear code call wrbus ;Put clear code first to clear any ;digits from TRU memory in case ;handset has entered some first mov r0,#60h ;Reset pointer to show storage mov a,@r0 ;Put prefix in acc cjne a,#0ffh,out inc r0 ;Skip prefix if it is ff out: mov a,@r0 call wrbus ;Write to the bus jnb fhang,send_ok test_lc2: call hup ;Abort dump if hangup jmp start send_ok: inc r0 cjne a,#send,out ;Keep on til SND code setb fsend ;Set send flag clr mute ;Unmute rx audio call write px2 <dp n="d58"/> ;Dialing done,conditionally echo digit to TRU,then wait for ;further possible digits(extension,ctc.),or let the interrupts ;take over the show. wait: call get ;Check for any digits from MJ phone jnb sw_data,wait ;Discard if data after snd is disablcd call wrbus ;Else send data to TRU jmp wait ;Loop til we or other party hangs up ;******************************************************* ; ; Dial Tone Generntor ; ;******************************************************* ;This routine selects and generates the proper dial tone, ;corresponding to our current(roam,hollcr,etc) status. dtone: push psw jb lock,serv_check mov dptr,#table_350 ;350 bz for lock jmp tone_out sery_check: jb noserv,roam_chcck mov dptr,#table_620 ;620 hz tone for no-serv jmp tone_out roam_check: jb sw_diaitone,normal ;if option sw is dosed(=0)make a ;diff dial tone for roam jb roam,normal mov dptr,#table_roam ;440-620 hz for roam jmp tone_out normal: mov dptr,#table_dt ;350-440hz(normal DT) tone_out: mov lowpoint,dpl ;Remember where the table starts mov highpoint,dph mov ccapm1,#01000010b ;Enable1 the tone pop psw ret ;**************************************************** ; ;Get a digit from the handset keypad ; ;**************************************************** ;This routine processcs the digit input and/or process flags. ;On retunn-returas data in acc get: push psw get1: mov f_cmds,#3 ;Flag indicates which functions apply call trucmd ;Perform any TRU specific commands call watchdog <dp n="d59"/> ;Wait for a pulse.If the pulse was not flagged as a pulse dial input ;by EXTINT0(Off_Hook_Service),we check for a DTMF digit input.If it ;was a pulse dial input then we continue counting pulses,until 250ms ;has passed after receiving the last pulse.At that point we consider ;assembling the pulse dial digit completed,so we copy it into the acc, ;and set the fdig_ready flag. get_pulse: jnb fdigit,get_dtmf clr fdtone ;Clear dial tone flag mov ccapm1,#0 ;Turn off dial tone mov a,#2 ;If there was an input clr c ;Clear carry for subtraction subb a,time off2 ;See if 213.3 msec(3×71.11ms) passed jnc get_dtmf ;If not yet,then digit not complete mov a,#131 clr c ;Clear carry for subtraction subb a,time_off1 ;See if additional 36.7mscc ;(132×277.8usec)has passed (total ;time of 250msec) jnc get_dtmf ;If not yet,then digit not complete mov a,pulse_digit ;Put digit in a mov pulse_digit,#0 ;Clear for next dig setb fdig_ready ;To show a digit ready clr fdigit ;Clear the flag ;If a DTMF dial digit is ready,copy it into the acc.Check for special ;conditions,flash,hang up etc.Branch on special conditions,or continue ;checking for more pulse(s),and/or completed digits. get_dtmf: jnb fdtmfin,hang clr fdtone ;Clear dial tone flag mov ccapm1,#0 ;Turn off dial tone clr fdtmfin ;Clear dtmf input flag mov a,px1_temp ;Put digit in acc anl a,#0fh ;Keep only low 4 bits setb fdig_ready ;To show a digit ready ;Check for hangup (pulse c 700ms). hang: jnb fhang,gflash ;If no hang up pop psw test_lc3: call hup dec sp ;Correct stack pointer dec sp ;Leaving subrout without ret jnb fremote_hup,no_remote ;Brif no remote hup occured clr fremote_hup no_remote: jmp. start ;Exit,somebody hung up ;Check for flash(200_pulse_700ms). <dp n="d60"/> gflash: jnb fflash,time ;If no flash clr fflash ;Clear flash flag mov ccapm1,#0 ;Turn off dial tone jb fdtone,just_flash ;If dial tone on just a send for last ;number redial jb faend,just_flash ;If scnd flag is set don′t put digits, ;just a send clr fdtone ;Clear dial tone flag pop psw dec sp ;Correct stack pointer dec sp ;Leaving subrout without ret jmp send_it ;Output all digits+send ;Transmit only a SEND code,but not the digits,if ;either the Dial Tone or the Send flag is high. just_flash: clr fdtone ;Clear dial tone flag mov f_cmds,#5 call trucmd mov a,#send ;Send code call wrbus setb fsend ;Send flag pop psw ;Restore flags dec sp ;Correct stack pointer dec sp jmp wait ;Back for digit(s),hangup etc. ;If we did not dial a complete phone number yet,and 40 second passed ;since the last key punch,then we start a 1 minute holler tone. time: jnb ftime,send_time ;If no timeout pop psw dec sp ;Correct the stack pointr dec sp ;Leaving subrout without ret jmp rohtone ;Then no rohtone ;Check if it time to send(4 sec expired since last key.) send_time: jnb fsendtimer,unlock_time mov r6,time_off2 ;71.1ms timer in r6 cjne r6,#56,unlock_time ;Check for 4 sec(56×71.1ms=3.98sec) clr fsendtimer pop psw dec sp ;Correct stack pointer dec sp ;Leaving subrout without ret jmp send_it ;Output digits and send ;Check if unlock was requested. unlock_time: jnb funlocktimer.lock_time mov r6,time off2 ;71.4ms timer in r6 <dp n="d61"/> cjne r6,#28,look ;Check for(28×71.4ms=)2sec clr funlocktimer pop psw dec sp ;Correct stack pointer dec sp ;Leaving subrout without ret jb lock,no_unlock ;Do not unlock, if already unlocked jmp unlock_it no_unlock: setb fonhook ;As if on hook setb ie0 ;Go to Extlnt0 service jmp start ;Just like off hook again ;Flocktimer added to allow lock to timeout on less than 4 digits.Go_lock ;label must be added to TRU and also setting of flocktimer(if necessary). lock_time: jnb flocktimer,look ;Brif not mov r6,time_off2 ;71.4ms timer in r6 cjne r6,#28,look ;Check for(28*71.4ms=2sec) clr flocktimer pop psw dec sp ;Correct SP dec sp jmp go_lock ;Check if we got a(complete)digit. look: jb fdig_ready,got_a_digit jmp get1 ;Look again if no digit in ;We got a digit(pulse or DTMF),return it in the acc. got_a_digit: clr fdig_ready ;Clear the digit ready flag got_inuse: mov time_off1,#0 ;Restart timers on every digit input mov time_off2,#0 mov time_off3,#0 pop psw ret ;**************************************************************** ; ;Get a digit from the handset keypad ; ;**************************************************************** ;This routine processes the digit input and/or process flags. ;On return-returns data in acc get_test: push psw <dp n="d62"/> ;If a DTMF dial digit is ready,copy it into the acc.Check for special ;conditions,flash,hang up etc.Branch on special conditions,or continue ;checking for more pulse(s),and/or completed digits. get_dtmf_test: jnb fdtmfin,no_dtmf_test clr fdtone ;Clear dial tone flag mov ccapm1,#0 ;Turn off dial tone clr fdtmfin ;Clear dtrnf input flag mov a,pxl_temp ;Put digit in acc anl a,#0fh ;Keep only low 4 bits setb fdig_ready ;To show a digit ready no_dtmf_test: clr fdig_ready ;Clear the digit ready flag mov time_off1,#0 ;Restart timers on every digit input mov time_off2,#0 mov time_off3,#0 pop psw ret ;***************************************************************************** ;send_dtmf-send a dial tone ;***************************************************************************** send_dtmf: call watchdog clr dtmf_out ;enable the dtmf tone call write_io_m_b setb dtmf_out ;enable the dtmf tone call write_io_m_b ret ;***************************************************************************** ;clr_dtmf-send a dial tone ;***************************************************************************** disable_dtmf: clr dtmf_out ;enable the dtmf tone call write_io_m_b ret delay_dtmf: ;delay the DTMF tone clr tr1 mov time_off2,#0 mov time_off1,#0 setb tr1 wait_until_dtmf: mov a,time_off2 call watchdog cjne a,#4,wait_until_dtmf ;wait 40 msec to stop the dtmf ret ;******************************************************* ; ; ROH tone generator ; ;******************************************************* <dp n="d63"/> ;40sec has passed after we lifted the handset w/o dialing any digits, ;or since we have dialed the last digit.We shall generate an ROH tone ;(interrupted at 80msec intervals) for 1 minute or until we hang_up, ;whichever happens first. rohtone: clr ftime ;Clear the flag clr fdtone ;Clear dial tone flag so changes in ;indicators won′t change roh tone mov dptr,#table_400 mov highpoint,dph ;Remember table location mov lowpoint,dpl setb roh_boost ;Boost the audio call write_px2 rohtone_on: mov ccapm1,#01000010b ;Turn on the tone ;Loop here for 1 minute, or until hang_up. check_hangup: call watchdog ;Refresh watchdog while waiting here jnb fhang, check_timeout ;Brif still off hook test_lc4: call hup ;Do orderly hang up if back on hook jmp start ;Brand new start check_timeout: jb frohtimeout,roh_timeout ;Brif ROH timed out(after 1 minute) jb roh_on,rohtone_on mov ccapm1,#0 ;Turn off the tone jmp check_hangup ;This loop toggles roh on and off roh_timeout: mov ccapm1,#0 ;Turn off the tone clr roh_boost ;Unboost the audio setb loopswitch_ ;Open the loop call write_px2 ;Out to the port test_lc5: call hup ;Do hang up routine jnb sw_gndstart,looptest ;Do loop test if loop start jmp looptest_end ;No loop test if ground start,just ;leave loop open til ring ground ;Get here if we are in Loopstart mode. looptest: mov b,#40 ;Set up 2sec delay(40×50ms) loopt1: mov a,time_on2 ;Get current onhook time add a,#5 ;Add 50ms to present time loopt2: call watchdog ;Rcfresh watchdog cjne a,time_on2,loopt2 ;Minor delay is 50ms <dp n="d64"/> djnz b,loopt1 ;Wait 2sec total clr loopswitch_ ;Clos loop in every 2sec to check call write_px2 ;if phone was put back on hook mov looptest_timer2,#215 ;Load 2.22msec delay (8×277.8usec) loopt3: mov looptest_timer,#0ffh ;To allow enough time for the SLIC djnz looptest_timer,S ;chip to indicate the hook status call watchdog ;Refresh watchdog djnz looptest_timer2,loopt3 jb lc_looptest_end ;Brif no loop current(back-on hook) setb loopswitch_ ;Open loop switch again call write_px2 jmp looptest ;Wait here until hung up looptest_end: clr frohtimeout ;0=has been hung up,or in GS mode mov time_on1,#0 ;Reset on hook timers mov time_on2,#0 jmp start ;Start new ;****************************************************** ; ; Subroutine for hang up ; ;****************************************************** hup: call watchdog clr ex0 ;Disable Extlnt0(offhook,LC_) clr fdigit ;In case hangup while pulse dialing mov pulse_digit,#0 ;In case hup during pulse digit in put clr fdig_ready ;In case hup during pulse/dtmf input clr fdtmfin ;In case hup during dtmf digit input clr flocktimer ;In case hup during locking clr funlocktimer ;In case hup during unlocking jnb sw_gndstart,hup1 ;Brif loopstart setb loopswitch_ ;Open loopsw for 750ms if groundstart call write_px2 ;to simulate hup mov a.time_on2 ;Incs every 10ms add a,#75 ;For 750ms delay push acc ;Store for later jmp hup2 hup1: jb frohtimeout,hup2 clr loopswitch_ ;If loopstart call write_px2 hup2: clr ftime ;Clear timer flag clr fsendtimer ;Clear send timer flag mov ccapm1,#0 ;Make sure dtone is off clr fdtone ;Clear the dial tone flag clr roh_boost ;Normal audio call write_px2 jb fremote_hup,no_end_sent ;No end code if remote hup, since it ;isn′t needed and clears the buffer ;on the Motorola unnecessarily. <dp n="d65"/> mov a,#endcall ;Put end code call wrbus ;Send it to TRU first,then reset flag no_end_sent: clr fsend ;in case digits sent or alert answered setb hookswout ;Show on hook to TRU clr hookswout ;Ditto jnb sw_gndstart,hup4 ;Don′t do timing if loop start pop acc ;Get delay time back clr c ;Clear carry flag for next hup3: call watchdog cjne a,time_on2,S+3 ;Wait 750ms to allow loop to open ;and pbx to see it as disconnect. ;jmp to next instruction in any case jnc hup3 ;No carry til time_on2 greaterthan acc ;(in case bus write took more than ;750ms) hup4: setb fonhook ;Set on-hook flag clr fhang ;Clear hang-up flag clr f_one_sec ;So timer can start again when off hook clr f_inuseofftiming ;Reset flag setb ex0 ;Enable extint0(offhook) ret ;******************************************************* ; ; TRU status update ; ;******************************************************* ;Routine updates TRU status every 71.4ms,and turns ringer ;on and off.Also checks for 3.9 second interval after a ring. update_displays: push acc push psw upspec1: jnb fspec1,continue_update ;Check special flag call specl ;Special routine in TRU section continue_update: jb test_enable,go_to_self ;check if test started mov a,lamps_temp ;Hold values for comparison later mov c,roam cpl c ;No real lamps for the Maxjack! mov roamlamp,c ;Roam indicator(just for storage) mov c,noserv cpl c mov noservlamp,c ;Noserv indicator(just for storage) mov c,lock cpl c mov locklamp,c ;Lock indicator(just for storage) mov c,inuse cpl c mov inuselamp,c ;lnuse indicator(just for storage) <dp n="d66"/> call write_io_c ;update the LEDS jb sw_dialtone,not_maint ;If option sw is out(=1) ;not maintenance module test_push: call read_io_m_a ;read push button anl a,#00010000b cjne a,#0h,not_push setb test_enable ;init maint test setb fremote_hup ;set remote hup for 700ms setb loopswitch_ ;Other side has disconnected call write_px2 not_push: jnb test_enable,not_maint ;check if test started go_to_self: jnb test_end,not_error_yet ;if error was found jnb error_flag, pass_ok test_lcd: mov r0,#error_code mov a,@r0 r1 a r1 a r1 a r1 a mov lamps_temp,a call write_io_c ;update the LEDS serb ext_led ;turn on external led 1 minute jmp write_to_c pass_ok: clr ext_led ;turn on external led 1 minute jmp write_to_c not_error_yet: jb ext_led,clr_led setb ext_led ;turn on external led while testing jmp write_to_c clr_led: clr ext_led ;turn off external led while testin write_to_c: call write_io_m_c ;turn on/off the external led not_maint: mov a,lamps_temp ;Hold values for comparison later jb frohtimeout,compare mov c,ap2 ;Check we are in ALERT state, anl c,/ap1 ;(i.e.:incoming call waiting) jnc compare ;Brif not ALERT (no incoming call) jnb fonhook,compar ;Brif off hook, don′t ring bell! clr loopswitch_ ;Close loop switch if ALERT state, call write_px2 ;(incoming call is waiting) jb fcall,reset_ring_timer ;Brif ringing is already in progress setb fcall ;1=start ringing(ALERT detected) mov bell_timer,#0 ;Reset timers mov bell_timer2,#0 setb fbellsound ;Flag bell sounding mov dptr,#table_20 ;Point to 20hz table for ring mov lowpoint,dpl ;Save ringer table starts <dp n="d67"/> mov highpoint,dph setb twenty_hz_pwm ;So pin can be pwm mov ccapm2,#01000010b ;Enable pwm test1: 0 clr ring_ ;Turn on ring ps setb no_ring call write_px2 ;Out to port reset_ring_timer: ;Reset between-rings timer as long as mov ring_timer,#0 ;we are in ALERT state compare: xrl a,lamps_temp ;Bits that differ will be=1 jnb f_one_sec,dtbits ;Wait 1 see after off hook before ;looking at inuse lamp,prevents ;disconnect if offhook soon after hup mov c,acc.7 ;Get INUSE status anl c,/inuselamp ;1=not INUSE jnc timing_in_use_off ;Start timer if INUSE lamp just turned ;off mov in_use_off_timer,#28 ;Reset timer for 1.99sec(28×71.1ms) setb f_inuseofftiming ;Show in use off timer is working now timing_in_use_off: jnb inuselamp,cont_in_use_timing ;If inuse lamp still off clr f_inuseofftiming ;Otherwise clear flag and stop timin cont_in_use_timing: jnb f_inuseofftiming,dtbits ;Continue timing if flag is set djnz in_use_off_timer,dtbits ;When timer hits 1.99 sec,disconnect clr f_inuseofftiming ;Clear flag jb fonhook,dtbits ;If local hangup don′t do remote hangu ;We get here if the other party hang-up and we did not put the phone ;back on hook within 2 seconds. disconnect: setb fremote_hup ;set remote hup for 700ms setb loopswitch_ ;Other side has disconnected call write_px2 dtbits: anl a,#01110000b ;Just check bits that affect dial tone jz ring_timeout ;If nothing chgd jnb fdtone,ring_timeout ;Or if DT not on already mov ccapm1,#0 ;Turn off current DT call dtone ;Change to new dial tone ring_timeout: jnb fcall,update_done ;Don′t time ring if no incoming call inc ring_timer ;Every 71.1msec mov a,#53 ;54×71.1ms=3.84sec clr c ;Clear carry for subtraction subb a,ring_timer jnc update_done ;If not at least 3.84see with no ring jb fbellsound,update_done ;Also wait til not sounding ring check_stop_ring_ps: mov a,#3 ;4×25ms=100ms clr c ;Ready to do subtract subb a,bell_timer2 <dp n="d68"/> jnc update_done ;When carry,100ms jb ring_,chcck_stop_null ;Brif ring PS is already turned off setb ring_ ;Else turn off ring PS now call write_px2 ;Out to port clf no_ring call write_px2 ;Out to port check_stop_null: mov a,#7 ;8×25ms=200ms clr c ;Ready to do subtract subb a,bell_timer2 jnc update_done ;When carry, 200ms mov ccapm2,#0 ;Stop pwm clr twenty_hz_pwm ;Leave output pinlow,pwm has run 100 ;ms longer than ring ps to smooth out ;waveform clr fcall ;0=not ALERT,assure no ringing jnb sw_gndstart,update_done ;Brif loop start setb loopswitch_ ;GS didnt answer ring call write_px2 update_done: jb fcall,no_reset_io jnb lc_,no_reset_io jb frohtimeout,no_reset_io no_reset_io: pop psw pop acc ret ;******************************************************** ; ; Reload Watch Dog Compare Word ; ;******************************************************** watchdog: push ie clr ea ;Disable ints mov ccap4,#0 ;Point to start of current page mov ccap4h,ch ;Current page pop ie ret ;********************************************************* ; ;Timer0(TL0)on-hook interrupt service routine ; ;********************************************************* onhook_timer: push psw push acc clr trl ;Stop offnook timer clr tfl ;Clear pending ints by offhook timer mute_check: jb mute,on_spec2 ;If already muted skip this <dp n="d69"/> setb mute ;Mute rx audio to prevent false ;decoding of audio ring as dtmf, ;also prevent audio feedback call write_px2 ;Out to port on_spec2: jnb fspec2.on_spec2_donc ;Check flag call spec2 ;Call special routinc in TRU section on_spec2_done: djnz display_delay,gs_init ;In 71.1ms call update_displays ;Every 71.1ms gs_init: jb fcall,cont_service ;Skip outgoing GS init on incoming call jnb sw_gndstart,cont_service ;Brif not in GS mode jnb fonhook,cont_service ;Don′t look for ring ground to start ;GS until really hung up jb ring_ground_,cont_groundstart clr loopswitch_ ;Groundstart service was requested call write_px2 mov gndstart_timer1,#0 mov gndstart_timer2,#0 ;Init timer cont_groundstart: inc gndstart_timer1 ;Subscriber has released ring ground mov a,gndstart_timer1 cjne a,#90,cont_service ;25ms(90×277.8us) inc gndstart_timer2 ;Every 25msec mov gndstart_timer1,#0 ;Reset for next count of 90 mov a,gndstart_timer2 cjne a,#40,cont_service ;1sec(40×ms) setb loopswitch_ ;Open loop in 1 sec if sub didn′t ;complete loop call write_px2 cont_service: jb fcall,ring_control ;Brif ALERT state to generate ringing jmp onhook_timers ;Else just do timers update ;We shall ring the bell if the TRU is in ALERT state,(an incoming ;call is waiting to be picked up). ring_control: jb fbellsound,timing_ring ;When bell not sounding during ring ;cycle,check for ring ground to ;indicate answer due to ringing ;pulses jb ring_ground_,timing_ring ;If no ring ground,time the ring.Now ;ignore the pulse on ring ground as ;ringer stops mov a,bell_timer2 ;Incs every 25ms cjne a,#0,start_bellsound ;Observe any ring ground after 25ms mov a,#28 ;29×277.8us=8.1ms clr c ;Ready to subtract subb a,bell_timer jnc timine_ring ;No carry til 8.1ms after ring stops. ;Only ignore ring ground 8.1ms <dp n="d70"/> jmp start_bellsound ;If ring ground indicatcs came off hook ;during silent time,start 20hz ;again to force ring trip timing_ring: inc bell_timer ;Every 277.8usec mov a,bell_timer cjne a,#90,ringcr_on ;25mscc(90×277.8us) mov bell_timcr,#0 ;Reset for next 90 inc bell_timer2 ;Every 25msec ringer_on: jnb fbellsound,ringer_off ;Brif bell is not sounding now ;The on time ringer modified from 1.95secs to 1.975sees,because the ring ;stops at the positive peak which causes a continous ringing.This problem ;was producing with 5 ringer box applying with maxjack.(ssh) check_stop_bellsound: mov a,bcll_timer2 ;Get elapsed ″bell on″time cjne a,#59,onhook_timers ;Brif less then 79×25ms=1.975secs mov a,bell_timer ;45×277.8us=12.5ms (total 1.987s cjne a,#45,onhook_timers ;Ring stops after 1.987secs on negative ;peak,chops off last quarter cycle ;for proper ring trip stop_bellsound: mov ccapm2,#0 ;Enable pwm clr fbellsound ;0=the bell not sounding mov dptr,#table_null ;Point to table of null tone (nulltone ;causes ringer to have zero AC out, ;only battery) mov lowpoint, dpl ;Save the null table start mov highpoint,dph mov ccapm2,#01000010b ;Enable pwrn clr ca clr no_ring call write_px2 setb ea call watchdog jmp reset_bell_timers ;Reset timers ringer_off: mov a,bell_timer2 cjne a,#120,onhook_timers ;4sec with no ring(160×25) start_bellsound: call reset_io call write_pxl call write_px2 clr ea serb no_ring call write_px2 serb ea mov ccapm2,#0 ;Enable pwm mov dptr,#table_20 ;Point to table for 20hz mov lowpoint,dpl ;Remember where table starts mov highpoint,dph mov ccapm2,#01000010b ;Enable pwm <dp n="d71"/> test_relay1: setb fbellsound ;1=bell is sounding now reset_bell_timers: mov bell_timer,#0 mov bell_timer2,#0 onhook_timers: inc time_onl ;Every 277.8usec while on hook mov a,time on1 ejne a,#36,onhook_done ;36×277.8ms=10ms inc time_on2 ;Every 10msec while on hook mov time_on1,#0 ;Reset for next 36 mov a,time_on2 cjue a,#0,not_inc255 inc test_min ;10msec×255=.255see not_inc255: jb frohtimeout,onhook_done ;Skip hang up stuff until loop test ;checks out ok test_fhang1: jb fonhook,onhook_done ;Don′t do another hang up,one has been ;done already test_fhang2: mov a,time_on2 ; ;ON HOOK STATUS ; cjne a,#70,onhook_done ;700msec indicates hang up cjne a,#30,onhook_done ;700msec indicates hang up test_fhang3: setb fhang ;Set the hang up flag clr f_inuseofftiming ;Stop timer to prevent possible remote ;hup onhook done: pop acc pop psw reti ;***************************************************************** ; ;Timer1(TH0)off-hook interrupt service routine ; ;***************************************************************** offhook_timer: push psw ;Save entry status push acc jnb fspec2,check_strobe ;Brif spec2 is not enabled call spec_2 ;Else do TRU specific task ;Check for a DTMF digit,and read it from the MT8870 if there ;is one available. check strobe: call read_px1_strobe jb strobe,decode dtmf ;Brif a DTMF digit is waiting clr fdecoder_busy_ ;Reset if strobe is gone <dp n="d72"/> jmp ttimc ;and just do offhook timing task dccode_dtmf: jb fdccoder_busy,ttimc ;Brif DTMF digit already was read call read_px1 ;Else read it now setb fdtmfin ;1=DTMF digit received! setb fdecoder_busy ;I=DTMF digit being processed ;Check elapsed offhook time,update displays in every 71ms,and ;start-end ROH tone as required. ttime: inc time off1 ;Bump minor offhook timer(@277.8us) mov a,time_off1 ;Get minor offhook time ;JMP TEST_HOOK cjne a,#0,t_one_sec ;Brif=256*277us=71.1ms inc time_off2 ;Bump major timer(every 71.1ms) call update_displays ;Do update every 71.1ms mov a,time_off2 ;Get major offhook time cjoe a,#0,t_one_sec ;Brif=256*71.1ms=18.2sec inc time_off3 ;Bump total offihook timer(@18.2.sec) 1_one_scc: mov a,time_off2 ;Get major offhook time cjne a,#14,trohtimer ;Brif=14*71.1ms=995ms passed setb f_one_sec ;so change in INUSE lamp won′t cause ;hangup if phone taken off hook too ;soon after hangup trohtimer: jb fsend,tdone ;Brif we originated the call(no ROH) jnb inuse,tdone ;Brif we are INUSE(no ROH either) inc r5 ;Bump minor ROH start/end timer cjne r5,#36,trohstart ;Brif=35*277.8us=10ms passed inc r7 ;Bump minor ROH on/off timer mov r5,#0 ;Reset for another pass(10ms) cjne r7,#10,trohstart ;Brif=10*10ms=100ms passed cpl roh_on ;Toggle ROH on/off every 100ms mov r7,#0 ;Reset for another on/off phase trohstart: mov a,time_off3 ;Get total elapsed offhook time cjne a,#2,trohquit ;Brif_2×18.2=36.3sec passed mov a,time_off2 ;Get additional major time too cjne a,#51,trohquit ;Brif_40sec total offhook setb ftime ;1=ROH period started trohquit: mov a,time off3 ;Get total offhook time again cjne a,#5,tdone ;Brif=5*18.2=91sec passed mov a,time_off2 ;Get additional major time too cjne a,#127,tdone ;Brif=91+(127*71.1ms)=100sec setb frohtimeout ;1=ROH period expired tdonc: jnb f_start,tdone0 ; Brif not timing 500ins aftcr ″first″ mov a,time_off2 ; Get elapsed offhook time <dp n="d73"/> cjne a,#4,tdone1 ;Rrif=285ms elapsed cjne a,#7,tdone1 ;Brif=500ms elapscd clr f_stan ;Reenable onhook ints after 500ms ;Get here only after 500ms passed following the first offhook after ;every hang up. tdonc0: jnb lc_,tdone1 ;Brif offhook now test tr0: clr tr1 ;Else stop the off hook timer setb tr0 ;and start on hook timer tdone1: pop acc ;Restore pop psw reti ;******************************************************** ; ;External Interrupt 0 service routine ; ;******************************************************** offhook_edge: jb frohtimeout,offhook_return1 jnb fcall,not_inc_call jb no_ring,ok_wait setb ring_ ;Turn off bell call write_px2 clr no_ring call write_px2 setb returu_ring clr ie0 ;Discard pending EX0(LC)interrupt clr tr0 ;Turn off onhook_timer and flag clr tf0 ;in case onhook_timer iht pending ok_wait: mov r7,#0ffh loop_ring: mov r6,#0ffh djnz r6,S call watchdog djnz r7,loop_ring jnb lc_,no_set esta_set: jnb return_ring,do_not_return call reset_io call write_px1 call write_px2 setb no_ring clr ring_ ;Turn off bell call write_px2 clr return_ring mov r7,#07fh loop_ring1: mov r6,#0ffh <dp n="d74"/> djnz r6.S call watchdog djnz r7,loop_ring1 do_not_return: call reset_io call write_px1 call write_px2 setb tr0 ;Turn off onhook_timer and flag mov U0,#0 reti offhook_return1: jmp offhook_return no_set: not_inc_call: clr tr0 ;Turn off onhook_timer and flag clr tf0 ;in case on hook_timer int pending push psw push acc clr ie0 ;Discard pending EX0(LC_)interrupt setb tr1 ;Start off-hook timer clr fhang ;Clear hangup flag for safety mov th0,#0 ;Reset offhook timer mov time_off1,#0 ;Timers incremented by th0 interrupts mov time_off2,#0 mov time_off3,#0 clr mute ;Unmute rx audio call write_px2 jnb fonhook,check_flash ;Brif wasn′t hung up ;coming back off hook clr fonhook ;Clear the flag,it was hung up,now ok_offhook: jnb fcall,set_hook_flag ;Brif not in ALERT state setb fanswer ;1=off hook during incoming call clr fcall ;Clear the ALERT flag(answering call) setb ring_ ;Turn off bell call write_px2 clr no_ring call write_px2 mov ccapm2,#0 ;Stop ringer PWM clr twenty_hz_pwm ;Leave output pin low jmp offhook_done set_hook_flag: seth fhook ;Show off hook if not in ALERT state jmp offhook_done check_flash: mov a,#19 ;20×10=200msec clr c ;Clear carry for subtraction subb a,time_on2 ;200-700msec is flash jnc check_digit jnb lock.offhook_done ;No flash if TRU is locked ;; setb fflash ;Set flash flag <dp n="d75"/> jmp offhook_done check_digit: mov a,#1 ;2×10=20 msec clr c ;Clear carry for subtraction subb a,time on2 ;20-200 msec is pulse jnc offhook_done ;lust a glitch inc pulse_digit ;Contains the number setb fdigit ;Possible digit flag offhook_done: mov time_on1,#0 ;Reset on-hook timers so they can be mov time_on2,#0 ; restarted on hang up mov t10,#0 pop acc pop psw offhook_return: reti ;******************************************************* ; ; PCA Interrupt Routine ; ;******************************************************* ;PCA interrupts are generated by using module 0′s (software timer) ;compare/match option on every low count=FF match.This way we can ;generate an interrupt at the end of each page,00FF-0100,01FF-0200 ;etc.which gives us an interrupt at every (256*108Sus)278us. ;This Maxjack implementation is using conditional assembly to produce ;a modified PCA service routine for TRUs with extremely high data transfer ;rates(Audiovox requires the alternate PCA routine). Sge pea_service: %if(%intmask ne 0)then( push ie ;Going to simulate third interrupt ;priority level mov ie,#%intmask ;Defined in TRU section call masklabel ;To execute the reti push acc push psw mov a,ccapm1 ;Look at tone pwm orl a,ccapm2 ;Look at ring pwm anl a,#00000010b ;Just look at pwrn bit jz pca_done ;Skip next part if no tone or ring ; output do_pca: mov a,#0 ;Initialize pointer read_table: move a,@a+dptr ;Get data from table cjne a,#255,write_tone mov dph,highpoint ;Reset index this is end of table mov dpl.lowpoint mov a,#0 ;So index will be right jmp read_table ;Read first entry <dp n="d76"/> writc_tone: mov ccaplh,a ;Put data in tonc pwn mov ccap2h,a ;Put data into ring pwm -only tone ;or ring pwm is running at any givcn ;time inc dptr ;Point to next table entry for next ;time pca_done: clr ecf0 ;Reset the module 0 flag clr ea ;Disable ints mov ccap01,#0ffh ;Reload low match and suspend ; comparator mov a ccap0h ;Get last page inc a ;Point to next page mov ccap0h, a ;Load high match and restart comparator setb ea ;Enable ints again pop psw pop acc pop ie ;Restore original ints ret maskdabel: reti )else( push acc push psw mov a,ccapm1 ;Look at tone pwm orl a,ccapm2 ;Look at ring pwm anl a,#00000010b ;Just look at pwm bit jz pca_done ;Skip next part if no tone or ring ;output ;If we are generating Dial Tone now,then get the current ;value from the selected tone table,and send it to thc PCA1 ;so that proper DTMF frequency is generated on CEX1(p1.4). do_pca: mov a,#0 ;Initialize pointer read_table: movc a,@a+dptr ;Get data from table cjne a,#255,write_tone mov dph,highpoint ;Reset index,this is end of table mov dpl,lowpoint mov a,#0 ;So index will be right jmp read_table ;Read first entry write_tone: mov ccap1h,a ;Put data in tone pwm mov ccap2h,a ;Put data into ring pwm only tone or ;ring pwm is running at any givcn ;time inc dptr ;Point to next table entry for next ;time pea_done: clr ccf0 ;Resct the module 0 flag clr ea ;Disable ints mov ccap01.#0ffh ;Reload low match and suspend <dp n="d77"/> ;comparator mov a,ccap0h ;Get last page inc a ;Point to next page mov ccap0h,a ;Load high match and restart comparator setb ea ;Enable ints again pop psw pop acc rcti )fi Snoge ;************************************************* ; ; I/O Support Routines ; ;************************************************* write_px1: ;Data from px1_temp to px1 push ie ;Save interrupt status clr ea ;No interruptions clr io_select push acc push 0 ;Push r0 setb a0 ;B clr a1 mov a,px1_temp anl a,#11110000b mov b,a mov a,px2_temp anl a,#00001111b ;Keep the input bits high orl a,b mov r0,@00h ;Low address for I/O chip px1 latch movx @r0,a setb a0 setb a1 pop 0 ;Restore r0 pop acc pop ie ;Restore interrupt status ret read_px1: push ie ;Save interrupl status clr ea ;No interrupts clr io_select push acc push 0 ;Push r0 clr a0 ;A clr a1 mov r0,#0h ;Low address byte for I/O chip pxl pins movx a,@r0 anl a,#00001111b ;Mask the output bits anl px1_temp,#11110000b ;Mask the input bits in px1_temp orl px1_temp,a ;Combine inputs anl outputs into one ;byle <dp n="d78"/> sctb a0 sctb al pop 0 ;Pop r0 pop acc pop ic ;Restore interrupt status ret read_px1_strobe: push ic ;Save intcrrupt status clr ea ;No intcrrupts clr io_select push acc push 0 ;Push r0 clr a0 ;A clr a1 mov r0,#0h ;Low address byte for I/O chip pxl pins movx a,@r0 mov io_status,a setb a0 setb a1 pop 0 ;Pop r0 pop acc pop ie ;Restore interrupt status ret write_px2: ;Data from px2_temp to px2 push ie ;Save interrupt status clr ea ;No interruptions clr io_select push acc push 0 ;Push r0 setb a0 ;B clr a1 mov a,px1_temp anl a,#11110000b mov b,a mov a,px2_temp anl a,#00001111b ;Keep the input bits high orl a,b mo, r0,#00h ;Low address for I/O chip px1 latch movx @r0,a setb a0 setb a1 pop 0 ;Restore r0 pop acc pop ie ;Restore interrupt status ret write_io_c: ;Data from px2_temp to px2 push ic ;Save interrupt status clr ea ;No interruptions clr io sclect push acc push 0 ;Push r0 clr a0 ;B <dp n="d79"/> setb a1 mov a,lamps_temp anl a,#11110000b r1 a r1 a r1 a r1 a mov r0,#00h ;Low address for I/O chip pxl fatch movx @r0,a setb a0 setb a1 pop 0 ;Restore r0 pop acc pop ie ;Restore interrupt status ret read_px2: push ie ;Save interrupt status clr ea ;No interrupts clr io_select push acc push 0 ;Push r0 clr a0 ;C sctb a1 mov r0,#0h ;Low address for I/O chip px2 pins movx a,@r0 anl a,#11110000b ;Mask the output bits anl px2_temp,#00001111b ;Mask the input bits in px2_temp orl px2_temp,a ;Combine inputs/outputs into one byte setb a0 setb a1 pop 0 ;Pop r0 pop acc pop ie ;Restore interrupt status ret read_io_m_a: ;Data from px2_temp to px2 push ie ;Save interrupt status clr ea ;No interruptions setb io_select ; push acc push 0 ;Push r0 clr a0 ;b clr a1 mov r0,#00h ;Low address for I/O chip pxl latch movx a,@r0 setb a0 setb a1 clr io select pop 0 ;Restore r0 ; pop acc pop ie ;Restore interrupt status ret write_io_m_b: ;Data from pxl_temp to pxl <dp n="d80"/> push ic ;Save interrupt status setb io_sclcct clr ea ;No interruptions push acc push 0 ;Push r0 setb a0 ;B clr a1 mov a,io_m_b mov r0,#00b ;Low address for I/O chip px1 latch movx @r0,a setb a0 setb al clr io_select pop 0 ;Restore r0 pop acc pop ie ;Restore interrupt status ret write_io_m_c; ;Data from px2_temp to px2 push ie ;Save interrupt status setb io_select clr ea ;No interruptions push acc push 0 ;Push r0 clr a0 ;B setb a1 mov a,io_m_c mov r0,#00h ;Low address for I/O chip px1 latch movx @r0,a setb a0 setb a1 clr io_select pop 0 ;Restore r0 pop acc pop ie ;Restore interrupt status ret resct_io_m: push ic ;Savc interrupt status clr ea ;No interrupts setb io_select push acc push 0 ;Push r0 setb a0 ;Control setb a1 mov r0,#0h ;Low address for I/O chip px2 pins mov a,#10010000b movx @r0,a setb a0 setb a1 clr io_select pop 0 ;Pop r0 pop acc pop ie ;Restore interrupt status rct <dp n="d81"/> reset_io: push ie ;Save interrupt status clr ea ;No interrupts clr io_select push acc push 0 ;Push r0 setb a0 ;Control setb a1 mov r0,#0h ;Low address for I/O chip px2 pins mov a,#10011000b movx @r0,a setb a0 setb a1 clr io_select pop 0 ;Pop r0 pop acc pop ie ;Restore interrupt status ret ;************************************************************ ; ; Support Routines ; ;************************************************************ ;Generic messages between the TRU and Celjack can be save to aid ;in debugging. This message buffer is from 90h to FFh. clr_msg: push 1 ;Save R1 mov r1,#msgbuf_start ;Point to message buffer start mov msg_ptr,r1 ;Save buffer start clr_msg1: mov @r1,#55h ;Fill with 55h mask inc r1 ;Point to next location cjne r1,#msgbuf_end,clr_msg1 ;Til end of the buffer pop 1 ;Restore R1 ret savemg: push 1 ;Save R1 mov r1,msg_ptr ;Get current pointer cjne r1,#msgbuf_end,savem1 ;Brif message buffer is not full yet mov r1,#msgbuf_start ;Repoint to start when full sevem1: mov @r1,a ;Save msg in buffer inc r1 ;Advance pointer mov msg_ptr,r1 ;Save advanced for next time pop 1 ;Restore R1 exit: ret ;Clear copy of handset′s LCD display from ram display buffer. <dp n="d82"/> clr_dsp: push 1 ;Save R1 mov r1,#dspbuf_start ;Point to message buffcr start mov dsp_ptr,r1 ;Save buffer start clr_dsp1: mov @r1,#0ffh ;Fill with FFh mask inc r1 ;Point to next location cjnc r1,#dspbuf_cnd,clr_dspl ;Til end of display buffer pop 1 ;Rastore R1 ret ;Some TRUs must save the handset LCD display info,in a local display ;buffer. save_dsp: push 1 ;Save R1 mov r1,dap_ptr ;Get current pointer cjne r1,#dapbuf_end,save_dsp1 ;Brif message buffer is not full yet mov r1,#dspbuf_start ;Repoint to start when full save_dsp1: mov @r1,a ;Save msg in buffer inc r1 ;Advance pointer mov dsp_ptr,r1 ;Update pointer for next time pop 1 ;Restore R1 save_dsp2: ;include(SPAIN.asm) ret Snolist Sinclude(SPAIN4.asm) $list nop nop end;
Claims (27)
1.一种蜂窝或蜂窝式无线电收发机设备,它包括:蜂窝或蜂窝式无线电收发机;蜂窝或蜂窝式接口装置以及标准陆用电话机,该电话机与蜂窝或蜂窝式无线电收发机相连,所说的接口装置将DTMF或脉冲型拨号信号转换为数字格式以便发送给蜂窝或蜂窝式无线电接收机,从而,可以用在陆用电话机上所拔出的号码去呼叫蜂窝或蜂窝式系统范围内的号码,所述蜂窝或蜂窝式无线电收发机设备的特征在于包括:
自诊断装置,它用于监控和报告前述蜂窝或蜂窝式无线电收发机以及蜂窝或蜂窝式接口装置的适当功能;
用于将自诊断装置交替地连接于蜂窝或蜂窝式接口装置的装置;
上述用于将自诊断装置交替地连接的装置包括这样的装置,它用于在自诊断装置连接于蜂窝或蜂窝式接口装置时断开标准的陆用电话机与蜂窝或蜂窝式接口装置的联系;
上述自诊断装置包括这样的装置,它用于模拟标准陆用电话机的功能以便在蜂窝或蜂窝式接口装置内产生各种相应的应答,从而确定该接口装置是否在正常运转。
2.如权利要求1所述的蜂窝式无线电收发机设备,其特征在于,用于模拟标准陆用电话机功能的装置包括这样的装置,它用于向蜂窝或蜂窝式接口装置产生一个摘机信号。
3.如权利要求2所述的蜂窝式无线电收发机设备,其特征在于,自诊断装置包括这样的装置,它用于检测前述接口装置响应所生成的摘机信号而产生的拨号音信号是否出现。
4.如权利要求1所述的蜂窝式无线电收发机设备,其特征在于,用于模拟标准陆用电话机功能的装置包括这样的装置,它用于生成一个DTMF信号并将该信号传送给前述接口装置。
5.如权利要求4所述的蜂窝式无线电收发机设备,其特征在于,自诊断装置包括这样的装置,它用于检测前述接口装置因响应生成DTMF信号的装置所生成的DTMF信号而输出的DTMF信号。
6.如权利要求1所述的蜂窝式无线电收发机设备,其特征在于,用于模拟标准陆用电话机功能的装置包括这样的装置,它用于向前述接口装置生成一个挂机信号。
7.如权利要求6所述的蜂窝式无线电收发机设备,其特征在于,自诊断装置包括这样的装置,它用于模拟对收发机所进行的电话呼入,以便使前述接口装置启动自身的振铃发生器;该自诊断装置还包括用于检测由此产生的振铃信号的装置。
8.如权利要求7所述的蜂窝式无线电收发机设备,其特征在于,用于模拟标准陆用电话机功能的装置包括这样的装置,它用于在前述接口装置正在产生振铃信号时向该接口装置产生一个摘机信号,以便确定接口装置在应答电话呼入时适时地断开振铃信号。
9.如权利要求1所述的蜂窝式无线电收发机设备,其特征在于,自诊断装置包括这样的装置,它用于通过前述接口装置和收发机以及电话系统产生一电话呼出并送回给该无线电收发机;上述自诊断装置还包括这样的装置,它用于检测前述收发机因响应上述电话呼叫而产生的忙音信号;上述用于产生电话呼出的装置呼叫业已分配给上述收发机并与该收发机实际相联的电话号码。
10.一种检测设备,它用于检测蜂窝或蜂窝式接口装置的适当操作,所说的接口装置能与陆用电话或电话式设施相连,并且能将来自与之相连的陆用电话设施的DTMF信号或脉冲式拨号信号转换成数字数据格式以便将该数字数据传送给前述收发机,所说的检测设备包括诊断装置,它用于监控和报告前述接口装置的适当功能;
其特征在于,该检测设备还包括用于将诊断装置交替地连接于前述接口装置的装置;
所说的诊断装置包括这样的装置,它用于模拟标准陆用电话的功能以便在前述接口装置内产生各种相应的应答,从而确定接口装置是否在正常运转;
上述用于交替连接诊断装置的装置包括这样的装置,它能在诊断装置连接于前述接口装置时断开标准陆用电话式设施与前述接口装置的联系。
11.如权利要求10所述的检测设备,其特征在于,用于模拟标准陆用电话式设施功能的装置包括这样的装置,它用于向前述接口装置产生一摘机信号。
12.如权利要求11所述的检测设备,其特征在于,所说的诊断装置包括这样的装置,它用于检测前述接口装置因响应所生成的摘机信号而产生的拨号音信号是否出现。
13.如权利要求10所述的检测设备,其特征在于,用于模拟标准陆用电话式设施的装置包括这样的装置,它用于生成一个DTMF信号并将该信号传送给前述接口装置。
14.如权利要求13所述的检测设备,其特征在于,所说的诊断装置包括这样的装置,它用于检测前述接口装置因响应生成DTMF信号的装置所生成的DTMF信号而输出的DTMF信号。
15.如权利要求13所述的检测设备,其特征在于,用于模拟标准陆用电话式设施功能的装置包括这样的装置,它用于向前述接口装置生成一个挂机信号。
16.如权利要求10所述的检测设备,其特征在于,所说的诊断装置包括这样的装置,它用于模拟对收发机所进行的电话呼入,以便使前述接口装置启动自身的振铃发生器;该诊断装置还包括用于检测由此产生的振铃信号的装置。
17.如权利要求16所述的检测设备,其特征在于,所说的诊断装置还包括这样的装置,它用于在前述接口装置正在产生振铃信号时向该接口装置产生一个摘机信号,以便确定接口装置根据对电话呼入的应答而适时地断开振铃信号。
18.如权利要求10所述的检测设备,其特征在于,所说的诊断装置包括这样的装置,它用于在前述接口装置连接于收发机时通过蜂窝或蜂窝式电话网产生一个电话呼出并送回给上述无线电收发机,从而所说的诊断装置会使得收发机呼叫自己;上述诊断装置还包括这样的装置,它用于检测前述收发机因响应上述电话呼叫而产生的忙音信号,上述用于产生电话呼出的装置呼叫业已分配给与前述接口装置相连的收发机的电话号码。
19.一种利用诊断装置检测蜂窝或蜂窝式接口装置适当操作的方法,所说的接口装置可与陆用电话或电话式设施相连,并且能将来自与之相连的陆用电话式设施的DTMF信号或脉冲式拨号信号转换成数字数据格式,以便将该数字数据传送给前述收发机,所说的方法包括:
(a)监控并报告前述接口装置功能;
其中步骤(a)包括:
(b)将诊断装置交替地连接于前述接口装置;
(c)模拟标准陆用电话式设施的功能以便在前述接口装置内产生各种相应的应答,从而确定接口装置是否在正常地操作;
其中步骤(b)包括:
在诊断装置连接口装置时断开标准陆用电话式设施与前述接口装置的连接。
20.如权利要求19所述的方法,其特征在于,所说的步骤(c)包括向前述接口装置产生一摘机信号。
21.如权利要求20所述的方法,其特征在于,它还包括检测前述接口装置因响应所生成的摘机信号而产生的拨号音信号是否出现。
22.如权利要求19所述的方法,其特征在于,所说的步骤(c)包括生成一个DTMF信号并将该信号传送给前述接口装置。
23.如权利要求22所述的方法,其特征在于,它还包括检测前述接口装置因响应所生成的DTMF信号而输出的DTMF信号。
24.如权利要求22所述的方法,其特征在于,所说的步骤(c)包括向前述接口装置产生一个挂机信号。
25.如权利要求19所述的方法,其特征在于,所说的步骤(a)包括模拟对收发机的电话呼入,以便使前述接口装置启动自身的振铃发生器并且检测所产生的振铃信号。
26.如权利要求25所述的方法,其特征在于所说的步骤(a)还包括在前述接口装置正在产生振铃信号时向该接口装置产生一个摘机信号,以便确定接口装置在应答电话呼入时适当地断开振铃信号。
27.如权利要求19所述的方法,其特征在于,所说的步骤(a)包括在前述接口装置连接于收发机时通过蜂窝或蜂窝式电话网产生一个电话呼出并送回给上述无线电收发机;该产生电话呼出的步骤使收发机呼叫自己,并且还包括检测上述蜂窝或蜂窝式无线电收发机因响应电话呼叫而产生的忙音信号。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US3762793A | 1993-03-25 | 1993-03-25 | |
US08/037,627 | 1993-03-25 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1119898A CN1119898A (zh) | 1996-04-03 |
CN1064808C true CN1064808C (zh) | 2001-04-18 |
Family
ID=21895376
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN94191585A Expired - Fee Related CN1064808C (zh) | 1993-03-25 | 1994-03-02 | 用于蜂窝式无线电收发机系统的自诊断系统 |
Country Status (34)
Country | Link |
---|---|
EP (1) | EP0691058B1 (zh) |
JP (1) | JPH08510872A (zh) |
CN (1) | CN1064808C (zh) |
AT (1) | ATE162036T1 (zh) |
AU (1) | AU674406B2 (zh) |
BG (1) | BG100027A (zh) |
BR (1) | BR9405970A (zh) |
CA (1) | CA2154789C (zh) |
CZ (1) | CZ287151B6 (zh) |
DE (1) | DE69407773T2 (zh) |
DK (1) | DK0691058T3 (zh) |
EC (1) | ECSP941059A (zh) |
EE (1) | EE9400437A (zh) |
ES (1) | ES2080708T3 (zh) |
FI (1) | FI954509A0 (zh) |
GR (1) | GR3026552T3 (zh) |
HK (1) | HK1002642A1 (zh) |
HU (1) | HU216556B (zh) |
IL (1) | IL108809A (zh) |
LT (1) | LT3323B (zh) |
LV (1) | LV11510A (zh) |
MD (1) | MD940289A (zh) |
MY (1) | MY110488A (zh) |
NO (1) | NO953791D0 (zh) |
NZ (1) | NZ263661A (zh) |
OA (1) | OA10229A (zh) |
PE (1) | PE12695A1 (zh) |
PL (2) | PL173533B1 (zh) |
SI (1) | SI9420026A (zh) |
SK (1) | SK118995A3 (zh) |
TR (1) | TR28486A (zh) |
UY (1) | UY23744A1 (zh) |
WO (1) | WO1994022255A1 (zh) |
ZA (1) | ZA941880B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FI102124B1 (fi) | 1996-03-07 | 1998-10-15 | Nokia Telecommunications Oy | Tilaajaliittymän kaukotestaus johdottoman tilaajaliittymän toteutettavassa radiojärjestelmässä |
US6349199B1 (en) | 1998-02-12 | 2002-02-19 | Ericsson Inc. | Reliable continuously operating fixed cellular terminal |
DE19953640A1 (de) * | 1999-11-09 | 2001-05-10 | Deutsche Telekom Ag | Verfahren zum telekommunikationsgestützten Schutz und Auffinden von Lebewesen |
CN100407839C (zh) * | 2004-12-17 | 2008-07-30 | 中兴通讯股份有限公司 | 移动电话通讯的自动测试方法及移动电话自动呼叫器 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4788711A (en) * | 1985-11-25 | 1988-11-29 | Cellular Communications Corporation | Apparatus and method for a cellular freeway emergency telephone service |
US5073919A (en) * | 1990-10-10 | 1991-12-17 | Teradyne, Inc. | Automatically testing telephone lines |
US5095500A (en) * | 1989-12-07 | 1992-03-10 | Motorola, Inc. | Cellular radiotelephone diagnostic system |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS5989043A (ja) * | 1982-11-12 | 1984-05-23 | Hitachi Ltd | 移動電話装置保守診断方式 |
US4658096A (en) * | 1984-09-18 | 1987-04-14 | Metrofone, Inc. | System for interfacing a standard telephone set with a radio transceiver |
US4737975A (en) | 1984-09-18 | 1988-04-12 | Metrofone, Inc. | Programmable system for interfacing a standard telephone set with a radio transceiver |
US5020135A (en) * | 1987-03-27 | 1991-05-28 | Teletec Corporation | Computerized multistandard, field-convertible, multiregional/multiservice, remote controllable, remote programmable mobile two-way radio system with digital serial bus link, built-in programmer and autodiagnostics |
GB8823408D0 (en) * | 1988-10-05 | 1988-11-09 | Smith Myer | Electronic test equipment |
-
1994
- 1994-03-01 IL IL10880994A patent/IL108809A/xx not_active IP Right Cessation
- 1994-03-02 AT AT94912175T patent/ATE162036T1/de not_active IP Right Cessation
- 1994-03-02 PL PL94310775A patent/PL173533B1/pl unknown
- 1994-03-02 SK SK1189-95A patent/SK118995A3/sk unknown
- 1994-03-02 BR BR9405970A patent/BR9405970A/pt not_active IP Right Cessation
- 1994-03-02 AU AU64431/94A patent/AU674406B2/en not_active Ceased
- 1994-03-02 JP JP6520147A patent/JPH08510872A/ja active Pending
- 1994-03-02 WO PCT/US1994/002281 patent/WO1994022255A1/en active IP Right Grant
- 1994-03-02 ES ES94912175T patent/ES2080708T3/es not_active Expired - Lifetime
- 1994-03-02 EP EP94912175A patent/EP0691058B1/en not_active Expired - Lifetime
- 1994-03-02 SI SI9420026A patent/SI9420026A/sl unknown
- 1994-03-02 CA CA002154789A patent/CA2154789C/en not_active Expired - Lifetime
- 1994-03-02 CN CN94191585A patent/CN1064808C/zh not_active Expired - Fee Related
- 1994-03-02 MY MYPI94000489A patent/MY110488A/en unknown
- 1994-03-02 DE DE69407773T patent/DE69407773T2/de not_active Expired - Fee Related
- 1994-03-02 HU HU9502752A patent/HU216556B/hu not_active IP Right Cessation
- 1994-03-02 NZ NZ263661A patent/NZ263661A/en unknown
- 1994-03-02 DK DK94912175T patent/DK0691058T3/da active
- 1994-03-02 PL PL94321371A patent/PL174142B1/pl unknown
- 1994-03-17 ZA ZA941880A patent/ZA941880B/xx unknown
- 1994-03-18 MD MD94-0289A patent/MD940289A/ro not_active Application Discontinuation
- 1994-03-21 PE PE1994238719A patent/PE12695A1/es not_active Application Discontinuation
- 1994-03-21 UY UY23744A patent/UY23744A1/es not_active IP Right Cessation
- 1994-03-24 LT LTIP1901A patent/LT3323B/lt not_active IP Right Cessation
- 1994-03-25 TR TR00336/94A patent/TR28486A/xx unknown
- 1994-03-25 EC EC1994001059A patent/ECSP941059A/es unknown
- 1994-11-23 EE EE9400437A patent/EE9400437A/xx unknown
-
1995
- 1995-09-15 CZ CZ19952408A patent/CZ287151B6/cs not_active IP Right Cessation
- 1995-09-18 OA OA60708A patent/OA10229A/en unknown
- 1995-09-22 FI FI954509A patent/FI954509A0/fi unknown
- 1995-09-25 BG BG100027A patent/BG100027A/xx unknown
- 1995-09-25 NO NO953791A patent/NO953791D0/no unknown
- 1995-09-25 LV LV950293A patent/LV11510A/xx unknown
-
1998
- 1998-03-05 HK HK98101829A patent/HK1002642A1/xx not_active IP Right Cessation
- 1998-04-06 GR GR980400739T patent/GR3026552T3/el unknown
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4788711A (en) * | 1985-11-25 | 1988-11-29 | Cellular Communications Corporation | Apparatus and method for a cellular freeway emergency telephone service |
US5095500A (en) * | 1989-12-07 | 1992-03-10 | Motorola, Inc. | Cellular radiotelephone diagnostic system |
US5073919A (en) * | 1990-10-10 | 1991-12-17 | Teradyne, Inc. | Automatically testing telephone lines |
Also Published As
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6690923B1 (en) | Self-diagnostic system for cellular-transceiver systems with remote-reporting capabilities | |
US5469494A (en) | Self-diagnostic system for cellular-transceiver systems | |
HU219932B (hu) | Öndiagnosztizáló berendezés és eljárás cellás adó-vevő rendszerekhez | |
US5859894A (en) | Self-diagnostic system for cellular-transceiver systems with remote-reporting capabilities | |
CN101483857B (zh) | 多模式个人无线通信系统 | |
CN100384260C (zh) | 多模式个人无线通信系统 | |
IT8922337A1 (it) | Sistema di chiamata di emergenza di gruppo. | |
CN1193448A (zh) | 多用户基站及其工作方法 | |
CN103873164A (zh) | 移动终端测试装置及方法 | |
US6459893B2 (en) | Method and system for tracing a subscription | |
CN1156135C (zh) | 用于报告固定无线终端中状态信息的方法及装置 | |
CN1064808C (zh) | 用于蜂窝式无线电收发机系统的自诊断系统 | |
CN101005685A (zh) | Phs通讯系统的自动测试方法和装置 | |
CN1179534C (zh) | 一种电信系统、一种信道选择方法和一种无线台 | |
CN2788466Y (zh) | 有线移动通信系统 | |
CN1106601A (zh) | 一种无绳电话实现漫游和双向呼叫的方法及其系统 | |
CN101478833A (zh) | 基于gsm/cdma实现常规和集群通信系统联网的方法 | |
CN1107401C (zh) | 用户无线访问系统及发端电话号码显示方法 | |
CN100574344C (zh) | 一种支持频移键控交互流程的模拟呼叫器及其呼叫方法 | |
KR20060037134A (ko) | 이동 단말의 성능 측정 장치 및 방법 | |
JP2000312188A (ja) | 移動通信システム及びシステム試験方法 | |
CN102984407A (zh) | 具有近程控制功能的可多个并联使用的电话控制器 | |
JP2001358844A (ja) | 架空送電線保守監視システム | |
WO2004019623A2 (en) | Call handling for a fixed wireless device | |
CN1988683A (zh) | 一种通信测试方法、装置及业务控制交换设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C19 | Lapse of patent right due to non-payment of the annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |