In einigen technischen Museen und Ausstellungen sind alte elektromechanische automatische Vermittlungssysteme für den Selbstwähldienst, ausgestellt. Das sind z. B. die ATZ 64/65 oder auch MSN 70 aus DDR Produktion.
In der ELO wurde ein DTMF-Decoder auf einem AVR mittels Software vorgeschlagen. Leider ist zur erdfreien Entkoppelung des Signals diese Variante nicht nutzbar. Unter Nutzung des DTMF-Decoder Schaltkreises MT 8870 fand ich eine sehr gute Lösung. Durch die Bildung der Referenzspannung an VREF Pin 4 aus dem anliegenden Signal, ermöglicht es unterschiedliche Telefonanlagen an den DTMF-Decoder anzuschalten ohne das weitere Schaltungsänderungen für die unterschiedlichen Systeme erforderlich machen. Die Zeichnung ist von Lim Siong Boon und wurde mit Fehlerkorrektur und Anschaltung an den ATmega8 angepasst. Im ersten Versuchsaufbau ist der DTMF-Decoder und ATmega8 auf eine Lochrasterplatine realisiert. Auf den externen Quarz des ATmega8 kann man verzichten, weil dieser mit seinem internen Takt von 1 MHz ausreichend schnell ist. Im ersten Versuch wurde kurzerhand der Eingang des DTMF-Decoder parallel an ein Telefon angeschlossen. Wie erwartet funktionierte diese Schaltung auf Anhieb, es wurden alle gesendeten Töne korrekt dekodiert und an den ATmega8 übergeben. Die Softwarelösung für den ersten Teil der Aufgabe war somit erfüllt.

