/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.2 Standard
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 16K_Zuender
Version : 
Date    : 09.01.2007
Author  : Wilhelm Krug                    
Company : 92345 Dietfurt, Germany         
Comments: 


Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <math.h>

/* Portbelegung des ATMEGA 8
PortB,0 = Ausgang 1
PortB,1 = Ausgang 2
PortB,2 = Ausgang 3
PortB,3 = Ausgang 4
PortB,4 = Ausgang 5
PortB,5 = Ausgang 6
PortC,0 = Ausgang 7
PortC,1 = Ausgang 8
PortC,2 = Ausgang 9
PortC,3 = Ausgang 10
PortC,4 = Ausgang 11
PortC,5 = Ausgang 12
PortD,0 = Ausgang 13
PortD,1 = Ausgang 14
PortD,2 = Servoeingang Schrittschaltwerk mit Widerstand gegen Masse und Optokoppler gegen +
PortD,3 = Servoeingang Feuer Servo mit Widerstand gegen Masse und Optokoppler gegen +
PortD,4 = Ausgang 15
PortD,5 = Ausgang 16
PortD,6 = Grüne LED mit Vorwiderstand gegen + und Tastereingang
PortD,7 = Rote LED mit Vorwiderstand gegen + und Programmiereingang
*/
// Declare your global variables here
bit newvalue0=0;
bit newvalue1=0;
volatile unsigned int ui_starttime0,ui_endtime0,ui_value0,ui_starttime1,ui_endtime1,ui_value1;
unsigned char uc_activeport[4]={0,1,2,3};
volatile unsigned int ui_schaltpunkt[9];/* Umschaltpunkte der Ausgangskanäle */
volatile unsigned int ui_fire[2];/* Schaltpunkte des Feuer Kanals */
eeprom unsigned int e_schaltpunkt[9];
eeprom unsigned int e_fire[2];
#asm
    .equ tcnt1l=0x2C
    .equ tcnt1h=0x2D
    .equ PORTB=0x18
    .equ PORTC=0x15
    .equ PORTD=0x12
    .equ PIND=0x10
#endasm



// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char stat=0;
#asm
        push r22                ;Register retten
        in r22,SREG
        push r22
        push r23
        push r24
        push r25
        in r22,tcnt1l             ;Timer 1 auslesen
        in r23,tcnt1h
        in r24,MCUCR           ;Status laden
        bst r24,0               ;Wenn das Bit 0 von "MCUCR" gesetzt ist
        brtc mess1              ;2 ten Messung auslesen und beenden
        sts _ui_starttime0,r22          ;Startwert für Servo 1 abspeichern
        sts _ui_starttime0+1,r23
        in r22,MCUCR            ;MCUCR Register laden
        cbr r22,0b00000011      ;Interruptstatus für INT0 löschen
        sbr r22,0b00000010      ;Interruptstatus auf fallende Flanke einstellen
        out MCUCR,r22
        rjmp endisr0
    
    mess1:    
        sts _ui_endtime0,r22          ;Endwert für Servo 1 abspeichern
        sts _ui_endtime0+1,r23
        lds r24,_ui_starttime0          ;Startwert von Servo 1 holen
        lds r25,_ui_starttime0+1
        sub r22,r24             ;Startwert vom Endwert abziehen
        sbc r23,r25
        sts _ui_value0,r22          ;... das ergiebt den Wert für die Servoimpulslänge Servo 1
        sts _ui_value0+1,r23          ;der wird hier zur Verarbeitung abgespeichert
        in r22,MCUCR            ;MCUCR Register holen
        sbr r22,0b00000011      ;auf INT1 steigende Flanke einstellen
        out MCUCR,r22           ;Den neuen Wert zurückschreiben
    endisr0:
        pop r25                 ;Register zurückholen
        pop r24
        pop r23
        pop r22
        out SREG,r22
        pop r22

#endasm
stat=MCUCR;
stat=stat&0b00000001;
if (stat==1)
    {
    newvalue0=1;
    }
