/*
* Attiny13_Einschlaflampe_v01_06_final.c
*
* Created: 25.06.2018 08:00:00
* Author : Bernd
*
*
* Chip type: Attiny13a
* Clock frequency: SUT_CKSEL auf INTRCoSC_128KHZ_14CK_64MS (128kHz / 8 = 16kHz)
*
* +--------+
* [ (PB5) |1* 8| (VCC) Power ]
* [ (PB3) |2 7| (PB2) ]
* [ (PB4) |3 6| (PB1) Button ]
* [ Ground (GND) |4 5| (PB0) LED White ]
* +--------+
*
*
* Kurze Beschreibung:
* -------------------
* - Die Lampe geht beim betätigen des Tasters an PB1 an (LED PB0 Leuchtet)
* - Ohne weiteres Drücken leuchtet sie etwa 20 Sekunden
* - Ein kurzes drücken schaltet die Lampe aus oder an
* - Durch langes Drücken kommt man in den Auswahl-Modus
* Es gibt drei Moden je nachdem wann man die Taste wieder los lässt
* -Moduswechsel durch langes Drücken des Tasters
* Modus 1 LED Blinkt langsam - hier wenn los gelassen wird leuchtet die Lampe etwa 5 min.
* Modus 2 LED Blinkt mittel - hier wenn los gelassen wird leuchtet die Lampe etwa 10 min.
* Modus 3 LED Blinkt schnell - hier wenn los gelassen wird leuchtet die Lampe etwa 15 min.
*
*/
// #define F_CPU 9600000UL //Delay anpassen wegen Fusebit
#define F_CPU 128000UL //Delay anpassen wegen Fusebit
#define LED_PIN PB0 // PB0 as a LED pin
#define Taster PB1
#define AN 1
#define AUS 0
#include <avr/wdt.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
// Leere Interrupt-Routine
ISR(PCINT0_vect)
{
}
int main (void)
{
//Watchdog ausschalten!
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00;
DDRB |= (1<<LED_PIN); // Auf Ausgang schalten
PORTB |= (1<<Taster); // PullUp einschalten
PORTB |= (1<<LED_PIN); // LED einschalten
_delay_ms(400); // Kurzes Entprellen vom Watchdog auffachen (Tastendruck)
int iLeuchtdauer=80; //Standard Wert für Leuchten "iLeuchtdauer / 4 = etwa Leuchtzeit in Sekunden
int iTimer=0;
int i = 0;
while (1)
{
if (!(PINB & (1<<Taster))) // Prüfen auf Tastendruck - Bei Druck Befehl ausführen
{
_delay_ms(500); // kurze Pause
if (!(PINB & (1<<Taster))) // Prüfen auf Tastendruck - Bei Druck Befehl ausführen
{
iTimer++; // Zähler für Auswahl erhöhen
if (iTimer==5)
{
for (i=0;i<=10; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(250);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 5*60*4; // etwa 5 Minuten Leuchtzeit
}
else if (iTimer==10)
{
for (i=0;i<=14; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(150);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 10*60*4; // etwa 10 Minuten Leuchtzeit
}
else if (iTimer==15)
{
for (i=0;i<=18; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(100);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 15*60*4; // etwa 15 Minuten Leuchtzeit
}
}
else
{
PORTB ^= (1<<LED_PIN); //Toggl
iLeuchtdauer=80; // Leuchtdauer wieder auf Default setzen
_delay_ms(500);
}
}
else
{
iTimer=0; // Zähler für Auswahl auf Null setzen -Nicht schön hier
// Taste wurde nicht gedrückt counter wird weiter herunter gerechnet
// bis 0 dann wird geschlafen
if (iLeuchtdauer >= 0)
{
iLeuchtdauer--;
_delay_ms(250);
}
else
{
PORTB &= ~(1<<LED_PIN); // LED aus
//
// Schlafen
//
//
// Den ADC deaktivieren, brauchen wir nicht müsste aber pre Default aus sein.
power_adc_disable();
// Pin-Change Interrupt für die 4 Taster erlauben
GIMSK = (1<<PCIE);
PCMSK |= (1<<PB1);
sei();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
// iLeuchtdauer=80; // Unnötig wurde nur zum Test ohne Watchdog benötigt
// **************** Aufwachen und alles für den Reset über Watchdog vorbereiten ******
wdt_enable(WDTO_1S); // 1s Sekunden Watchdog einstellen
wdt_enable(WDTO_30MS); // 30ms Sekunden Watchdog einstellen
//tu nix und warte auf den Biss des Wachhundes
_delay_ms(5000); // Der Wachhund ist auf eine Sek gestellt. Im Delay sind es 5 Sekunden. - Also Reset
// wdt_reset();
}
}
}
}
//PORTB ^= (1<<LED_PIN); //Toggl
//PORTB &= ~(1<<LED_PIN); // LED aus
//PORTB |= (1<<LED_PIN); // LED einschalten
Attiny13_Einschlaflampe_v01_06_final.c
Hier die akuellen Bilder zum Prototyp der Einschlaflampe. Die verfeinerungen am Code habe ich noch nicht in Angriff genommen.