also ich hab mir die zeit genommen. Vorausgeschickt - es funktioniert nur wenn am echo-pin (ICS) umgesteckt wird. Aber es kann durchaus an meinen programmierkünsten liegen. Von den timern verstehe ich nämlich immer noch wenig bis nix...
folgendes habe ich jetzt gemacht:
die funktionen um PC5 und PC6 erweitert:
die variablen im hauptprogramm:Code:/********************* ULTRASCHALL & HC-SR-04 ******************************/ uint16_t distanz_PC5 = 0; volatile uint16_t zeit_PC5 = 0; volatile uint16_t timestamp_last_PC5 = 0; uint16_t distanz_PC6 = 0; volatile uint16_t zeit_PC6 = 0; volatile uint16_t timestamp_last_PC6 = 0; ISR(TIMER1_CAPT_vect) { //Wenn steigende Flanke if(TCCR1B & (1<<ICES1)) { //Flankenerkennung auf fallend TCCR1B ^= (1<<ICES1); //aktuelen timer-wert speichern timestamp_last_PC5 = ICR1; timestamp_last_PC6 = ICR1; } //fallende Flanke else { //Flankenerkennung auf steigend TCCR1B ^= (1<<ICES1); //Laufzeit = aktueller timerwert - vorheriger timerwert zeit_PC5 = ICR1 - timestamp_last_PC5; zeit_PC6 = ICR1 - timestamp_last_PC6; } } /*************** trig ***************************/ void trig_PC5(void) { PORTC |= (1<<PC5);//Trig high _delay_us(12); PORTC &= ~(1<<PC5);//TRIG auf low } void trig_PC6(void) { PORTC |= (1<<PC6);//Trig high _delay_us(12); PORTC &= ~(1<<PC6);//TRIG auf low } /***************** messung_SR_04 ********************/ void messung_SR_04_PC5 (void) { DDRC |= (1 << PC5);//Trig als Ausgang PORTC &= ~(1<<PC5);//TRIG auf low DDRD &= ~(1<<PD6);//Echo als Eingang PORTD &= ~(1<<PD6);//ECHO pullup AUS //Timer konfigurieren TCCR1A = 0; // normal mode, keine PWM Ausgänge //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64 TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10); //ICP Interrupt aktivieren TIMSK |= (1<<TICIE1); //Globale Interrupts aktivieren sei(); distanz_PC5 = (zeit_PC5*4)/58; } void messung_SR_04_PC6 (void) { DDRC |= (1 << PC6);//Trig als Ausgang PORTC &= ~(1<<PC6);//TRIG auf low DDRD &= ~(1<<PD6);//Echo als Eingang PORTD &= ~(1<<PD6);//ECHO pullup AUS //Timer konfigurieren TCCR1A = 0; // normal mode, keine PWM Ausgänge //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64 TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10); //ICP Interrupt aktivieren TIMSK |= (1<<TICIE1); //Globale Interrupts aktivieren sei(); distanz_PC6 = (zeit_PC6*4)/58; }
Code:extern volatile uint16_t zeit_PC5, zeit_PC6; extern uint16_t distanz_PC5, distanz_PC6;
und das ist die eigentliche abfrage:
Code:case 2:// setLEDs(0b0010); writeString_P("\n\n HC-SR-04 PC5_trig & PC6_trig\n\n"); writeChar('\n'); initRP6Control(); multiio_init(); initLCD(); setCursorPosLCD(1, 0); writeStringLCD("HC-SR04 messung"); mSleep(1500); while(1) { //Messung starten messung_SR_04_PC5 (); mSleep(100); //Signal auslösen trig_PC5(); _delay_ms(50); //Werte ausgeben writeString("zeit_PC5: "); writeIntegerLength(zeit_PC5, DEC, 4); writeString(" distanz_PC5: "); writeIntegerLength(distanz_PC5, DEC, 4); writeChar('\n'); mSleep(2000); //Messung starten messung_SR_04_PC6 (); mSleep(100); //Signal auslösen trig_PC6(); _delay_ms(50); //Werte ausgeben writeString("zeit_PC6: "); writeIntegerLength(zeit_PC6, DEC, 4); writeString(" distanz_PC6: "); writeIntegerLength(distanz_PC6, DEC, 4); writeChar('\n'); mSleep(2000); /**************************/ uint8_t key_1 = getMultiIOPressedButtonNumber(); key_1 = getMultiIOPressedButtonNumber(); if(key_1 != 0) break; /**************************/ } break;






Zitieren


Lesezeichen