/************************************************************************************************************
* Drehimpulsgeber (Optisch) *
* __________________________________ *
* *
* - Auswerten eines Drehimpulsgeber´s (Drehencoder) *
* *
* *
* MRL - 20 C (ohne Taster) *
* *
* Beschreibung : *
* Phase_A wird auf INT0 gelegt und INT0 wird auf "fallende Flanke" *
* eingestellt. In der ISR von INT0 wird der aktuelle Status von "Phase_B" *
ausgewertet! Die Drehrichtung wird in der Variable "Drehrichtung" gepeichert * *
************************************************************************************************************/
#define F_CPU 16000000
#define Phase_A ((PIND & (1<<PIND6))) // Phase A
#define Phase_B ((PIND & (1<<PIND4))) // Phase B
#define LINKS_AN PORTB |= (1<<PD0)
#define RECHTS_AN PORTB |= (1<<PD1)
#define HIGH_POWER_ROT_AN PORTD |= (1<<PD0)
#define HIGH_POWER_ROT_AUS PORTD &= ~(1<<PD0)
#define HIGH_POWER_GRUEN_AN PORTB |= (1<<PB6)
#define HIGH_POWER_GRUEN_AUS PORTB &= ~(1<<PB6)
#define HIGH_POWER_GRUEN_TOGGLE PORTB ^= (1<<PB6)
#define LINKS_AUS PORTB &= ~(1<<PD0)
#define RECHTS_AUS PORTB &= ~(1<<PD1)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t Drehrichtung;
volatile uint8_t Counter;
int main(void)
{
PORTD |= ((1<<PD4) | (1<<PD6)); // PullUp´s aktivieren
DDRB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7)); // Ausgänge für LED´s
DDRD |= (1<<PD0);
MCUCR |= (1<<ISC01); // INT0 Sense auf fallende Flanke einstellen
GICR |= (1<<INT0); // INT0 Interrupt Enable
sei();
while(1)
{
switch (Drehrichtung)
{
case 1:
{
LINKS_AN;
HIGH_POWER_GRUEN_AN;
_delay_ms(100);
LINKS_AUS;
HIGH_POWER_GRUEN_AUS;
Drehrichtung = 3;
}
break;
case 2:
{
RECHTS_AN;
HIGH_POWER_ROT_AN;
_delay_ms(100);
RECHTS_AUS;
HIGH_POWER_ROT_AUS;
Drehrichtung = 3;
}
break;
} // Ende switch (Drehrichtung)
if (Counter >= 30)
{
HIGH_POWER_GRUEN_AN;
HIGH_POWER_ROT_AUS;
}
if (Counter <= 1)
{
HIGH_POWER_ROT_AN;
HIGH_POWER_GRUEN_AUS;
}
} // Ende while(1)
} // Ende Main
ISR (INT0_vect)
{
if (Phase_B)
{
Drehrichtung = 1;
Counter = Counter + 1;
}
if (Phase_A)
{
Drehrichtung = 2;
Counter = Counter - 1;
}
}