Quelltext /~heha/basteln/Haus/Telefon/Mithören-ISDN/Firmware.zip/ATmega32U4/main.c

/* 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();
 }
}
Vorgefundene Kodierung: UTF-80