ich habe in der make die f_cpu und trotzdem stimmt die zeit der _delay nicht, woran liegt das.
bei meiner selbsterstellten srf04-routine müssen us gewartet werden. mit asm-routinen und for geht es, aber mit der_delay nicht.
mfg pebisoftCode:#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <string.h> #include <stdint.h> #include <avr/delay.h> #define READ 1 #define WRITE 2 #define USART_BAUD_RATE 19200 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1) #define MESS_PORT PORTB #define MESS_PORT_RICHTUNG DDRB #define MESS_PIN PINB #define MESS_BIT PB1 // Echo-Trigger Eingang oder einfach Messeingang #define US_PORT PORTB #define US_PORT_RICHTUNG DDRB #define US_BIT PB0 // 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++); } uint16_t start_messung(void) { volatile uint16_t wert,i; wert=0; US_PORT_RICHTUNG|=(1<<US_BIT); // US_PIN auf Ausgang US_PORT|=(1<<US_BIT); // Trigger-Puls auf high for (i=0; i<10; i++) asm volatile("nop"); US_PORT&=~(1<<US_BIT); // Trigger-Puls Eingang wieder auf low for (i=0; i<200; i++) asm volatile("nop"); TCNT1=0; // Timerregister auf 0 TCCR1B|= (1<<CS11); // Timer starten while (MESS_PIN & (1<<MESS_BIT)) // Warten bis Echo/Mess Eingang auf low wert=TCNT1; TCCR1B&= ~(1<<CS11); // Timer wieder aus return wert; } int main (void) { char s[10]; uint16_t wert_1; usart_init( (READ + WRITE) , READ); for (;;) { wert_1=start_messung(); itoa( wert_1, s, 10); usart_writeString(s); usart_writeString("\r"); } }







Zitieren

Lesezeichen