#define F_CPU 3686400UL // CPU Takt, externer Quarz #define BAUD 9600 // Baudrate = 9600 #include // Einbinden der Bib In/Out #include // Einbinden der Bib Delay #include // Einbinden der Bib StandardInteger #include // Einbinden der Bib Interrupt // Variablendeklaration "Datentypen" ------------------------------------------------------------------------------- uint16_t position_Y; // Variable für Sensor ADC char puffer[10]; // Deklaration des Sendepuffers volatile uint16_t Schritte; // Variable für Schritte des Schrittmotors Y-Achse // UART Initialisierung ============================================================================================ void initUART() { UBRRL = 23; //9600Baud siehe Baudratentabelle UCSRB = 0x08; //Sender enable UCSRB / UCR bei z.B.: 2313 } //------------------------------------------------------------------------------------------------------------------ void uartPutChar(char data) { //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313 while (!(UCSRA&32)); //sende UDR=data; } //------------------------------------------------------------------------------------------------------------------ void print(const char buffer[]) { for (int i=0;buffer[i]!=0;i++) uartPutChar(buffer[i]); } //================================================================================================================== // Timer1 Interupt Taktgenerator =================================================================================== ISR(TIMER1_COMPA_vect) { static uint8_t Cnt; // Counter Takt 1 // Counter hochzählen mit 1ms Takt ----------------------------------------------------------------------------- Cnt++; // ------------------------------------------------------------------------------------------------------------- if (Cnt == 100) // Takt = 100ms = 0,1s { PORTB ^= _BV(PB5); // Pin B5 invertieren bei jeden Aufruf Cnt = 0; } if( Schritte > 0 ) // Schritte gibt Anzahl an Steps vor { Schritte--; // Zähle Schritte runter PORTD ^= _BV(PD7); // Pin D7 => 18, invertieren bei jeden Aufruf } } // Timer1 Einstellungen -------------------------------------------------------------------------------------------- void initTimer(void) { TCCR1B = 0x01; // Teiler 1/1 TCCR1B |= _BV(WGM12); // Modus: Zählen bis Vergleichswert OCR1A = 3686; // Vergleichswert speichern TIMSK |= _BV(OCIE1A); // Interrupt bei Vergleichswert /* Gewünschte Zeit: 1ms Verwendeter Prescaler: 1 (3,6864 MHz / ( 1kHz * 1 )) -1 = 3685,4 -> 3686 Vergleichswert = 3686 */ } //================================================================================================================== int main () { // Portdeklaration ------------------------------------------------------------------------------------------------- DDRB = 0b11111111; // Datenrichtung PORTB = AUSGANG DDRD = 0b11111111; // Datenrichtung PORTD = AUSGANG DDRC &= ~(1<<4); // Taster 1 PORTC |= (1<<4); DDRC &= ~(1<<5); // Taster 2 PORTC |= (1<<5); initTimer(); // Timer1 Initialisierung initUART(); // UART Initialisierung while(1) // Endlosschleife { if (bit_is_clear(PINC,4)) { cli(); Schritte = 100; // Motor Schritte = Schritte/2 _delay_ms( 200 ); sei(); } print("Hallo myAVR! \n "); } // Ende while(1) } // Ende main //==================================================================================================================