else
    {
    newvalue0=0;
    }    
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
unsigned char stat=0;
#asm
        push r22                ;Register retten
        in r22,SREG
        push r22
        push r23
        push r24
        push r25
        in r22,tcnt1l             ;Timer 1 auslesen
        in r23,tcnt1h
        in r24,MCUCR           ;Status laden
        bst r24,2               ;Wenn das Bit 2 von "MCUCRs" gesetzt ist
        brtc mess2              ;2 ten Messung auslesen und beenden
        sts _ui_starttime1,r22          ;Startwert für Servo 2 abspeichern
        sts _ui_starttime1+1,r23
        in r22,MCUCR            ;MCUCR Register laden
        cbr r22,0b00001100      ;Interruptstatus für INT1 löschen
        sbr r22,0b00001000      ;Interruptstatus auf fallende Flanke einstellen
        out MCUCR,r22
        rjmp endisr1
    
    mess2:    
        sts _ui_endtime1,r22          ;Endwert für Servo 2 abspeichern
        sts _ui_endtime1+1,r23
        lds r24,_ui_starttime1          ;Startwert von Servo 2 holen
        lds r25,_ui_starttime1+1
        sub r22,r24             ;Startwert vom Endwert abziehen
        sbc r23,r25
        sts _ui_value1,r22          ;... das ergiebt den Wert für die Servoimpulslänge Servo 2
        sts _ui_value1+1,r23          ;der wird hier zur Verarbeitung abgespeichert
        in r22,MCUCR            ;MCUCR Register holen
        sbr r22,0b00001100      ;auf INT1 steigende Flanke einstellen
        out MCUCR,r22           ;Den neuen Wert zurückschreiben
    endisr1:
        pop r25                 ;Register zurückholen
        pop r24
        pop r23
        pop r22
        out SREG,r22
        pop r22

#endasm
stat=MCUCR;
stat=stat&0b00000100;
if (stat==4)
    {
    newvalue1=1;
    }
else
    {
    newvalue1=0;
    }    
}
 
//Setup routine zum Einspeichern der Schaltpunkte
void setup(void)
    {
    volatile unsigned int ui_kanal0[8],ui_kanal1[2],ui_teiler,ui_minwert,ui_maxwert,ui_puffer=0x40;
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[0]=ui_value0;
            ui_kanal1[0]=ui_value1;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[1]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;/* LED ein */
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[2]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[3]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[4]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[5]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[6]=ui_value0;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[7]=ui_value0;
            ui_kanal1[1]=ui_value1;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
        
    /* Die Schaltpunkte für Kanal werden berechnet */
    
    ui_schaltpunkt[0]=ui_kanal0[0]-(ui_kanal0[1]-ui_kanal0[0]);
    ui_schaltpunkt[1]=(ui_kanal0[1]+ui_kanal0[0])/2;
    ui_schaltpunkt[2]=(ui_kanal0[2]+ui_kanal0[1])/2;
    ui_schaltpunkt[3]=(ui_kanal0[3]+ui_kanal0[2])/2;
    ui_schaltpunkt[4]=(ui_kanal0[4]+ui_kanal0[3])/2;
    ui_schaltpunkt[5]=(ui_kanal0[5]+ui_kanal0[4])/2;
    ui_schaltpunkt[6]=(ui_kanal0[6]+ui_kanal0[5])/2;
    ui_schaltpunkt[7]=(ui_kanal0[7]+ui_kanal0[6])/2;
    ui_schaltpunkt[8]=ui_kanal0[7]+(ui_kanal0[7]-ui_kanal0[6]);
    
    /* Die Schaltpunkte für Fire werden berechnet */
    ui_minwert=(ui_kanal1[0]<ui_kanal1[1] ? ui_kanal1[0]:ui_kanal1[1]);
    ui_maxwert=(ui_kanal1[0]>ui_kanal1[1] ? ui_kanal1[0]:ui_kanal1[1]);
    ui_teiler=(ui_maxwert-ui_minwert)/4;
    ui_fire[0]=ui_minwert+ui_teiler;
    ui_fire[1]=ui_maxwert-ui_teiler;
    
    /* Die Werte ins EEPROM schreiben */
    #asm ("CLI");
    e_schaltpunkt[0]=ui_schaltpunkt[0];
    e_schaltpunkt[1]=ui_schaltpunkt[1];
    e_schaltpunkt[2]=ui_schaltpunkt[2];
    e_schaltpunkt[3]=ui_schaltpunkt[3];
    e_schaltpunkt[4]=ui_schaltpunkt[4];
    e_schaltpunkt[5]=ui_schaltpunkt[5];
    e_schaltpunkt[6]=ui_schaltpunkt[6];
    e_schaltpunkt[7]=ui_schaltpunkt[7];
    e_schaltpunkt[8]=ui_schaltpunkt[8];
    
    e_fire[0]=ui_fire[0];
    e_fire[1]=ui_fire[1];
    
    delay_ms(1000);
    DDRD=0x33;
    #asm ("SEI");
    
    }

