#include #include #include #include #include volatile char direction_rotation = 0; volatile int increments_backward = 0; volatile int increments_forward = 0; double angle_forward = 0; double angle_backward = 0; double degrees_per_increment = 1.40625; char Buffer[20]; void Send_UART(char data[]) //Funktion zur Ausgabe eines Strings (Ausgabe) { while(!(USARTC0.STATUS & USART_DREIF_bm)); int Counter = 0x00; int lenght = 0x00; lenght = strlen(data); //Länge des Strings in Variable lenght speichern while(Counter < lenght) //Vergleichen ob Counter kleiner ist als die Länge des Strings { while (!(USARTC0.STATUS & USART_DREIF_bm)); //Kontrollieren ob USART-Register leer ist / Daten ausgegeben USARTC0.DATA = data[Counter]; //Ausgabe des Zeichen an Position "Counter" des Strings Counter++; //Hochzählen um nächste mal das nächste Zeichen auszugeben } Counter = 0x00; //Counter Null setzen wenn der komplette String ausgegeben wurde } int main(void) { itoa (increments_backward, Buffer, 10); //Umwandlung der Zahl in String!! PORTD.DIR &= ~(1<<0); //Port D0 Eingang für Interrupt (Kanal_A) PORTD.DIR &= ~(1<<1); //Port D1 Eingang für Kanal_B PORTC.DIR &= ~(1<<2); //Pin 3 RX Eingang PORTC.DIR |= (1<<3); //Pin 4 TX Ausgang //Interrupts aktivieren PORTD.INT0MASK = 0xff; //Interrupt 0 auf PD0 PORTD_PIN0CTRL |= PORT_ISC_RISING_gc; // PORTD_INTCTRL |= PORT_INT0LVL_HI_gc; //Int0 Hohe Priorität zuweisen PMIC.CTRL |= PMIC_HILVLEN_bm |PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm; sei(); USARTC0.BAUDCTRLB = 0; //BSCALE 0 USARTC0.BAUDCTRLA = 0x0C; //BSEL = 207 entspricht baud 9600..Berechnet mit 2 MHz USARTC0.CTRLB |= USART_TXEN_bm | USART_RXEN_bm; USARTC0.CTRLC |= USART_CHSIZE_8BIT_gc; //maximal 8-Bit Eingabe while (1) { Send_UART(Buffer); } } ISR(PORTD_INT0_vect) { direction_rotation = PORTD.IN; if(direction_rotation & 0x01){ //Beide Flanken High increments_forward++; //Hochzählen vorwärts } else if(!(direction_rotation & 0x01)){ //Kanal B Low und Kanal A High increments_backward++; } }