/* ISDN-Sniffer
Portbelegung des ATmega32U4 auf „Pro Micro“:
(Es werden nur sehr wenige Pins benötigt; wegen USB ist sogar die Tonausgabe optional.)
3 PD0 INT0 Hören-
2 PD1 INT1 Hören+
4 PD4 Sprechen±
10 PB6 OC4B Tonausgabe Hören
6 PD7 OC4D Tonausgabe Sprechen
RX PD2 RxD Debug RS232
TX PD3 TxD Debug RS232
PD5 Tx-LED, Rahmen-Anzeige, low-aktiv
PB0 Rx-LED, Gespräch-Anzeige, low-aktiv
Siehe auch:
http://wwwlehre.dhbw-stuttgart.de/~schulte/digiisdn.htm
http://www.virtualuniversity.ch/telekom/telefon/7.html
http://www.rhyshaden.com/isdn.htm
S0-Rahmen (Datenrate: 192 kBit/s, Rahmenlänge 48 Bit = 250 µs)
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
╔═╤═╤╤╤═╤╤╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
S║D│L│0│0│B│B│B│B│B│B│B│B│L│D│L│0│0│b│b│b│b│b│b│b│b│L│D│L│B│B│B│B│B│B│B│B│L│D│L│b│b│b│b│b│b│b│b│L║
╟┬┼─┼┬┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
H║0│0│B│B│B│B│B│B│B│B│E│D│A│0│1│b│b│b│b│b│b│b│b│E│D│0│B│B│B│B│B│B│B│B│E│D│0│b│b│b│b│b│b│b│b│E│D│L║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
B = B1, b = B2, S = Sprechen, H = Hören, A = Anzeige Synchronzustand (?)
D = Daten, E = Echo, L = Gleichspannungs-Ausgleichsbit (ungerade Parität?)
╤┬ = ab da Verletzung AMI-Kodierregel wenn Null
*/
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "usb.h"
extern void s0Init(void);
void onSuspend() {
TIMSK0=0; // keine Interrupts
EIMSK=0;
// TODO: Resistive Verbraucher (LEDs, PWM) sowie ISR abschalten
}
void onResume() {
EIMSK=0x03;
TIMSK0=0x02;
}
int main() {
CLKPR=0x80; // Volle 16 MHz Taktfrequenz
CLKPR=0x00;
MCUCR=0x80; // Kein JTAG
ACSR =0x80; // Kein Analogvergleicher
PRR0 =0x8D; // TWI, Timer1, SPI und ADC abschalten
PRR1 =0x09; // Timer3 und USART abschalten
DIDR2=0x24; // Floatende PWM-Ausgänge niemals rücklesen
PORTB=0xBF; // Pullups aktivieren
PORTC=0xC0;
PORTD=0x7F;
PORTE=0x40; // PE2 hat extern Pulldown
PORTF=0xF3;
DDRB =0x41; // Ausgänge aktivieren (DEBUG: PWM-Ausgänge)
DDRD =0xA8;
s0Init();
usbInit();
sei();
for(;;) {
sleep_cpu();
usbPoll();
}
}
Detected encoding: UTF-8 | 0
|