hier ist der code:
vielen dank für deine mühe.Code:#include <inttypes.h> #include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <string.h> #include <delay.c> // das unterprogramm warte #include <stdint.h> #define READ 1 #define WRITE 2 #define USART_BAUD_RATE 19200 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1) #define US_PORT PORTD #define US_PORT_RICHTUNG DDRD #define US_PIN PD7 // Der Pin kommt zum Trigger-Puls Eingang void usart_init(int Enable, int Interupts) { if (Enable & READ) UCSRB = (1<<RXEN); if (Enable & WRITE) UCSRB |= (1<<TXEN); if (Interupts & READ) UCSRB |= (1<<RXCIE); if (Interupts & WRITE) UCSRB |= (1<<TXCIE); UBRRL = (unsigned char) USART_BAUD_SELECT; } void usart_writeChar(unsigned char c) { while (!(UCSRA & (1<<UDRE))) {} UDR = c; while(!(UCSRA & (1<<TXC))) {} } void usart_writeString(unsigned char *string) { while (!(UCSRA & (1<<UDRE))) {} while ( *string) usart_writeChar(*string++); } uint8_t start_messung(void) { uint8_t wert ; //wert_in_cm; US_PORT|=(1<<US_PIN); // Trigger-Puls auf high // PD6 ist Input Capture Pin beim ATMega8, hier kommt der Echo-Pulse Ausgang hin TIMSK|= (1<<TICIE1); // Input Capture Interrupt enable TCCR1B|= (1<<CS11); // Prescaler 8, damit dauert ein Tackt 1 micro sekunden _delay_us(15); // Laut Datenblatt Trigger-Puls min 10us auf high US_PORT&=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low while ( !(TIFR & (1<<ICF1 )) ) ; // Warten bis Echo-Puls Ausgang auf low --> Messung beendet wert=172*ICR1/10000; // wert ist nun in cm TIFR|=(1<<ICF1); // ICF1 Bit wieder löschen durch schreiben einer logischen 1 TCCR1B&= ~(1<<CS12) & ~(1<<CS11) & ~(CS10); // Timer wieder aus return wert; } int main (void) { US_PORT_RICHTUNG|=(1<<US_PIN); // US_PIN auf Ausgang char s[10]; uint8_t wert_1; usart_init( (READ + WRITE) , READ); for (;;) { wert_1=start_messung(); itoa( wert_1, s, 10); usart_writeString(s); usart_writeString("\n\r"); warte(20000); } }
mfg pebisoft






Zitieren

Lesezeichen