#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h> //Datei interrupt.h einbinden
#include <util/delay.h>
ISR(TIMER1_COMPA_vect) //Interrupt service routine wenn Vergleichswert erreicht ist
{
static uint16_t swTeiler = 0; //Deklarieren von swTeiler
swTeiler++; //Zählschritt einstellen
if (swTeiler == 30) //Wert bis Interrupt ausgelöst wird
{
swTeiler = 0; //Teiler wieder auf 0 setzen
PORTD |= (1<<PD6); //PortD Strom an
TCCR1B |= (1<<WGM12) | (1<<CS12);
TIMSK |= (1<< OCIE1B);
OCR1B = 3094;
sei();
}
}
ISR (TIMER1_COMPB_vect)
{
static uint8_t vTeiler = 0;
vTeiler++;
if (vTeiler == 4)
{
vTeiler = 0;
PORTD &= ~(1<<PD6);
}
}
int main (void)
{
DDRD |= (1<<PD6); //PD6 als Ausgang deklarieren
//Timer konfigurieren
TCCR1B |= (1<<WGM12) | (1<<CS12); //CTC-Mode und Vorteiler auswählen
//Tabelle
TIMSK |= (1<<OCIE1A); //Timer1 auswählen (Output Compare A Match Interrupt Enable
//Interrupt aufrufen, wenn der Vergleichswert erreicht ist
//Tabelle
OCR1A = 3906; //Vergleichswert zur bestimmung einer Sekunde
//Interrupts aktivieren
sei();
int i = 0; //Schleifenvariable deklariert
while(i<2) //Zwei mal wird die Schleife durchlaufen
{
//Zu beginn des Programmstarts, sollen 2 Schmierungen druchgeführt werden
i++;
PORTD |= (1<<PD6);
_delay_ms(3000); //Schmierzeit
PORTD &= ~(1<<PD6);
_delay_ms(3000); //Untebrechung der Schmierung
}
while(1)
{
}
}
Lesezeichen