ja Du hast recht da meckert er
Ich habe das jetzt mal so gemacht
Code:
#include "RP6ControlLib.h"
/*****************************************************************************/
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;
}
}
/*****************************************************************************/
void HCSR04_vorn (void)
{
// Messung
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;
mSleep(100);
// Trig
PORTC |= (1<<PC5);//Trig high
_delay_us(12);
PORTC &= ~(1<<PC5);//TRIG auf low
_delay_ms(50);
//Werte ausgeben
writeString("zeit_PC5: ");
writeIntegerLength(zeit_PC5, DEC, 4);
writeChar('\n');
writeString("distanz_PC5: ");
writeIntegerLength(distanz_PC5, DEC, 4);
writeChar('\n');
mSleep(2000);
}
/*****************************************************************************/
void HCSR04_hinten (void)
{
// Messung
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;
mSleep(100);
// Trig
PORTC |= (1<<PC6);//Trig high
_delay_us(12);
PORTC &= ~(1<<PC6);//TRIG auf low
_delay_ms(50);
//Werte ausgeben
writeString("zeit_PC6: ");
writeIntegerLength(zeit_PC6, DEC, 4);
writeChar('\n');
writeString("distanz_PC6: ");
writeIntegerLength(distanz_PC5, DEC, 4);
writeChar('\n');
mSleep(2000);
}
/*****************************************************************************/
void taster_M32(void)
{
uint8_t key = getPressedKeyNumber();
if(key)
{
while(getPressedKeyNumber());
switch(key)
{
case 1:
setLEDs(0b0001);
HCSR04_vorn();
break;
case 2:
setLEDs(0b0010);
HCSR04_hinten();
break;
}
}
}
/*****************************************************************************/
int main(void)
{
initRP6Control();
while(true)
{
taster_M32();
}
return 0;
}
Versuchs mal so, testen kann ich ja leider noch nicht. Es ist fast der gleiche Code nur eben alles eingepackt in der Funktion.
Bei den globalen Interrupts könnte man am ende noch ein cli() setzen um den Interrupt wieder zu stoppen und den Timer Interrupt könnte man auch stoppen. Aber mir fehlt da jede Menge Wissen um da hinter zu steigen wie das alles genau funktioniert. Was mich aber jetzt schon Nervt ist das ich 3 meiner Kostbaren Ports weg geben soll. Ab gesehen vom unschlagbaren Preis wäre die SRF?? Sensoren da besser. Ran an den Bus und fertig.
Lesezeichen