/*ISDN-Simulator
zum Test von ISDN-Sniffer (mv-17)
Alle D-Bits sind 1!
*/
#include <avr/io.h>
#define LH 1 // Leitung Hören, innere Doppelader, blau
#define LS 2 // Leitung Sprechen, äußere Doppelader, grün
#define BT 4 // Bit-Trigger
#define FT 8 // Frame-Trigger (für Oszilloskop)
#define nobreak
typedef unsigned char uchar;
typedef unsigned short ushort;
static void waitint() {
uchar c;
while (!(c=TIFR0)); // warte bit „Interrupt“
TIFR0=c;
}
register uchar v asm("r2");
register uchar h asm("r4");
register uchar s asm("r5");
register ushort h1 asm("r8");
register ushort s1 asm("r10");
register ushort h2 asm("r12");
register ushort s2 asm("r14");
register uchar d asm("r3");
// Bit 7 von h und s ausgeben, v beachten und durchreichen
void outbit(void) {
waitint(); // warte bit „Interrupt“
PORTC|=BT;
if (h&0x80) {
DDRC&=~LH; // hochohmig (0V)
}else{
if (v&LH) v&=~LH; // Nicht invertieren
else PINC=LH; // Standard-AMI-Kodierregel
DDRC|=LH; // niederohmig (+ oder -)
}
if (s&0x80) {
DDRC&=~LS;
}else{
if (v&LS) v&=~LS;
else PINC=LS;
DDRC|=LS;
}
h<<=1; // nächstes Bit
s<<=1;
PORTC&=~BT;
}
// 250 µs Info S0 (Ruhe)
void infos0(void) {
PORTC|=FT;
waitint();
DDRC&=~LH;
DDRC&=~LS;
PORTC&=~FT;
uchar c=47;
do waitint(); while(--c);
}
#define L_S() s=0; if ((PORTC^v)&LS) s=0x80
#define L_H() h=0; if ((PORTC^v)&LH) h=0x80
// 250 µs Info S2 (auf „Hören“), Info S1 (auf "Sprechen")
void infos2(void) {
v=LH; // Codeverletzungs-Request beim nächsten 0-Bit // Hören Sprechen
PORTC|=FT; h=0; s=0xCF; outbit(); // F=0+ 1
PORTC&=~FT; outbit(); // L=0- 1
v=LH; outbit(); // B1=0- 0+
outbit(); // B1=0+ 0-
outbit(); // B1=0- 1
outbit(); // B1=0+ 1
outbit(); // B1=0- 1
outbit(); // B1=0+ 1
s=0xCF; outbit(); // B1=0- 1
outbit(); // B1=0+ 1
outbit(); // E=0- 0+
outbit(); // D=0+ 0-
outbit(); // A=0- 1
outbit(); // FA=0+ 1
h=0x80; outbit(); // N=1 1
outbit(); // B2=0- 1
s=0xCF; outbit(); // B2=0+ 1
outbit(); // B2=0- 1
outbit(); // B2=0+ 0+
outbit(); // B2=0- 0-
outbit(); // B2=0+ 1
outbit(); // B2=0- 1
outbit(); // B2=0+ 1
outbit(); // E=0- 1
s=0xCF; outbit(); // D=0+ 1
outbit(); // S1=0- 1
outbit(); // B1=0+ 0+
outbit(); // B1=0- 0-
outbit(); // B1=0+ 1
outbit(); // B1=0- 1
outbit(); // B1=0+ 1
outbit(); // B1=0- 1
s=0xCF; outbit(); // B1=0+ 1
outbit(); // B1=0- 1
outbit(); // E=0+ 0+
outbit(); // D=0- 0-
outbit(); // S2=0+ 1
outbit(); // B2=0- 1
outbit(); // B2=0+ 1
outbit(); // B2=0- 1
s=0xCF; outbit(); // B2=0+ 1
outbit(); // B2=0- 1
outbit(); // B2=0+ 0+
outbit(); // B2=0- 0-
outbit(); // B2=0+ 1
outbit(); // E=0- 1
outbit(); // D=0+ 1
L_H(); outbit(); // L=1 1
}
// Info S4 und S3
void infos4(void) {
v=LH; // Codeverletzungs-Request beim nächsten 0-Bit // Hören Sprechen
PORTC|=FT; h=0; s=d; outbit(); // F=0+ D
PORTC&=~FT; s=d; outbit(); // L=0- L
v=LH|LS; h=h1&0xFF; s=0; outbit(); // B1 F=0+
outbit(); // B1 L=0-
v|=LS; s=s1&0xFF; outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
h=d; outbit(); // E B1
d<<=1; outbit(); // D B1
h=0xA0; L_S(); outbit(); // A=1 L
s=d; outbit(); // FA=0 D
s=d; outbit(); // N=1 L
h=h2&0xFF; s=0; outbit(); // B2 FA=0-
outbit(); // B2 L=0
s=s2&0xFF; outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
h=d; outbit(); // E B2
d<<=1; outbit(); // D B2
h=0; L_S(); outbit(); // S1=0 L
h=h1>>8; s=d; outbit(); // B1 D
s=d; outbit(); // B1 L
s=s1>>8; outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
outbit(); // B1 B1
h=d; outbit(); // E B1
d<<=1; outbit(); // D B1
h=0; L_S(); outbit(); // S2=0 L
h=h2>>8; s=d; outbit(); // B2 D
s=d; outbit(); // B2 L
s=s2>>8; outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
outbit(); // B2 B2
h=d; outbit(); // E B2
d<<=1; outbit(); // D B2
L_H(); L_S(); outbit(); // L L
}
int main() {
// Hören, NT->TE, innere Doppelader
// Sprechen, TE->NT, 2 Bit nacheilend
MCUCR=0x10; // keine PullUps für Gleichspannungsfreiheit
OCR0A=124;
OCR0B=62;
TCCR0A=0x02; // CTC-Mode (0..OCR0A)
TCCR0B=1; // Timer0 starten
DDRC=BT|FT;
h1=0xFFFF;
s1=0xFFFF;
h2=0xFFFF;
s2=0xFFFF;
for(;;) {
ushort cnt;
PINC=LS;
PINC=LH;
cnt=8000; // 2 Sekunden
do infos0(); while(--cnt);
cnt=8000; // 1 Sekunde
do infos2(); while(--cnt);
cnt=40000; // 10 Sekunden
do {
// if (!(cnt&0xFF)) s2++;
d=0xFF;
infos4();
}while (--cnt);
}
#if 0
bit=0;
for(;;) {
bit++;
switch (bit) {
case 2: v|=LH|LS; nobreak;
case 26: h=h1; /*h1++;*/ break; // Δ = 24
case 14: h=0x80; break; // Überrahmen-Bit (immer „1“)
case 15:
case 37: h=h2; /*h2--;*/ break; // Δ = 22!
case 48: bit=0; v|=LH; break; // Kodierregel verletzen
case 4: v|=LS; nobreak;
case 28: s=s1; /*s1++;*/ break;
case 17:
case 39: s=s2; /*s2--;*/ break;
case 47: if (PORTC&LH) h=0x80; nobreak; // Ausgleich für positives F (?)
case 12:
case 36:
case 25: break;
}
PORTC&=~BT; // Laufzeit abschätzen
}
#endif
}
Detected encoding: UTF-8 | 0
|