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:
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;
}
die variablen im hauptprogramm:
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;
Lesezeichen