DTMF-Decoder mit MT8870 von Lim Siong Boon.
AVR und Außenbeschaltung (bitte anklicken für volle Auflösung)
Die Software für den ersten Teil war erdenklich einfach:
- Warten auf das Übergabesignal (STD) vom DTMF-Decoder,
- Übernahme des Signals (Q1 ... Q4),
- Wählen der entsprechenden Nummer, ausblenden von * und #.
Es wurde noch kein Ringpuffer realisiert, um schnell folgende DTMF-Signale zu speichern. Dass bedeutet, wenn die Impulswahl beendet wurde, dass dann erst wieder das Übergabesignal (STD) vom DTMF-Decoder abgefragt wird.
Aufbau der Schaltung mit der 5 V Stromversorgung auf einer Lochrasterplatine.
Jetzt wurde das Modul DTFM2Pulse wurde an die MSN 70 angeschlossen. Um das Wählen an nur einer freien Leitung zu testen, wurde der Eingang mit dem Ausgang parallel geschalten, was zu keiner Beeinflussung führte. Die Impulse störten nicht den DTMF-Decoder. Leider hat die MSN 70 die gesendeten Impulse nicht gewählt. Ein Blick in den Stromlaufplan eines alten Telefonapparates mit Fingerlochscheibe zeigt auf, dass ein Telefonapparat simulieren werden muss.
Stromlaufplan eines Telefonapparats.
Wie muss diese Simulation aussehen? Liegt der Telefonhörer auf der Gabel, ist der Eingang a/b gleichstrommäßig hochohmig. Wird der Hörer von dem Telefon abgehoben erfolgt eine Gleichstromschleife mit dem Schleifenwiderstand von rund 600 Ω. Wird die Fingerlochscheibe gedreht, wird über den „nsa" Kontakt der Gleichstromwiderstand fast 0 Ω, bei einigen Telefonen sind z. B. 33 Ω Widerstände eingebaut. Wird die Fingerlochscheibe losgelassen, bewegt sie sich zur Ausgangsstellung und es wird über den „nsi" Kontakt der Gleichstrom mit einem Taktverhältnis von 1,5 : 1 bzw. 60 ms : 40 ms unterbrochen. Das heißt, dass sich der Gleichstromwiderstand zwischen 0 (33) Ω und unendlich bewegen muss. Hat die Fingerlochscheibe die Ausgangsposition erreicht, wird der „nsa" Kontakt wieder geöffnet und der Gleichstromwiderstand beträgt jetzt wieder 600 Ω. Diese Simulation des nsa Kontaktes durch ein Relais realisiert. Der „nsi" Kontakt ist über den Optokoppler realisiert.
Der nächste Schritt ist die Erkennung eines ankommenden Rufes. Dafür gibt es 2 Möglichkeiten, die erste ist wie im Telefon. Das Läutwerk des Telefones wird über die Schaltung Kondensator/Spule des Läutwerkes realisiert. Die Spule wird kurzerhand durch ein Relais ersetzt, dessen Kontakte den Anruf dem ATmega8 melden. Die zweite Möglichkeit ist das Signal durch einen Optokoppler zu übergeben, wie es auch Lim Siong Boon vorschlägt:
Anrufsignalisation.
Um die Anruferkennung, das Läutwerk, abzuschalten muss wie bei einem Telefonapparat eine Gabelumschaltung realisiert werden. Aufgabe der Gabelumschaltung ist die Trennung des Läutwerkes von der Telefonleitung und die Herstellung der Gleichstromschleife. Damit erkennt die Telefonanlage, dass ein Teilnehmer den Anruf entgegennimmt bzw. dass er eine Verbindung durch Selbstwahlbetrieb aufnehmen möchte. Durch ein weiteres Relais erfolgt die Gabelumschaltung. Das Relais wird von dem ATmega8 angesteuert.
Das Programm muss jetzt folgende Funktionen erfüllen:
- Anrufannahme,
- Schalten des Relais Gabelumschalter,
- Empfangen der DTMF-Signale,
- Speichern von max. 3 Nummern, warten 30 sec. oder zweite oder dritte Nummer folgt,
- Ausgabe der Impulse über das Relais „nsa" und dem Optokoppler „nsi",
- Trennen der Leitung über das Relais „Gabelumschalter",
- Löschen des Ringpuffers.
Nach dem Wählen der letzten Ziffer muss die MSN 70 die weitere Vermittlung/Umleitung des Anrufers durchführen. Wichtig ist hier zu wissen das bei der vorhandenen MSN die ankommenden Teilnehmer immer auf einen festen Platz ankommt und dann normalerweise durch das (nicht mehr vorhandene) Vermittlungspersonal vermittelt wird. Das Vermitteln erfolgt durch die Wahl der entsprechenden Anschlussnummer, die 2- oder 3-stellig sein darf.
Ein Foto der komplett bestückten Lochrasterplatine, entsprechend dem Entwurf des Stromlaufplanes. Es ist zu erkennen, dass alle Baugruppen des „nsa", „nsi", „Anrufschaltung" und „Gabelumschalter" mit Klemmanschlüssen ausgelegt sind. Dies war für das Testen und Programmieren der Funktionen sehr hilfreich. Für einen endgültigen Bausatz ist das aber nicht notwendig.
Download: C-Quelltext und Hex-Datei
Quellen:
NVA Museum Harnekop, www.nva-harnekop.de/
Troposphärenfunk Wollenberg, www.bunker-wollenberg.de/
Interessengemeinschaft historische Fernmeldetechnik e. V., www.ighft.de
MT8870 der Firma ZARLINKTM SEMICONDUCTOR. www.siongboon.com/projects/2005-07-18_dtmf_circuits/
Atmel® AVR ATmega8, DIL-28 Gehäuse.
/* DTFM To Pulse
* für MSN 70 NVA Museum Harnekop
* Compile with mikroC PRO for AVR Version 2.10
* MikroElektronika(R)
* Autor (C) 2010 Jörg Drobick
* Homepage: http://people.freenet.de/SASundChiffrierdienst
* eMail: SASundChiffrierdienst@freenet.de
* Anpassungen der Zeile 54 und 78 muß entsprechend
* der MSN erfolgen.
* Lizenz entsprechend GNU-GPL http://www.gnu.org/licenses/gpl.html
*/
volatile unsigned short counter, wi; // Variablenschutz vor Fehler beim Beschreiben/Lesen
// Counter -> anzahl der gewählten Nummern
// wi die gewählte nummer, Lokale variablen in den Int-Programmen vermeiden
unsigned short numbers[3]; // Nummernspeicher
/* Interruptprogramm */
/* MikroElektronika empfiehlt keine lokale Variablen in INT-Routinen */
void Interrupt() org IVT_ADDR_INT0 // Int0 PD2
{
wi = PINC; // Lade Byte aus Port C
wi &= 0x0f; // Maskieren
if (wi < 11) // 1 - 10 übernehmen, 11 und 12 löschen
{
numbers[counter] = wi; // in array ablegen
++counter; // nächstes Arrayfeld
}
if (counter == 3) INT0_bit = 0; // Interrupt sperren, nicht mehr als 3 Ziffern wählen
}
int main(void)
{
unsigned short i; // lokale Variable für Schleifen
PORTC = 0x0; // Input Port C
PORTD = 0x4; // Bit 0, 1, 3 Output, Bit 2 Input
DDRC = 0x00; // PC0 ... 5 als Input, PC4 Startbit
DDRD = 0xb; // PD0, 1, 3 Output, PD2 Input INT0
SREG_I_bit = 1; // interrupt enable
ISC01_bit = 1; // Flanke steigend von INT0 -PD2-
while (1)
{
while (!PINC5_bit) // Frage Bit 5 Port C ab, Sprung von High auf Low, Anruf
{
counter = 0; // Zähler der gewählten nr.
PORTD0_bit = 1; // Stromschleife über 600 Ohm Relais Ein
PORTD3_bit = 1; // PIN D3 Gabelumschalter Relais Ein
numbers[0] = 0; // vor Interrupt Array löschen
numbers[1] = 0; // spart 12 byte gegenüber Schleife
numbers[2] = 0;
INT0_bit = 1; // int0 enable Interrupt jetzt freigeben
Delay_ms(10000); // HIER MUß DER INTERRUPTANFORDERUNG ERFOLGEN 10 SEC ZEIT
// IN DER ZEIT SOLLTEN MAXIMAL 3 NUMMERN GEWäHLT WORDEN SEIN.
INT0_bit = 0; // Interrupt sperren, falls nicht schon in der INT-Routine geschehen
counter = 0; // ab Zähler 0 wählen
while( ( numbers[counter] > 0 ) & ( counter < 3 ) ) // Wähle Impulse, wenn der Wert größer Null ist
{
for (i = 0; i < numbers[counter]; ++i)
{
PORTD1_bit = 1; // PIN D1 0 (33) Ohm Relais, Stromschleife Wählmodus
PORTD0_bit = 0;
Delay_ms(40); // unendlich Widerstand Wähl Imupls
PORTD0_bit = 1;
Delay_ms(60); // 600 Ohm kein Impuls
}
PORTD1_bit = 0; // PIN D1 600 Ohm Relais, Hörmodus Stromschleife
++counter; // nächste Zahl holen
Delay_ms(200); // 200ms warten auf nächste Nummer
} // While End, Alle Nummern gewählt
Delay_ms(200); // in der Zeit muß die ATZ die Vermittlung vorgenommen haben
// MUß ENTSPRECHEND DER ANLAGE NOCH KORREGIERT WERDEN.
PORTD3_bit = 0; // Relais Gabelschaltung aus, Warten auf neuen Anruf
PORTD1_bit = 0; // Relais 600 Ohm aus
PORTD0_bit = 0; // Optokoppler Stromschleife über 600 Ohm aus, Stromsparmodus
}
}
return 0;
}