Hallo zusammen,
ich versuche schon seit einiger Zeit das Ultraschall Interface aus dem RN-Wissenbereich nach zu Bauen. Aber ich bekomme es einfach nicht zumlaufen.
Ich habe erstmal mit Eagle das Layout kopiert, und noch ein paar Veränderungen vor genommen (Verpolungsschutz, Abblockkondensatoren, etc.). Die Kondensatoren C5 und C6 im Layout sollen den Ultraschallsender bzw. -empfänger(beide von Reichelt) darstellen, und der Kondensator L1 die Spule.
Nachdem ich das Board dann erstellt hatte habe ich die Software geschreiben. Doch irgendwie will das Teil nicht funktionieren. Es leuchten immer nur die ersten 6 LEDs, egal wie weit weg oder nah ein Objekt ist. Auch wenn meine Formel zur Entfernungsberechnung falsch ist, müsste das Teil wenigstens etwas dynamik aufweisen.
Hier mein Quellcode:
Ich würde mich sehr freuen wenn jemand mein Problem finden könnte. Ich versuch mich dadran schon seit ein paar Wochen.Code:#include <avr\io.h> #include <avr\interrupt.h> #include <inttypes.h> //---------------------- Globale Variablen -------------------------------------------------------- //------------------------------------------------------------------------------------------------- volatile uint8_t toggle=0; // wenn 1 dann werden 16 Impulse gesendet volatile uint8_t impulse=0; // um 16 Impulse zu senden muss impulse bis 32 laufen volatile uint8_t resived=0; // wenn 1 dann INT0 ausgelöst float length; //---------------------- Initialisierung ---------------------------------------------------------- //------------------------------------------------------------------------------------------------- void init_Timer() { DDRD |= (1<<PD5); // OC1 Ausgang PORTD |= (1<<PD5); // Standart ist High TCCR1A |= (1<<COM1A0); // OC1 wird bei einem Compare Match invertiert (Kein PWM) TCCR1B |= (1<<CS11); // Prescaler: Takt/8 OCR1AL = 25; // Compare Wert: Takt/8/25= 80kHz TIMSK |= (1<<OCIE1A); // Interrupt wenn Vergleichswert erreicht wird TCCR1B |= (1<<3); // Compare Match Modus (CTC1);Timer wird gestartet } void init_Interrupt() { PORTD |= (1<<PD2); // Pull Up für INT0 GIMSK |= (1<<INT0); // INT0 wird als Ext. Interrupt benutzt MCUCR |= (1<<ISC00) | (1<<ISC01); // INT0 reagiert auf steigende Flanke } //---------------------- Interrupts --------------------------------------------------------------- //------------------------------------------------------------------------------------------------- ISR(TIMER1_COMPA_vect) // Compare Match Timer1 { impulse++; } ISR(INT0_vect) // Externer Interrupt INT0 { resived=1; //PORTC ^= (1<<PC7); } //---------------------- Unterprogramm ------------------------------------------------------------ //------------------------------------------------------------------------------------------------- void Target() { length=((impulse-64)*12.5)*0.33; if (length>200) PORTC &= ~(1<<PC0); //LED an else PORTC |= (1<<PC0); //LED aus if (length>300) PORTC &= ~(1<<PC1); //LED an else PORTC |= (1<<PC1); //LED aus if (length>400) PORTC &= ~(1<<PC2); //LED an else PORTC |= (1<<PC2); //LED aus if (length>500) PORTC &= ~(1<<PC3); //LED an else PORTC |= (1<<PC3); //LED aus if (length>600) PORTC &= ~(1<<PC4); //LED an else PORTC |= (1<<PC4); //LED aus if (length>700) PORTC &= ~(1<<PC5); //LED an else PORTC |= (1<<PC5); //LED aus if (length>800) PORTC &= ~(1<<PC6); //LED an else PORTC |= (1<<PC6); //LED aus if (length>900) PORTC &= ~(1<<PC7); //LED an else PORTC |= (1<<PC7); //LED aus } //---------------------- Hauptprogramm ------------------------------------------------------------ //------------------------------------------------------------------------------------------------- int main() { DDRC = 0xFF; //Ausgang PORTC = 0xFF; //Alle LEDs aus init_Interrupt(); init_Timer(); sei(); while(1) { if(impulse==32) { toggle=TCCR1A; TCCR1A= 0x00; //Invertierung wird gestoppt // Empfangen while( !(resived==1) && (impulse<250) ) ; // PORTC = 0xFF; //PORTC alles AUS resived=0; Target(); impulse=0; TCCR1A=toggle; //Invertierung wird gestartet } } return 0; }
Danke schön
NemesisoD







Zitieren

Lesezeichen