//Setup routine zum Einspeichern der Schaltpunkte
void old_setup(void)
    {
    volatile unsigned int ui_kanal0[2],ui_kanal1[2],ui_teiler,ui_minwert,ui_maxwert,ui_puffer=0x40;
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[0]=ui_value0;
            ui_kanal1[0]=ui_value1;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;
    PORTD=0x00;
    delay_ms(1000);
    DDRD=0x33;
    ui_puffer=0x40;
    while (ui_puffer==0x40)
        {
        while (newvalue0==1&&newvalue1==1)/*Nur bei neuen Werten durchlaufen*/
            {
            newvalue0=0;
            newvalue1=0;
            ui_kanal0[1]=ui_value0;
            ui_kanal1[1]=ui_value1;
            }
        ui_puffer=PIND&0x40; /*Ausführen bis Taster gedrückt wird*/
        }
    DDRD=0x73;/* LED ein */
    PORTD=0x00;
    /* Die Schaltpunkte für Kanal werden berechnet */
    ui_minwert=(ui_kanal0[0]<ui_kanal0[1] ? ui_kanal0[0]:ui_kanal0[1]);
    ui_maxwert=(ui_kanal0[0]>ui_kanal0[1] ? ui_kanal0[0]:ui_kanal0[1]);
    ui_teiler=(ui_maxwert-ui_minwert)/14;
    ui_schaltpunkt[0]=ui_minwert-ui_teiler;
    ui_schaltpunkt[1]=ui_minwert+ui_teiler;
    ui_schaltpunkt[2]=ui_minwert+(ui_teiler*3);
    ui_schaltpunkt[3]=ui_minwert+(ui_teiler*5);
    ui_schaltpunkt[4]=ui_minwert+(ui_teiler*7);
    ui_schaltpunkt[5]=ui_maxwert-(ui_teiler*5);
    ui_schaltpunkt[6]=ui_maxwert-(ui_teiler*3);
    ui_schaltpunkt[7]=ui_maxwert-ui_teiler;
    ui_schaltpunkt[8]=ui_maxwert+ui_teiler;
    
    /* Die Schaltpunkte für Fire werden berechnet */
    ui_minwert=(ui_kanal1[0]<ui_kanal1[1] ? ui_kanal1[0]:ui_kanal1[1]);
    ui_maxwert=(ui_kanal1[0]>ui_kanal1[1] ? ui_kanal1[0]:ui_kanal1[1]);
    ui_teiler=(ui_maxwert-ui_minwert)/4;
    ui_fire[0]=ui_minwert+ui_teiler;
    ui_fire[1]=ui_maxwert-ui_teiler;
    
    /* Die Werte ins EEPROM schreiben */
    #asm ("CLI");
    e_schaltpunkt[0]=ui_schaltpunkt[0];
    e_schaltpunkt[1]=ui_schaltpunkt[1];
    e_schaltpunkt[2]=ui_schaltpunkt[2];
    e_schaltpunkt[3]=ui_schaltpunkt[3];
    e_schaltpunkt[4]=ui_schaltpunkt[4];
    e_schaltpunkt[5]=ui_schaltpunkt[5];
    e_schaltpunkt[6]=ui_schaltpunkt[6];
    e_schaltpunkt[7]=ui_schaltpunkt[7];
    e_schaltpunkt[8]=ui_schaltpunkt[8];
    
    e_fire[0]=ui_fire[0];
    e_fire[1]=ui_fire[1];
    
    delay_ms(1000);
    DDRD=0x33;
    #asm ("SEI");
    }

