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.
Code:
#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");
}
}
mfg pebisoft
Lesezeichen