/*
    Title:    Einschaltverzoegerung
    Author:   Daniel Schramm
    Date:     3/2002
    Purpose:  switch on some device one by one
    needed
    Software: AVR-GCC
    needed
    Hardware: ATS90S2313/mega on selfmade board
    Note:     To contact me, mail to
                  daniel.schramm@gmx.de
*/

#include <io.h>
#include <ina90.h>
#include <interrupt.h>
#include <signal.h>


#define Comuter_1
#define Comuter_2
#define Comuter_3
#define Comuter_4
#define Taster 4
#define LED_Gelb 2
#define LED_Gruen 0


uint16_t time;
uint16_t ready_time;
uint16_t counter;
uint16_t j;
uint8_t	blink;
uint8_t	ready;
uint8_t	i;

const uint16_t Zeiten_Steckdosen[4]={10,20,30,40};
const uint8_t  Pin_Steckdosen[4]={0,3,2,1};
const uint16_t Zeit_Taster=6;


void sleep (void) {
	for (i=0; i<255; i++) {
		asm volatile("nop");
	}
}

void longsleep (void) {
	for (j=0; j<1000; j++) {
		sleep();
	}
}

void init (void) {
	outp (0xff, DDRB);
	outp (0xff, PORTB);
	
	outp (0xff, DDRD);
	outp (0x00, PORTD);

	time=0;
	blink=0;
	ready=0;
	ready_time=0;
	for (i=0; i<4; i++)
		if (ready_time < Zeiten_Steckdosen[i] )
			ready_time = Zeiten_Steckdosen[i];
	if (ready_time < Zeit_Taster )
		ready_time = Zeit_Taster;
	
        outp((1<<TOIE0), TIMSK); /* enable TCNT0 overflow */
        outp(5,   TCCR0);        /* count with cpu clock/1024 */
        outp(0,   TCNT0);        /* reset TCNT0 */
        sei();                   /* enable interrupts */

}

void reset(void) {
	cbi(PORTB,Taster);
	longsleep();
	sbi(PORTB,Taster);
}
	

SIGNAL(SIG_OVERFLOW0)        /* signal handler for tcnt0 overflow interrupt */
{
	counter++;
	if (counter > 15){   /* 8MHz -> 1s */
		counter = 0;
		time++;
		if (blink)
			blink=0;
		else
			blink=1;
		for (i=0; i<4; i++) {
			if (Zeiten_Steckdosen[i] == time)
				sbi(PORTD,Pin_Steckdosen[i]);
		}
		if (Zeit_Taster == time )
			reset();
		if (time > ready_time)
			ready=1;
	}
}

void blink_led(void) {
	if (blink)
		cbi(PORTB,LED_Gelb);
	else
		sbi(PORTB,LED_Gelb);
}


int main(void) {
	init();
	while (!ready) {
		sleep();
		blink_led();
	}
	outp((0<<TOIE0), TIMSK); /* disable TCNT0 overflow */
	sbi(PORTB,LED_Gelb);
	cbi(PORTB,LED_Gruen);
	while (1) {
		longsleep();
	}
}


