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.
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.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 }
Gruß Muraad







Zitieren

Lesezeichen