Pepisoft weisst du wie ich mich grad freu das der Code endlich Funktioniert \
/
Hier nochmal der Code für beide Funktionen (mit und ohne Input Capture), mit deinen for Warteschleifen und volatile für die Variablen.
Code:
#include <avr/io.h>
#include <avr/delay.h> // F_CPU definiert als 8Mhz
#include <stdint.h>
// Das mit PD1 auf PORTD ist nur ein Beispiel, jeder beliebige Pin kann gewält werden
#define MESS_PORT PORTB
#define MESS_PORT_RICHTUNG DDRB
#define MESS_PIN PINB
#define MESS_BIT PB0 // Echo-Trigger Eingang oder einfach Messeingang
#define US_PORT PORTD
#define US_PORT_RICHTUNG DDRD
#define US_PIN PD7 // Der Pin kommt zum Trigger-Puls Eingang
// Mit Input Capture Pin
uint16_t start_messung_IC(void)
{
volatile uint16_t wert = 0,i,x,x1;
//Timer vorbereiten
TCCR1B &=~(1<<ICES1); // Fallende Flanke für Input Capture
TCNT1 = 0; // Timer1 löschen
US_PORT|=(1<<US_PIN); // Trigger-Puls auf high
for (i=0; i<x; i++) // Ein Durchgang er Schleife dauert bei 8Mhz 0,75us
asm volatile("nop");
US_PORT &=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low
for (i=0; i<x1; i++) // Warten bis 40kHz Ultraschallburst zuende
asm volatile("nop");
TCCR1B |= (1<<CS11); // Prescaler 8, damit dauert ein Tackt 1 micro Sekunde, Timer startet
while ( !(TIFR & (1<<ICF1)));
// Warten bis Input Capture Flag gesetzt ---> Echo-Eingang ist low
if(ICR1 < 20000) // gültiger Bereich (max 18 ms + Reserve )
wert= (unsigned int) (ICR1 / 58); //umrechnen in cm (laut Datenblatt )
TCCR1B &= ~(1<<CS11); // Timer wieder aus
TIFR |= (1<<ICF1); // ICF1 Bit wieder löschen durch schreiben einer logischen 1
return wert;
}
// Zeit/srf04 Messung, beliebige Pins können gewählt werden
uint16_t start_messung(void)
{
volatile uint16_t wert,i,x,x1;
x=14;
x1=267;
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<x; i++) // Ein Durchgang er Schleife dauert bei 8Mhz 0,75us
asm volatile("nop");
US_PORT&=~(1<<US_BIT); // Trigger-Puls Eingang wieder auf low
for (i=0; i<x1; i++)
asm volatile("nop");
// Wenn keine srf04 Messung dann einfach ab hier
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; // Muss bei srf04 Messung noch in cm umgerechnet werden
}
Wegen den eeproms , ich erkundige mich mal und mach vielleicht nen neuen Thread auf. Aber wenn die eeproms die Standard I2C ansteuerung haben ist das ziemlich einfach. Wäre auch ne gelegenheit meine I2C Funktionen (hauptsächlich aus dem Datenblatt) zu testen. Und vielleicht schaffen wirs ja echt noch im laufe der Zeit den kleine Bibliothek zu erstellen.
Gruß Muraad
Lesezeichen