//Routine zum Einschalten der Ports
void setports (void)
    {
    volatile unsigned char uc_active=0;
    /* Feuer Bank 0 */
    if (ui_value1<ui_fire[0])
        {
        uc_active=1;
        if (ui_value0>ui_schaltpunkt[0]&&ui_value0<ui_schaltpunkt[1])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=1;   
            }
         if (ui_value0>ui_schaltpunkt[1]&&ui_value0<ui_schaltpunkt[2])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=2;   
            }   
         if (ui_value0>ui_schaltpunkt[2]&&ui_value0<ui_schaltpunkt[3])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=3;   
            }   
         if (ui_value0>ui_schaltpunkt[3]&&ui_value0<ui_schaltpunkt[4])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=4;   
            }   
         if (ui_value0>ui_schaltpunkt[4]&&ui_value0<ui_schaltpunkt[5])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=5;   
            }   
         if (ui_value0>ui_schaltpunkt[5]&&ui_value0<ui_schaltpunkt[6])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=6;   
            }   
          if (ui_value0>ui_schaltpunkt[6]&&ui_value0<ui_schaltpunkt[7])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=7;   
            }  
         if (ui_value0>ui_schaltpunkt[7]&&ui_value0<ui_schaltpunkt[8])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=8;   
            }   
      }
      /* Feuer Bank 1 */ 
      if (ui_value1>ui_fire[1])
        {
        uc_active=2;
        if (ui_value0>ui_schaltpunkt[0]&&ui_value0<ui_schaltpunkt[1])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=9;   
            }
        if (ui_value0>ui_schaltpunkt[1]&&ui_value0<ui_schaltpunkt[2])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=10;   
            }   
        if (ui_value0>ui_schaltpunkt[2]&&ui_value0<ui_schaltpunkt[3])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=11;   
            }   
        if (ui_value0>ui_schaltpunkt[3]&&ui_value0<ui_schaltpunkt[4])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=12;   
            }   
        if (ui_value0>ui_schaltpunkt[4]&&ui_value0<ui_schaltpunkt[5])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=13;   
            }   
        if (ui_value0>ui_schaltpunkt[5]&&ui_value0<ui_schaltpunkt[6])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=14;   
            }   
        if (ui_value0>ui_schaltpunkt[6]&&ui_value0<ui_schaltpunkt[7])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=15;   
            }  
        if (ui_value0>ui_schaltpunkt[7]&&ui_value0<ui_schaltpunkt[8])
            {
            uc_activeport[3]=uc_activeport[2];
            uc_activeport[2]=uc_activeport[1];
            uc_activeport[1]=uc_activeport[0];
            uc_activeport[0]=16;   
            }   
       }
    if (uc_active==0)/* Alle Ports aus */
        {
        PORTB=0b00000000;
        PORTC=0b00000000;
        PORTD=0b10000000;/*Rote LED aus*/
        }
    else
        {
        PORTB=0b00000000;
        PORTC=0b00000000;
        PORTD=0b00000000;/*Rote LED ein*/
        /* Es muss 4x der gleiche Port aktiv sein um eine Fehlzündung zu vermeiden (Fehlerkorrektur) */
        if (uc_activeport[0]==uc_activeport[1]&&uc_activeport[0]==uc_activeport[2]&&uc_activeport[0]==uc_activeport[3])
            {    
            switch (uc_activeport[0])
                {
                case 1:
                #asm ("SBI PORTB,0");
                break;
                case 2:
                #asm ("SBI PORTB,1");
                break;
                case 3:
                #asm ("SBI PORTB,2");
                break;
                case 4:
                #asm ("SBI PORTB,3");
                break;
                case 5:
                #asm ("SBI PORTB,4");
                break;
                case 6:
                #asm ("SBI PORTB,5");
                break;
                case 7:
                #asm ("SBI PORTC,0");
                break;
                case 8:
                #asm ("SBI PORTC,1");
                break;
                case 9:
                #asm ("SBI PORTC,2");
                break;
                case 10:
                #asm ("SBI PORTC,3");
                break;
                case 11:
                #asm ("SBI PORTC,4");
                break;
                case 12:
                #asm ("SBI PORTC,5");
                break;
                case 13:
                #asm ("SBI PORTD,0");
                break;
                case 14:
                #asm ("SBI PORTD,1");
                break;
                case 15:
                #asm ("SBI PORTD,4");
                break;
                case 16:
                #asm ("SBI PORTD,5");
                break;
                }   
            }       
        }          
   }   
    




void main(void)
{
// Declare your local variables here
unsigned char uc_portbuffer=0;
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0x3F;

// Port C initialization
// Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTC=0x00;
DDRC=0x3F;

// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out 
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=0 State0=0 
PORTD=0xC0;
DDRD=0x33;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
GICR|=0xC0;
MCUCR=0x0F;
GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Schaltpunkte aus dem EEPROM holen
ui_schaltpunkt[0]=e_schaltpunkt[0];
ui_schaltpunkt[1]=e_schaltpunkt[1];
ui_schaltpunkt[2]=e_schaltpunkt[2];
ui_schaltpunkt[3]=e_schaltpunkt[3];
ui_schaltpunkt[4]=e_schaltpunkt[4];
ui_schaltpunkt[5]=e_schaltpunkt[5];
ui_schaltpunkt[6]=e_schaltpunkt[6];
ui_schaltpunkt[7]=e_schaltpunkt[7];
ui_schaltpunkt[8]=e_schaltpunkt[8];

ui_fire[0]=e_fire[0];
ui_fire[1]=e_fire[1];
// Global enable interrupts
#asm("sei")

/* Wenn PORTD,7 = 0 dann ins setup menü */
      uc_portbuffer=PIND&0b10000000;/*Port B,7 ausfiltern*/
      if (uc_portbuffer==0)
            {
            setup();
            }
/* Warten bis Setup Brücke entfernt ist */
/* Deaktiviert
uc_portbuffer=0;
while (uc_portbuffer==0x00)
    {
    uc_portbuffer=PIND&0b100000000;
    }
delay_ms(100); */

DDRD=0xB3;
PORTD=0b11000000;
/* Hauptprogramm */
while (1)
      {
      if (newvalue0==1&&newvalue1==1)/*Nur ausführen bei neuen Werten */
            {
            newvalue0=0;
            newvalue1=0;
            /* Servoimpulslängen auf <0,65ms und >2500ms testen, das wären Fehler */
            if(ui_value0>650&&ui_value0<2500&&ui_value1>650&&ui_value1<2500)
                {
                setports();
                }
            }
      
      }
}
