#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-8 | 0
|