Source file: /~heha/basteln/Haus/Telefon/Mithören-ISDN/Firmware.zip/AT90USB162/main.cpp

/* ISDN-Sniffer
 140115	Aller Anfang …

Portbelegung des AT90USB162:
14	PB0	(!SS)	frei
15	PB1	(SCLK)	frei für Programmer
16	PB2	(MOSI)	frei für Programmer
17	PB3	(MISO)	frei für Programmer
18	PB4	(T1)	frei
19	PB5		Grüne LED nach Masse
20	PB6		Rote LED nach Masse
21	PB7	(OC1C)	Ader 2 + treiben

2	PC0	XTAL2	Quarz 16000 kHz
24	PC1	RESET	frei für Programmer
5	PC2		Ader 2 - treiben
26	PC4		Schalter nach LOW: µ-Law (beim Einschalten); B2 belauschen
25	PC5	OC1B	Rechter Analogausgabekanal
23	PC6	OC1A	Linker Analogausgabekanal
22	PC7	INT4	Low wenn Ader 1B positiv (Hören+)

6	PD0	INT0	Low wenn Ader 2B positiv (Sprechen+)
7	PD1	(AIN0)	Ader 2A treiben
8	PD2	RxD	frei für Diagnose
9	PD3	TxD	frei für Diagnose
10	PD4	INT5	Low wenn Ader 2A positiv (Sprechen-)
11	PD5	(XCK)	Ader 1 - treiben
12	PD6	INT6	Low wenn Ader 1A positiv (Hören-)
13	PD7	!HWB	Schalter nach LOW: Programmiermodus; D belauschen?

Pardon, da habe ich etwas falsch verstanden:
Der Bootloader (!HWB) wird NUR bei Reset (von PC1) angesprungen!
Bei Power-On-Reset interessiert die Beschaltung von !HWB nicht.
Daher ist jetzt noch ein RC-Glied an Reset.

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
 ╔╤╤═╤╤╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
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║
 ╟─┼─┼┬┼─┼┬┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
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║
 ╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
B = B1, b = B2, H = Hören, S = Sprechen, A = Aktivierungszustand
D = Daten, E = Echo, L = Gleichspannungs-Ausgleichsbit
╤┬ = 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"

void onSuspend() {
// TIMSK0=0;		// keine Interrupts
// EIMSK=0;
// TODO: Resistive Verbraucher (LEDs, PWM) sowie ISR abschalten
}

void onResume() {
// EIMSK=0x71;
// TIMSK0=0x02;
}

int main() {
 CLKPR=0x80;
 CLKPR=0;	// volle 16 MHz aktivieren
 byte __attribute__((unused)) mcusr=MCUSR;
 MCUSR=0;
 WDTCSR=0x18;
 WDTCSR=0;	// Watchdog aus (ein beim Start aus Urlader)
 
 ACSR =0x80;	// Kein Analogvergleicher
 PORTB=0x1F;	// Freie Pins mit Pull-Up
 PORTC=0x90;	// Interrupteingänge mit Pullup, Treiber-Ausgänge ohne Pullup
 PORTD=0xD1;
 DDRB =0x60;
 DDRC =0x60;
 DDRD =0x0C;
 s0Init();
 usbInit();
 sei();
 word t=0;
 for(;;) {
//  sleep_cpu();
  if (!++t) PINB|=0x20;	// Grüne LED
  usbPoll();
 }
}
Detected encoding: UTF-80