Source file: /~heha/basteln/PC/usbfloppy/usbfloppy.zip/main.cpp

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

#include "ufi.h"

void onResume() {
// clock_prescale_set(clock_div_1);
		//Bit:	7	6	5	4	3	2	1	0
 PORTB = 0b11111111;
 DDRB  = 0b01001011;//	-	SS	DC	WP	STP	TK0	Motor2	(!LED1)
 PORTC = 0b11000000;
 DDRC  = 0b01000000;//	-	DS2	.	.	.	.	.	.
 PORTD = 0b11111111;
 DDRD  = 0b10100111;//	DIR	-	(!LED3)	RD	IDX	DS3	Motor3	WD
 PORTE = 0b01000000;
 DDRE  = 0b01000000;//	.	WG	.	.	.	(HWB)	.	.
 PORTF = 0b11110011;
 DDRF  = 0b11110000;//	Motor1	DS0	DS1	Motor0	.	.	-	-
 Disk::poweron();
}

void onSuspend() {
 TIMSK3= 0;		// sollte, da synchron, hier ohnehin nicht stören
 DDRB  = 0;
 PORTB = 0;
 DDRC  = 0;
 PORTC = 0;
 DDRD  = 0;		// LED aus
 PORTD = 0;
 DDRE  = 0;
 PORTE = 0;
 DDRF  = 0;
 PORTF = 0;
}

static void setupHardware() {
#ifdef ARDUINO
 UDCON = 0x01;	// für den Fall dass der Urlader per Zeitüberschreitung endet
#else
// Bei einem originalen ATmega32U4 (von Atmel, nicht mit Arduino-Bootloader)
// werden noch die folgenden Anweisungen benötigt:
 MCUCR = 0x80;	// JTAG ausschalten (ist das an?)
 MCUSR = 0x00;	// WDRF löschen, damit das Deaktivieren des Watchdogs klappt
 WDTCSR= 0x18;
 WDTCSR= 0x00;	// Anscheinend aktiviert der AVR-Urlader den Watchdog: deaktivieren!
 CLKPR = 0x80;
 CLKPR = 0x00;	// CLKDIV8-Fuse ist ab Werk gesetzt
#endif
 PRR0  = 0xED;	// alles aus:
 PRR1  = 0x19;	// alles außer USB
 ACSR  = 0x80;	// Analogvergleicher aus
 USBCON= 0x11;	// OTG-Pad überwachen; usbPoll() kümmert sich um den Rest
}

// Rote LEDs an PB0 und PD5 gegen Ucc, daher invertiert!

int main() {
 setupHardware();
#ifdef ARDUINO
 usbPoll();	// Kein sleep bei Start aus Arduino-Urlader
#endif
 sei();
 for(;;) {
  SMCR=UDINT&1?0x05:0x01;	// sleep => PowerDown oder Idle
  byte b=UDINT&1?0x18:0x09;	// Reset-Ende und Wakeup bzw. Suspend
  cli();
// USB-Interrupts freigeben
  UDIEN=b;
  UENUM=2; UEIENX=0x04;		// OUT
  UENUM=0; UEIENX=0x08;		// SETUP
  sei();
  sleep_cpu();	// spart ein paar mA
  cli();
// USB-Interrupts wieder sperren — außer OTG-Pad (selten; wird eh' zuerst behandelt)
  UEIENX=0;
  UENUM=2; UEIENX=0;
  sei();
  UDIEN=0;	// dieser Befehl noch mit gesperrten Interrupts
  usbPoll();
 }
 return 0;
}

EMPTY_INTERRUPT(USB_GEN_vect);
EMPTY_INTERRUPT(USB_COM_vect);
Detected encoding: UTF-80